IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Probleme d'affichage incomprehensible


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Par défaut Probleme d'affichage incomprehensible
    Bonjour petite communauté!

    Je me tourne vers vous en cette "belle" journée pour vous soumettre un problème qui semble illogique... pour tous ceux à qui j'ai posée la question...

    Pour mes études, je doit realiser un projet, un puissance 4 en C. Jusque là, tout va bien.

    Toutefois, certaine regles sont imposées:

    -2 variables globales ( ... ) -Un tableau a deux dimensions 6x7 d'entier appelé grille definissant une configuration du jeu
    -Un tableau de 6 entiers appelé remplissage definissant l'état de remplissage de chaque colonne.

    -Une fonction dansGrille(int x, int y) qui prend 2 entiers x et y et renvoie vrai s'il existe une case de coordonnées (x,y) dans la grille

    -Une fonction jouable(int x) qui renvoie vrai s'il est possible de poser un jeton dans la colonne x.

    -Une fonction saisirCoup() qui demande de saisir un numero de colonne jusqu'a ce que celui ci soit valide puis retourne ce numero.

    -Une fonction afficherGrille() qui affiche la grille en mode texte.
    ( Espace pour les cases vides, O et X pour les jetons des joueurs.

    -Le programme main() qui permet d'initialiser la grille et de faire jouer les joueurs (et afficher la grille)

    -Une fonction estRemplieOuNon() qui renvoie vrai si la grille est pleine (faux si non...)

    Le reste, pour l'instant peu importe.

    J'ai donc un problème pour le positionnement des jetons...
    Voilà mon code brut:





    Code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
     
     
    //initialisation des bibliotheques necessaire au preprocesseur pour compiler le programme.
    #include <stdio.h>
    #include <stdlib.h>
     
     
    //Declarations des variables globales (beurkkkkkk!!!!!!)
    int grille[6][7];//le tableau grille garde en memoire les coups joués (caractere "X" pour le premier joueur et "O" pour le second; " " pour les case vide.
    int remplissage[6];//remplissage defini le nombre de case restante dans une colonne donnée. remplissage[]=0 <=> la colonne est pleine. Initialement, remplissage[]=6
     
    // prototypes des fonctions. permet au programme principal main() de trouver les fonctions suivantes même si celles-ci sont placées en aval (aprés).
    int dansGrille(int x, int y);
    int jouable(int x);
    int saisirCoup();
    int afficherGrille();
    int estRemplieOuNon();
    int adjacent(int c, int l, int dirV, int dirH);
    int partieEstGagneeOuPas(int c, int l);
     
     
     
    int main()
    {
     
        //declaration et initialisation des variables du programme main()
        int x, y, colonneDemandee, ligneDemandee, colonneJouee, ligneJouee;
        int numeroMatch = 1, victoireJ1 = 0, victoireJ2 = 0, aQuiLeTour=1;
        char nomJ1[100], nomJ2[100];
        char rejouerUnePartie;
     
        //Initialisation des variables globales
        for (x=0; x<=6; x++)
        {
            remplissage[x]=6;    //initialisation du tableau remplissage. Initialement il y a 6 cases vides dans chaque colonne.
            for (y=0; y<=5; y++)
            grille[x][y]=32;    /*initialisation du tableau grille (met toutes les cases a "libre").
                                32 est le nombre pour lequel le caractere "espace" apparaitra lors de l'affichage de la grille*/
        }
     
        //Debut du programme
        printf("*******           Projet Puissance 4           ******** \n\t\t\t\t by X. \n\n");
        printf("Bonjour, veuillez entrez le nom du premier joueur:   ");
        scanf("%s", nomJ1);
        printf("Veuillez a present entrez le nom du second joueur:   ");
        scanf("%s", nomJ2);
        system("cls");
        printf("Match numero %d\n", numeroMatch);
        printf("          Victoires\n%s: %d                     %s:%d\n\n", nomJ1, victoireJ1, nomJ2, victoireJ2);
     
        do  {
            afficherGrille();
            //Au joueur 1 de jouer
            do  {
                printf("Joueur 1:\n");//renseigne les joueurs sur la personne devant jouer.
                colonneDemandee=saisirCoup(); //Le numero de colonne valide (verifié par la fonction saisirCoup) est stocké dans la variable "colonneDemandee".
                }
            while (jouable(colonneDemandee)!=1); // condition inversée! redemandera au joueur de rentrer un numero de colonne jusqu'a ce que celui ci soit valide et validé par la fonction jouable.
     
            ligneDemandee=remplissage[colonneDemandee];
            grille[colonneDemandee][ligneDemandee]='X'; // Une fois que la colonne et la ligne choisis sont valides, on place le caractere specifique au joueur dans la grille.
     
            remplissage[colonneDemandee]=remplissage[colonneDemandee]-1; // On met a jour le tableau remplissage en enlevant la case pris par le pion joué
     
            if (partieEstGagneeOuPas(colonneJouee, ligneJouee)==0)
            {
     
            //Au joueur 2 de jouer
            do  {
                system("cls");
                afficherGrille();
                printf("Joueur 2:\n");
                colonneDemandee=saisirCoup();
                }
            while (jouable(colonneDemandee)!=1);
            grille[colonneDemandee][remplissage[colonneDemandee]]='O';
            colonneJouee=colonneDemandee;
            ligneJouee=remplissage[colonneDemandee];
            remplissage[colonneDemandee]=remplissage[colonneDemandee]-1;
     
            if (partieEstGagneeOuPas(colonneJouee, ligneJouee)==1)
                printf("%s a gagnee!!\n", nomJ2);
            }
            else
                printf("%s a gagnee!!\n", nomJ1);
        }
        while (partieEstGagneeOuPas(colonneJouee, ligneJouee)==0 || estRemplieOuNon()==0);
     
    printf("Voullez vous rejouer une partie? (O/N):");
    scanf("%c", rejouerUnePartie);
    if (rejouerUnePartie='O')
        system("main");
     
     
     
        return 0;
    }
     
     
     
     
    int afficherGrille() //fonction permettant l'affichage de la grille du jeu.
     
    {
        //system("Cls");//permet d'effacer l'ecran et reafficher une nouvelle grille.
    printf("\t 1 2 3 4 5 6 7\n\t");
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][0], (char) grille[1][0], (char) grille[2][0], (char) grille[3][0], (char) grille[4][0], (char) grille[5][0], (char) grille[6][0]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][1], (char) grille[1][1], (char) grille[2][1], (char) grille[3][1], (char) grille[4][1], (char) grille[5][1], (char) grille[6][1]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][2], (char) grille[1][2], (char) grille[2][2], (char) grille[3][2], (char) grille[4][2], (char) grille[5][2], (char) grille[6][2]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][3], (char) grille[1][3], (char) grille[2][3], (char) grille[3][3], (char) grille[4][3], (char) grille[5][3], (char) grille[6][3]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][4], (char) grille[1][4], (char) grille[2][4], (char) grille[3][4], (char) grille[4][4], (char) grille[5][4], (char) grille[6][4]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][5], (char) grille[1][5], (char) grille[2][5], (char) grille[3][5], (char) grille[4][5], (char) grille[5][5], (char) grille[6][5]);
    printf("+-+-+-+-+-+-+-+\n\t\n\n");
        return 0;
    }
     
     
    int saisirCoup()
    {
    //declaration et initialisation variable colonneDemandee necessaire a saisircoup()
    int colonneDemandee;
        printf("Saisissez le numero de la colonne ou vous souhaitez faire tomber le jeton\n");
        scanf("%d", &colonneDemandee);
        colonneDemandee=colonneDemandee-1; // Le -1 est pour la correlation entre l'affichage et le tableau du programme.
     
        while (colonneDemandee<0 || colonneDemandee>6)
         {
            printf("Veuillez entrez un numero de colonne valide:");
            scanf("%d", &colonneDemandee);
            colonneDemandee=colonneDemandee-1;
            }
     
     
        return (colonneDemandee);
    }
     
     
    int jouable(int x)
    {
        //declaration et initialisation de la variable colonneJouable necessaire a jouable()
        int colonneDemandee;
     
        colonneDemandee = (remplissage[x]>0) ? 1 : 0;
        //colonneJouable = 1 si il est possible de jouer (la colonne n'est pas pleine)
        return colonneDemandee;
    }
     
     
     
     
    int dansGrille(int x, int y)
    {
        //declaration et initialisation de la variable caseExisteOuPas necessaire a dansGrille(), initialement la case est supposé ne pas exister
        int caseExisteOuPas = 0;
       /* Utilisation des conditions "basiques"
        if (x>0 && y>0 && x=<6 && y=<7)
            caseExisteOuPas = 1;
        else
            caseExisteOuPas = 0;
            */
     
     
            caseExisteOuPas = (x>0 && y>0 && x<=6 && y<=5) ? 1 : 0;
            //renvoie vrai si la condition est satisfaite (caseExisteOuPas = 1) ou renvoie faux sinon (caseExisteOuPas = 0) a l'aide de ternaire
     
     
        return caseExisteOuPas;
    }
     
     
     
     
     
     
     
    int estRemplieOuNon()
    {
        int grilleRemplie = 0;
        //Si toutes les colonnes du tableau sont pleines (=7), alors la grille est remplie.
        if(remplissage[0]==7 && remplissage[1]==7 && remplissage[2]==7 && remplissage[3]==7 && remplissage[4]==7 && remplissage[5]==7 && remplissage[6]==7)
            grilleRemplie = 1;
            else
            grilleRemplie = 0;
     
        return grilleRemplie;
    }
     
    int partieEstGagneeOuPas(int c, int l)
    {
        return 0;
        }
    ___________________________________________________________________________________________________________

    Mais j'ai reussi a plus ou moins localiser le probleme:
    En simplifiant au maximun mon code et en rajoutant quelques lignes pour voir ce qui se passe dans les 2 tableaux (grille et remplissage):

    Code:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
    //initialisation des bibliotheques necessaire au preprocesseur pour compiler le programme.
    #include <stdio.h>
    #include <stdlib.h>
     
     
    //Declarations des variables globales (beurkkkkkk!!!!!!)
    int grille[6][7];/*le tableau grille garde en memoire les coups joués (caractere "X" pour le premier joueur et "O" pour le second;
                        " " pour les case vide.*/
    int remplissage[6];/*remplissage defini le nombre de case restante dans une colonne donnée. remplissage[]=0 <=> la colonne est pleine.
                        Initialement, remplissage[]=6 car il y a six cases vides dans chaque colonne */
     
    // prototypes des fonctions. permet au programme principal main() de trouver les fonctions suivantes même si celles-ci sont placées en aval (aprés).
    int dansGrille(int x, int y);
    int jouable(int x);
    int saisirCoup();
    int afficherGrille();
     
     
     
    int main()
    {
     
        //declaration et initialisation des variables du programme main()
        int x, y, colonneDemandee, ligneDemandee;
     
        //Initialisation des variables globales
        for (x=0; x<=6; x++)
        {
            remplissage[x]=6;    //initialisation du tableau remplissage. Initialement il y a 6 cases vides dans chaque colonne.
            printf("%d    %d\n", x, remplissage[x]);
            for (y=0; y<=5; y++)
            {
            grille[x][y]=' ';    /*initialisation du tableau grille (met toutes les cases a "libre")*/
            printf("%d-%d  -- %d\n", x, y, grille[x][y]);
        }
        }
     
        //Debut du programme
        printf("*******           Projet Puissance 4           ******** \n\t\t\t\t by X. \n\n");
     
        do  {
            afficherGrille();
            //Au joueur 1 de jouer
            do  {
                printf("Joueur 1:\n");//renseigne les joueurs sur la personne devant jouer.
                colonneDemandee=saisirCoup(); /*Le numero de colonne valide (verifié par la fonction saisirCoup) est stocké dans la variable
                                                "colonneDemandee".*/
                }
            while (jouable(colonneDemandee)!=1); /* condition inversée! redemandera au joueur de rentrer un numero de colonne jusqu'a ce que celui ci
                                                    soit valide et validé par la fonction jouable.*/
     
            ligneDemandee=remplissage[colonneDemandee];
            grille[colonneDemandee][ligneDemandee]='X'; /* Une fois que la colonne et la ligne choisis sont valides, on place le caractere specifique au
                                                            joueur dans la grille.*/
     
            remplissage[colonneDemandee]--; // On met a jour le tableau remplissage en enlevant la case pris par le pion joué
     
     for (x=0; x<=6; x++)
        {
            printf("%d    %d\n", x, remplissage[x]);
            for (y=0; y<=5; y++)
            {
            printf("%d-%d  -- %d\n", x, y, grille[x][y]);
            }}
            //Au joueur 2 de jouer
            do  {
     
                afficherGrille();
                printf("Joueur 2:\n");
                colonneDemandee=saisirCoup();
                }
            while (jouable(colonneDemandee)!=1);
            grille[colonneDemandee][remplissage[colonneDemandee]]='O';
     
            remplissage[colonneDemandee]=remplissage[colonneDemandee]-1;
             for (x=0; x<=6; x++)
        {
            printf("%d    %d\n", x, remplissage[x]);
            for (y=0; y<=5; y++)
            {
            printf("%d-%d  -- %d\n", x, y, grille[x][y]);
            }}
     
            }
     
        while (1);
     
        return 0;
    }
     
     
     
     
    int afficherGrille() //fonction permettant l'affichage de la grille du jeu.
     
    {
        //system("Cls");//permet d'effacer l'ecran et reafficher une nouvelle grille.
    printf("\t 1 2 3 4 5 6 7\n\t");
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][0], (char) grille[1][0], (char) grille[2][0], (char) grille[3][0], (char) grille[4][0], (char) grille[5][0], (char) grille[6][0]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][1], (char) grille[1][1], (char) grille[2][1], (char) grille[3][1], (char) grille[4][1], (char) grille[5][1], (char) grille[6][1]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][2], (char) grille[1][2], (char) grille[2][2], (char) grille[3][2], (char) grille[4][2], (char) grille[5][2], (char) grille[6][2]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][3], (char) grille[1][3], (char) grille[2][3], (char) grille[3][3], (char) grille[4][3], (char) grille[5][3], (char) grille[6][3]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][4], (char) grille[1][4], (char) grille[2][4], (char) grille[3][4], (char) grille[4][4], (char) grille[5][4], (char) grille[6][4]);
    printf("+-+-+-+-+-+-+-+\n\t");
    printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][5], (char) grille[1][5], (char) grille[2][5], (char) grille[3][5], (char) grille[4][5], (char) grille[5][5], (char) grille[6][5]);
    printf("+-+-+-+-+-+-+-+\n\t\n\n");
        return 0;
    }
     
     
    int saisirCoup()
    {
    //declaration et initialisation variable colonneDemandee necessaire a saisircoup()
    int colonneDemandee;
        printf("Saisissez le numero de la colonne ou vous souhaitez faire tomber le jeton\n");
        scanf("%d", &colonneDemandee);
        colonneDemandee=colonneDemandee-1; // Le -1 est pour la correlation entre l'affichage et le tableau du programme.
     
        while (colonneDemandee<0 || colonneDemandee>6)
         {
            printf("Veuillez entrez un numero de colonne valide:");
            scanf("%d", &colonneDemandee);
            colonneDemandee=colonneDemandee-1;
            }
     
     
        return (colonneDemandee);
    }
     
     
    int jouable(int x)
    {
        //declaration et initialisation de la variable colonneJouable necessaire a jouable()
        int colonneDemandee;
     
        colonneDemandee = (remplissage[x]>0) ? 1 : 0;
        //colonneJouable = 1 si il est possible de jouer (la colonne n'est pas pleine)
        return colonneDemandee;
    }
     
     
     
     
    int dansGrille(int x, int y)
    {
        //declaration et initialisation de la variable caseExisteOuPas necessaire a dansGrille(), initialement la case est supposé ne pas exister
        int caseExisteOuPas = 0;
       /* Utilisation des conditions "basiques"
        if (x>0 && y>0 && x=<6 && y=<7)
            caseExisteOuPas = 1;
        else
            caseExisteOuPas = 0;
            */
     
     
            caseExisteOuPas = (x>0 && y>0 && x<=6 && y<=5) ? 1 : 0;
            //renvoie vrai si la condition est satisfaite (caseExisteOuPas = 1) ou renvoie faux sinon (caseExisteOuPas = 0) a l'aide de ternaire
     
     
        return caseExisteOuPas;
    }
    ______________________________________________________________________________________________________________________________


    Et voilà... les pions ne se mettent pas ou ils devraient, et une autre case joue les jmen foutiste en se decrementant de 1 a chaque fois qu'un joueur joue...
    Je ne vois vraiment pas le probleme, s'il vous plait, HELPPPPPPPP!!!!!!!!!!!!!!!!!!!!!!

    Pour ceux qui prendront un peu de leur temp, merci infiniment!!!!!
    A bientôt (J'espere!!!!!)

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ecriture en dehors des tableaux : cet indice est limité à 5
    Probablement un mélange entre les deux dimensions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int grille[6][7];/*le tableau grille garde en memoire les coups joués (caractere "X" pour le premier joueur et "O" pour le second;
                        " " pour les case vide.*/
    int remplissage[6];/*remplissage defini le nombre de case restante dans une colonne donnée. remplissage[]=0 <=> la colonne est pleine.
                        Initialement, remplissage[]=6 car il y a six cases vides dans chaque colonne */
    
    ....
        for (x=0; x<=6; x++)
        {
            remplissage[x]=6;    //initialisation du tableau remplissage. Initialement il y a 6 cases vides dans chaque colonne.
            for (y=0; y<=5; y++)
            grille[x][y]=32;    /*initialisation du tableau grille (met toutes les cases a "libre").
                                32 est le nombre pour lequel le caractere "espace" apparaitra lors de l'affichage de la grille*/
        }
    et même chose plus bas.
    Il va falloir réexplorer tout le code.

  3. #3
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu confonds beaucoup les X et Y de ton tableau 2D.
    Un tableau 2D déclaré comme ceci tab[2][4] sera comme ça (j'ai mis les indices):

    \ 1234
    1 oooo
    2 oooo

    Essaye de régler ça déjà et tu verras que ça ira beaucoup mieux
    Rien que pour ton initialisation tu fais un débordement ! Chez moi (et je pense que chez toi c'est pareil) ça déborde sur le tableau remplissage !
    Donc au lieu d'initialiser ton tableau remplissage avec des 6, il y a des 32 dedans !!
    De plus au lieu d'initialiser avec 32 tu peux mettre ' '

    Pour ta fonction afficher fais comme ça c'est plus propre ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int afficherGrille(void) /* fonction permettant l'affichage de la grille du jeu. */
    {
    	int x, y;
     
        printf("\t 1 2 3 4 5 6 7\n");
    	for (y = 0; y < 6; y++) {
    		printf("\t+-+-+-+-+-+-+-+\n\t");
    		putchar('|');
    		for (x = 0; x < 7; x++) {
    			printf("%c|", grille[y][x]);
    		}
    		puts("");
    	}
    	printf("\t+-+-+-+-+-+-+-+\n\t");
        return 0;
    }
    Note bien que ligne 10 j'ai mis [y][x] et non l'inverse !

    Bon courage

    Et petit truc aussi, dans ton main pour jouer tu recopies 2 fois la même chose pour J1 et J2 tu peux faire quelque chose je pense

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    Tu confonds beaucoup les X et Y de ton tableau 2D.
    Un tableau 2D déclaré comme ceci tab[2][4] sera comme ça (j'ai mis les indices):

    \ 1234
    1 oooo
    2 oooo

    Essaye de régler ça déjà et tu verras que ça ira beaucoup mieux
    Je n'ai pas trop compris ton schéma ceci étant j'ai compris d'ou venais mes fautes. Mais je peine à realiser mon but, mais je vaincrais !!

    Citation Envoyé par Pouet_forever Voir le message
    Rien que pour ton initialisation tu fais un débordement ! Chez moi (et je pense que chez toi c'est pareil) ça déborde sur le tableau remplissage !
    Donc au lieu d'initialiser ton tableau remplissage avec des 6, il y a des 32 dedans !!
    Et non, chez moi juste apres l'initialisation le tableau est a 6 partout! :s
    aprés seulement il se met a devenir fou... bizarre...

    Citation Envoyé par Pouet_forever Voir le message
    De plus au lieu d'initialiser avec 32 tu peux mettre ' '
    Je le fais déjà mais en désespoir de cause... J'ai tester voir si ça ne venait pas de là

    Citation Envoyé par Pouet_forever Voir le message
    Pour ta fonction afficher fais comme ça c'est plus propre ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int afficherGrille(void) /* fonction permettant l'affichage de la grille du jeu. */
    {
    	int x, y;
     
        printf("\t 1 2 3 4 5 6 7\n");
    	for (y = 0; y < 6; y++) {
    		printf("\t+-+-+-+-+-+-+-+\n\t");
    		putchar('|');
    		for (x = 0; x < 7; x++) {
    			printf("%c|", grille[y][x]);
    		}
    		puts("");
    	}
    	printf("\t+-+-+-+-+-+-+-+\n\t");
        return 0;
    }
    Note bien que ligne 10 j'ai mis [y][x] et non l'inverse !

    Bon courage
    Je persévère...

    De plus, pourquoi à tu mis void comme paramètre de la fonction? Qu'est ce que ça change?
    Et quelle est la différence dans ce cas entre putchar('|') et printf("|")?
    Le puts("") c'est pour aller à la ligne?
    Dsl de toutes ces question mais j'aime bien savoir ce que j'écris


    Citation Envoyé par Pouet_forever Voir le message
    Et petit truc aussi, dans ton main pour jouer tu recopies 2 fois la même chose pour J1 et J2 tu peux faire quelque chose je pense
    Le programme est loin d'être terminé à l'heure actuelle, je mettrais la version finale si tu veux

    Merci de ton aide

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Par défaut
    Citation Envoyé par Xav NS Voir le message
    -Un tableau a deux dimensions 6x7 d'entier appelé grille definissant une configuration du jeu
    -Un tableau de 6 entiers appelé remplissage definissant l'état de remplissage de chaque colonne.

    Voilà d'où viens mon erreur! ce n'est pas un tableau de 6 entiers, il y a 7 colonnes!
    Merci diogene, je m'y met tout de suite!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Par défaut
    Ok... Pleins de "petits" problemes... A commencer par les declarations des tableaux.

    Mais j'ai tout repris a zero, et voila le resultat pour ceux qui le veulent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
     
    /* Projet Puissance 4
       Xav NS
       Université Paris-Sud XI
    */
     
     
     
    //initialisation des bibliotheques necessaire au preprocesseur pour compiler le programme.
    #include <stdio.h>
    #include <stdlib.h>
     
    //Declarations des variables globales (beurkkkkkk!!!!!!)
    int grille[7][6];//le tableau grille garde en memoire les coups joués (caractere "X" pour le premier joueur, "O" pour le second et " " pour les case vide.
    int remplissage[7];/*remplissage defini la ligne pouvant acceuillir un pion dans une colonne donnée. remplissage[]<0 <=> la colonne est pleine.
                        Initialement, remplissage[]=5 car il y a six cases vides dans chaque colonne */
     
     
    // prototypes des fonctions. permet au programme principal main() de trouver les fonctions suivantes même si celles-ci sont placées en aval (aprés).
    int dansGrille(int x, int y);
    int jouable(int x);
    int saisirCoup();
    void afficherGrille(); // void signifie que la fonction ne renvoie aucune valeur.
    int estRemplieOuNon();
    int adjacent( int c, int l, int dirV, int dirH);
    int partieEstGagneeOuPas(int c,  int l);
    void reglesDuJeu();
     
     
     
    int main()
    {
        int rejouer;
        do
        {
    //declaration et initialisation des variables du programme main()
            int menu;
            int aQuiLeTour = 2, scoreJ1=0, scoreJ2=0;
            int x, y, colonne, ligne;
            char nomJ1[100], nomJ2[100];
     
    //Debut du programme
     
    //Menu Principal
            do
            {
                menu=2; // Valeur qui permet lors d'un retour au menu principal de ne pas accepter les caracteres interdits.
                system("cls"); // Permet d'effacer la console.
                printf("*******           Projet Puissance 4           ******** \n\t\t\t\t by X. \n\n");
                printf("~~~~~~~~~~~~~~~~~~~~~~~~ Menu ~~~~~~~~~~~~~~~~~~~~~~~~\n\n\n");
                printf("\t\tJouer une partie  ~~  0\n\n");
                printf("\t\tRegles du jeu     ~~  1\n\n");
                scanf("%d", &menu);fflush(stdin); //Permet d'eviter les bugs dut aux caracteres interdit.
                if (menu==1)
                    reglesDuJeu();
            }
            while (menu!=0);
    // Menu du jeu
            system("cls");
            printf("\n\n\n\tVeuillez entrer le nom du premier joueur :\n\n\t");
            scanf("%s", &nomJ1);
            system("cls");
            printf("\n\n\tVeuillez a present entrer le nom du second joueur:\n\n\t");
            scanf("%s", &nomJ2);
            do
            {
                system("cls");
    //Initialisation des variables globales
                for (x=0; x<=6; x++)
                {
                    remplissage[x]=5;    //initialisation du tableau remplissage. Initialement il y a 6 cases vides dans chaque colonne, la 6eme etant la numero 5 dans le tableau.
                    for (y=0; y<=5; y++)
                        grille[x][y]=' ';//initialisation du tableau grille (met toutes les cases a "libre")
                }
                afficherGrille();
                do
                {
                    aQuiLeTour = (aQuiLeTour==2) ? 1 : 2; // On change de joueur.
                    if (aQuiLeTour==1)
                        printf("A %s de jouer:\n\n", nomJ1);
                    else
                        printf("A %s de jouer:\n\n", nomJ2);
     
                    colonne=saisirCoup(); //Le numero de colonne valide (verifié par la fonction saisirCoup) est stocké dans la variable "colonne".
                    ligne=remplissage[colonne];//Besoin de sauvegarder la ligne jouée pour savoir si la partie est gagnee ou pas.
                    if (aQuiLeTour==1)
                        grille[colonne][ligne]='X'; // On place le caractere specifique au joueur dans la grille.
                    else
                        grille[colonne][ligne]='O';
                    remplissage[colonne]--; // On met a jour le tableau remplissage en enlevant la case pris par le pion joué.
                    afficherGrille();
                }
                while(!partieEstGagneeOuPas(colonne, ligne) && !estRemplieOuNon() );
     
                if (aQuiLeTour==1 && partieEstGagneeOuPas(colonne, ligne))
                {
                    printf("Fellicitation %s, vous avez gagne!!\n", nomJ1);
                    scoreJ1 ++;
                }
                else if (aQuiLeTour==2 && partieEstGagneeOuPas(colonne, ligne))
                {
                    printf("Fellicitation %s, vous avez gagne!!\n", nomJ2);
                    scoreJ2 ++;
                }
                else
                    printf("Match nul... Vraiment nul...\n");
                printf("Scores:\n\n\n%s : %d\n%s : %d\n\n", nomJ1, scoreJ1, nomJ2, scoreJ2);
                printf("Rejouer une partie        ~~ 0\n\n");
                printf("Retour au menu principal  ~~ 1\n\n");
                printf("Quitter                   ~~ 2\n\n");
                scanf("%d", &rejouer);
            }
            while (rejouer !=1 && rejouer!=2);
        }
        while(rejouer==1);
     
        system("cls");
        return 0;
    }
     
    void afficherGrille()
    {
        system("Cls");
    	int x, y;
        printf("\n\t  1   2   3   4   5   6   7\n");
    	for (y = 0; y <= 5; y++)
    	{
    		printf("\t+---+---+---+---+---+---+---+\n\t");
    		for (x = 0; x <= 6; x++)
    			printf("| %c ", grille[x][y]);
    		printf("|\n");
    	}
    	printf("\t+---+---+---+---+---+---+---+\n\n\t");
    }
     
    int saisirCoup()//Cette fonction fait la difference entre une colonne pleine et un caractere interdit.
    {
        int colonne;
        do
        {
            printf("Saisissez le numero de la colonne ou vous souhaitez faire tomber le jeton :");
            scanf("%d", &colonne); fflush(stdin); // fflush(stdin) permet de ne pas faire buger le programme lorqu'un joueur entre par megarde un caractere interdit.
            colonne--; // Le -1 est pour la correlation entre l'affichage et le tableau du programme.
            while (colonne<0 || colonne>6)// temps que le caractere entré par le joueur n'est pas un nombre entre 1 et 7.
            {
                printf("Veuillez entrez un numero de colonne valide :");
                scanf("%d", &colonne); fflush(stdin);
                colonne--;
            }
            if (jouable(colonne)!=1)// Si le caractere entre par le joueur est correct mais qu'on ne peut pas mettre de pion, alors la colonne est pleine.
                    printf("La colonne est pleine.\n");
        }
        while (!jouable(colonne));// redemandera au joueur de rentrer un numero de colonne jusqu'a ce que celui ci soit valide et validé par la fonction jouable.
        return (colonne);
    }
     
    int jouable(int x)
    {
        int colonne;
        colonne = (remplissage[x]>-1) ? 1 : 0; // Lorsque remplissage[x] = -1, la colonne est pleine (on part de remplissage[x]=5; 5-6(pion/colonne)=-1), donc "colonne" n'est pas jouable.
        return colonne; // retourne 1 si il est possible de jouer (la colonne n'est pas pleine)
    }
     
    int dansGrille(int x, int y)
    {
        int caseExisteOuPas = 0; // initialement la case est supposé ne pas exister, par precaution.
        caseExisteOuPas = (x>0 && y>0 && x<=6 && y<=5) ? 1 : 0;
        return caseExisteOuPas; // renvoie vrai si la condition est satisfaite (caseExisteOuPas = 1) ou renvoie faux sinon (caseExisteOuPas = 0)
    }
     
    int estRemplieOuNon()
    {
        int x, grilleRemplie = 1;
        for (x=0; x<=6; x++)
        {
            if (remplissage[x]>=0)
                grilleRemplie=0;
        }
        return grilleRemplie;
    }
     
    int adjacent( int c, int l, int dirV, int dirH)
    {
        int compteur = 0;
        int C = c + dirH, L = l + dirV;
        while (grille[c][l] == grille[C][L] && (C>=0 && C<=6 && L>=0 && L<=5))
        {
            compteur++;
            if (C>=0 && C<=6)
                C += dirH; // <=> c = c + dirH
            if (L>=0 && L<=5)
                L += dirV;
        }
    return compteur;
    }
     
    int partieEstGagneeOuPas(int c,  int l)
    {
        int partieGagnee=0;
     
        if  (  ( adjacent(c,l,0,1)  + adjacent(c,l,0,-1)  + 1  ) >=4 )
            partieGagnee=1;
        if  (  ( adjacent(c,l,1,0)  + adjacent(c,l,-1,0)  + 1  ) >=4 )
            partieGagnee=1;
        if  (  ( adjacent(c,l,-1,1) + adjacent(c,l,1,-1)  + 1  ) >=4 )
            partieGagnee=1;
        if  (  ( adjacent(c,l,1,1)  + adjacent(c,l,-1,-1) + 1  ) >=4 )
                partieGagnee=1;
     
        return partieGagnee;
     
    }
     
    void reglesDuJeu()
    {
        int ok;
        system("cls");
        printf("\n\n\t\tRegles du jeu\n\t\tPuissance 4\n\n\n");
        printf("Puissance 4 est un jeu de strategie combinatoire abstrait.\nLe but du jeu est d'aligner 4 pions sur une grille comptant 6 rangees et \n7 colonnes.\nChaque joueur dispose de 21 pions. Tour a tour les deux joueurs placent un pion dans la colonne de leur choix,\nle pion coulisse alors jusqu'à la position la plus basse possible dans ladite \ncolonne suite a quoi c'est a l'adversaire de jouer.\nLe vainqueur est le joueur qui realise le premier un alignement (horizontal, \nvertical ou diagonal) d'au moins quatre pions lui appartenant. \nSi, alors que toutes les cases de la grille de jeu sont remplies aucun des deux joueurs n'a realise un tel alignement, la partie est declaree nulle.\n\n\n");
        system("PAUSE");
    }

    Merci encore pour les réponses... Problème résolut!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] Probleme d'affichage entre ListBox/TextBox
    Par Monster77 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2004, 11h02
  2. [VB.NET] Probleme d'affichage de controle
    Par mic56 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/06/2004, 15h03
  3. xml-xsl-fo : probleme d'affichage d'un tableau
    Par clindoeil dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 12/12/2003, 12h46
  4. [langage] Problème d'affichage
    Par marcoss dans le forum Langage
    Réponses: 3
    Dernier message: 29/08/2003, 13h05
  5. IE [Applet] Plug-in problème d'affichage
    Par Tonton Luc dans le forum JBuilder
    Réponses: 4
    Dernier message: 19/06/2003, 08h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo