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 :

Je ne vois pas ce qui cloche.


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut Je ne vois pas ce qui cloche.
    Bonjour, je suis en train de coder un programme d'un jeu puissance 4 et il ne me reste plus que un type de vérificationa faire. La vérification des 2 diagonales. Mais rien a faire il ne fonctionne pas et pourtant il devrait!

    Dans mon output j'ai à un moment:

    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
     
    Le prochain joueur est le: rouge.
    Entrez le numero de la colonne:
    5
    |O|O|O|O|O|O|O|O|
    |O|O|O|O|O|O|O|O|
    |O|O|O|O|O|O|O|O|
    |O|O|O|J|R|O|O|O|
    |R|O|J|J|J|R|O|R|
    |R|J|J|R|J|R|R|J|
    |J|R|R|R|J|J|J|R|
    Joueur R tabpost J x: 4 y: 3
    winner vaut == Ftest
    F
    win droite1= 2win droite1= 3win droite1= 4
    F
    Le prochain joueur est le: jaune.
    Entrez le numero de la colonne:
    Le win = 4 devrait me faire sortir un joueur gagnant mais ce n'est pas le cas.
    Dans un de mes test j'avais eu un gagnant mais dans la 2eme diagonale (de même sens) mais je n'ai pas comprit pourquoi à la 2eme horizontale et pas la 1er..

    Voici le morceau de 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
     
    /* Verifie la diagonale partant de la droite */
    int VerifDiagoDroite(int x,int y,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     char stop='F';
     int win=1;
    	while(win<4 && x+cpt<8 && y+cpt<7 && stop=='F'){
    		if(tab[y+cpt][x+cpt]==joueur){
    		cpt++;
    		win++;
    		printf("win droite1= %d",win); //retirer
    		}
    		else stop='V';
    	}
     cpt=1;
     stop='F';
     while(win<4 && x-cpt>0 && y-cpt>0 && stop=='F'){
    	if(tab[y-cpt][x-cpt]==joueur){  //y+cpt et pas -
    	cpt++;
    	win++;
    	printf("win droite2 = %d",win); //retirer
    	}
    	else stop='V';
    	}
     return win;
    }
     
    /* Verifie la diagonale partant de la gauche */
    int VerifDiagoGauche(int x,int y,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     char stop='F';
     int win=1;
     while(win<4 && x-cpt>0 && y+cpt<7 && stop=='F'){
    	if(tab[y+cpt][x-cpt]==joueur){
    	cpt++;
    	win++;
    	printf("win gauche1= %d",win); //retirer
    	}
    	else stop='V';
     }
     cpt=1;
     stop='F';
     while(win<4 && x+cpt<8 && y-cpt>0 && stop=='F'){
    	if(tab[y-cpt][x+cpt]==joueur){
    	cpt++;
    	win++;
    	printf("win gauche2= %d",win); //retirer
    	}
    	else stop='V';
     }
     return win;
    }
     
    /* Verifie les axes des diagonales */
    int VerifDiago(int x,int y,char joueur, char tab[nb_ligne][nb_colonne]){
    char victory='F';
    int win;
    win=VerifDiagoDroite(x,y,joueur,tab);
    	if(win<=4)win=VerifDiagoGauche(x,y,joueur,tab);
     
    	if (win>=4) victory='V';
    return victory;
    }
     
    /* execute toute les sous-programme de verification du gagnant */
    int VerifGagner(int x,int y,char joueur, char tab[nb_ligne][nb_colonne]){
      printf("Joueur %c tabpost %c x: %d y: %d\n",joueur,tab[x][y],x,y);
     char winner;//='F';
     winner=VerifVerticale(x, y,joueur,tab);
     printf("winner vaut == %c",winner);
    	if(winner=='F') winner=VerifHoriz(x,y,joueur,tab);
    	printf("\n%c\n",winner);
     
    	if(winner=='F') winner=VerifDiago(x,y,joueur,tab);
    	printf("\n%c\n",winner);
    return winner;
    }
    Comme on peut le voir dans le code si win=4 je sort et je renvoi victory
    Mon code comprend déjà les vérif verticale et horizontale parfaitement fonctionnelle. C'est la dernière erreur qui m’empêche de faire les teste et boucler ce devoir interminable.
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Hello,

    Lignes 58 à 60, je vois ceci :

    win=VerifDiagoDroite(x,y,joueur,tab);
    	if(win<=4)win=VerifDiagoGauche(x,y,joueur,tab);
     
    	if (win>=4) victory='V';
    La première condition devrait être « < » et pas « <= ». Sinon, ton programme fait le test suivant même si le premier est déjà positif. Et si le second ne l'est pas, la victoire échappe à ton joueur.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    oh merci sa m'avais vraiment échapper
    Bon je vais retenter avec la modif mais oui tu à certainement raison
    Je me demandais y aurai t'il un programme (comme eclipse avec java) qui permet de faire des test junit pour C ?
    bien que j'ai jamais fait de test junit pour java sur eclipse non plus.. sa mache le travail d'après diras t-on



    EDIT: apparemment ce n'est toujours pas correcte mais en regardant attentivement l'output il y a quelque chose de bizarre..

    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
     
    Entrez le numero de la colonne:
    3
    |O|O|O|O|O|O|O|O|
    |O|O|O|O|O|O|O|O|
    |O|O|O|O|O|O|O|O|
    |O|R|J|J|O|O|O|O|
    |R|J|J|R|O|O|O|O|
    |R|J|R|J|O|O|O|O|
    |J|R|R|J|O|O|O|O|
    Joueur J tabpost O x: 2 y: 3
    winner vaut == Ftest
    F
    win gauche1= 2
    F
    Le prochain joueur est le: rouge.
    Entrez le numero de la colonne:
    3
    |O|O|O|O|O|O|O|O|
    |O|O|O|O|O|O|O|O|
    |O|O|R|O|O|O|O|O|
    |O|R|J|J|O|O|O|O|
    |R|J|J|R|O|O|O|O|
    |R|J|R|J|O|O|O|O|
    |J|R|R|J|O|O|O|O|
    Joueur R tabpost R x: 2 y: 2
    winner vaut == Ftest
    F
    win gauche1= 2
    F
    Le prochain joueur est le: jaune.
    Entrez le numero de la colonne:
    4
    |O|O|O|O|O|O|O|O|
    |O|O|O|O|O|O|O|O|
    |O|O|R|J|O|O|O|O|
    |O|R|J|J|O|O|O|O|
    |R|J|J|R|O|O|O|O|
    |R|J|R|J|O|O|O|O|
    |J|R|R|J|O|O|O|O|
    Joueur J tabpost J x: 3 y: 2
    winner vaut == Ftest
    F
    win gauche1= 2win gauche1= 3
    F
    Le prochain joueur est le: rouge.
    Entrez le numero de la colonne:
    4
    |O|O|O|O|O|O|O|O|
    |O|O|O|R|O|O|O|O|
    |O|O|R|J|O|O|O|O|
    |O|R|J|J|O|O|O|O|
    |R|J|J|R|O|O|O|O|
    |R|J|R|J|O|O|O|O|
    |J|R|R|J|O|O|O|O|
    Joueur R tabpost R x: 3 y: 1
    winner vaut == Ftest
    F
    win gauche1= 2win gauche1= 3
    F
    Le prochain joueur est le: jaune.
    Entrez le numero de la colonne:
    Si on regarde attentivement on remarque que tabpost a parfois le même nom que joueur et d'autre fois est a O;
    Pourquoi cette différence ? je ne devrais logiquement n'avoir que joueur = J tabpost = J ou joueur = R tabpost = R
    que il me fassent tabpost = O quand sa lui chante sa me fait tourner en rond ..

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Citation Envoyé par Linquisiteur Voir le message
    Si on regarde attentivement on remarque que tabpost a parfois le même nom que joueur et d'autre fois est a O;
    Pourquoi cette différence ? je ne devrais logiquement n'avoir que joueur = J tabpost = J ou joueur = R tabpost = R
    que il me fassent tabpost = O quand sa lui chante sa me fait tourner en rond ..
    Ça, il n'y a que toi qui puisses nous le dire puisqu'on n'a pas le code au complet (et en particulier, la zone où tu modifies ton tableau).

    Je n'ai que survolé ton programme parce que c'est difficile d'y pénétrer en profondeur mais quoi qu'il en soit, si une diagonale est valide, ça ne veut pas dire que l'autre l'est aussi. En outre, à première vue, tu ne testes la validité de la ligne qu'en descendant. Ça veut dire que si tu places le dernier jeton au milieu d'une ligne en construction, je ne sais pas si ton programme sera capable de le détecter :

       R   
       ↓
    ........
    ........
    .....R..
    ....RJ..
    ....JJ..
    ..RJJJ..
    .RRJRR..

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Je poste le code en entier alors. Je n'en peux plus de ce code je veux passer a un type de code de plus au niveau .. Vive l'an prochain
    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
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define nb_colonne 8
    #define nb_ligne 7
     
    /* Remplir un tableau de dimension x,y */
    void RemplirTab(char tab[nb_ligne][nb_colonne], int ligne, int colonne) {
         int i;
         for(i=0; i < ligne; i++) {
              int j;
              for (j=0; j < colonne; j++){
                  tab[i][j]='O';
              }
         }
    }
     
    /* Lire le tableau de dimension x,y */
    void LireTab (char tab[nb_ligne][nb_colonne],int colonne,int ligne){
     int i;
         for(i=0; i < colonne; i++) {
              int j;
              printf("|");
              for (j=0; j < ligne; j++)
              {
              printf("%c|",tab[i][j]);
              }
          puts("");
         }
    }
     
    /* Prendre le choix de la colonne où entrer le pion */
    int EntrerPion(){
     int numero=0;
     puts("Entrez le numero de la colonne: ");
          while(numero<1 || numero>8){
               int c;
               scanf("%d",&numero);
               while ((c=getchar ())!= '\n' && c!= EOF);
          }
      numero--;
     return numero;
    }
     
    /* Verifie que la colonne ne soit pas complet */
    int VerifPion(int numero, char tab[nb_ligne][nb_colonne]){
     char verif;
         if(tab[0][numero]=='O') verif='v';
         else {
         verif='f';
         puts("Colonne remplie");
         }
     return verif;
    }
     
    /* Entre le pion dans la grille */
    int PlacerPion(int numero,char joueur, char tab[nb_ligne][nb_colonne]){
     int ligne=7;
        while(tab[ligne][numero]!='O'){
        ligne--;
        }
     tab[ligne][numero]=joueur;
    return ligne;
    }
     
    /* Verifie l'axe verticale du tableau pour trouver le gagnant */
    int VerifVerticale(int x, int y,char joueur, char tab[nb_ligne][nb_colonne]){
     char victory='F';
     int win=0;
        if(y<=3){ //si on a 4 pion aligner ou plus
         int cpt=0;
    		while(cpt<=3){
                if(tab[y+cpt][x]==joueur){
    			 win++;
    			 cpt++;
    			}
    			else cpt=4;
    		}
    	}
     
    	if(win==4) victory='V';
    return victory;
    }
     
    /* Verifie l'axe horizontale*/
    int VerifHoriz(int x,int y,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     int win=1;
     char victory;
    	while(win<4 && x+cpt<8){
    		if(tab[y][x+cpt]==joueur){
    		win++;
    		cpt++;
    		}
    		else cpt=8;
    	}
        cpt=1;
     
    	while(win<4 && x-cpt>-1){
    		if(tab[y][x-cpt]==joueur){
    		win++;
    		cpt++; 
    		}
    		else cpt=9;
    	}
     
    	if(win>=4)victory = 'V';
    	else victory = 'F';
     
     return victory;
    }
     
    /* Verifie la diagonale partant de la droite */
    int VerifDiagoDroite(int x,int y,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     char stop='F';
     int win=1;
    	while(win<4 && x+cpt<8 && y+cpt<7 && stop=='F'){
    		if(tab[y+cpt][x+cpt]==joueur){
    		cpt++;
    		win++;
    		printf("win droite1= %d",win); //retirer
    		}
    		else stop='V';
    	}
     cpt=1;
     stop='F';
     while(win<4 && x-cpt>0 && y-cpt>0 && stop=='F'){
    	if(tab[y-cpt][x-cpt]==joueur){  //y+cpt et pas -
    	cpt++;
    	win++;
    	printf("win droite2 = %d",win); //retirer
    	}
    	else stop='V';
    	}
     return win;
    }
     
    /* Verifie la diagonale partant de la gauche */
    int VerifDiagoGauche(int x,int y,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     char stop='F';
     int win=1;
     while(win<4 && x-cpt>0 && y+cpt<7 && stop=='F'){
    	if(tab[y+cpt][x-cpt]==joueur){
    	cpt++;
    	win++;
    	printf("win gauche1= %d",win); //retirer
    	}
    	else stop='V';
     }
     cpt=1;
     stop='F';
     while(win<4 && x+cpt<8 && y-cpt>0 && stop=='F'){
    	if(tab[y-cpt][x+cpt]==joueur){
    	cpt++;
    	win++;
    	printf("win gauche2= %d",win); //retirer
    	}
    	else stop='V';
     }
     return win;
    }
     
    /* Verifie les axes des diagonales */
    int VerifDiago(int x,int y,char joueur, char tab[nb_ligne][nb_colonne]){
    char victory='F';
    int win;
    win=VerifDiagoDroite(x,y,joueur,tab);
    	if(win<4)win=VerifDiagoGauche(x,y,joueur,tab);
     
    	if (win>=4) victory='V';
    return victory;
    }
     
    /* execute toute les sous-programme de verification du gagnant */
    int VerifGagner(int x,int y,char joueur, char tab[nb_ligne][nb_colonne]){
      printf("Joueur %c tabpost %c x: %d y: %d\n",joueur,tab[x][y],x,y);
      char winner;//='F';
      winner=VerifVerticale(x, y,joueur,tab);
      printf("winner vaut == %c",winner);
    	if(winner=='F') winner=VerifHoriz(x,y,joueur,tab);
    	printf("\n%c\n",winner);
     
    	if(winner=='F') winner=VerifDiago(x,y,joueur,tab);
    	printf("\n%c\n",winner);
    return winner;
    }
     
    /* Alterne le joueur à chaque tour */
    int ChangeCouleur(char joueur){
    	printf("Le prochain joueur est le:");
    	if(joueur=='J') {
    	joueur='R';
    	printf(" rouge. \n");
    	}
    	else {
    	joueur='J';
    	printf(" jaune. \n");
    	}
    	return joueur;
     }
     
     int main(void){
     char grille[nb_ligne][nb_colonne];
     RemplirTab(grille,nb_ligne,nb_colonne);
     LireTab(grille,nb_ligne,nb_colonne);
     
     puts("Le 1er joueurs posséderas les pions jaunes");
     int nbpion=0;
     char couleur='J';
     char gagner='F';
     int choix;
     int ligne;
          while(gagner=='F' && nbpion<56){
          char ok='f';
                 while(ok=='f'){
                 choix = EntrerPion();
                 ok=VerifPion(choix, grille);
                 }
          ligne=PlacerPion(choix, couleur, grille);
          nbpion++;
    	    LireTab(grille,nb_ligne,nb_colonne);
          if (nbpion>3) gagner=VerifGagner(choix,ligne,couleur,grille);
    	  if (gagner=='F') couleur=ChangeCouleur(couleur);
    	  }
     
    	  if (gagner!='F'){
    		printf("Le gagnant est le joueur");
              if(couleur=='J') printf(" jaune. \n");
    		      else printf(" rouge. \n");
        }
     
    return EXIT_SUCCESS;
    }

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Ton indentation laisse à désirer
    Lorsque tu présentes du code c'est tout de même un minimum !

    Dans ta fonction PlacerPion(), tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int PlacerPion(int numero, char joueur, char tab[nb_ligne][nb_colonne]){
        int ligne=7;
        while(tab[ligne][numero]!='O'){
    Mieux vaudrait utiliser la constante nb_ligne. Et ici cette dernière étant fixée à 7, tu dépasses la taille de ton tableau.
    De même ligne 216 : while(gagner=='F' && nbpion<56) où 56 devrait dépendre des constantes nb_colonne et nb_ligne.
    Idem ligne 37 : while(numero<1 || numero>8){.
    et beaucoup d'autres lignes...

    Pourquoi rentrer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void RemplirTab(char tab[nb_ligne][nb_colonne], int ligne, int colonne) {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void LireTab (char tab[nb_ligne][nb_colonne],int colonne,int ligne)
    pour boucler dessus alors que tu possèdes les constantes ?

    Il y a plusieurs boucles while qui du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(/*...*/ && flag){
        if(/*condition de maintient*/)
            /* ... */
        else
            flag = false;
    }
    qui pourraient se simplifier en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(/*...*/ && /*condition de maintient*/){
        /* ... */
    }
    Sinon il me semble que tu as inversé ligne et choix par rapport à x et y lorsque tu utilises la fonction VerifGagner().
    Veille à garder les mêmes noms parlants, tu ne t'y retrouveras que mieux

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Merci, j'ai modifier pas mal de ce que tu ma conseiller. Malheureusement j'ai encore ce même problème j'ai vérifier je ne vois pas de quel (ancien) x,y j'ai inverser.
    Pour les while et if que je pourrais rassembler je ne sais pas car j'ai des else à chaque fois. Donc j'ai peu de faire plus de mal qu'autre chose.

    Edit: je ne comprend pas ce dont tu m'as parler avec les constante et nbpion directement lier
    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
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define nb_colonne 8
    #define nb_ligne 7
     
    /* Remplir un tableau de dimension x,y */
    void RemplirTab(char tab[nb_ligne][nb_colonne]) {
         int i;
         for(i=0; i < nb_ligne; i++) {
              int j;
              for (j=0; j < nb_colonne; j++){
                  tab[i][j]='O';
              }
         }
    }
     
    /* Lire le tableau de dimension x,y */
    void LireTab (char tab[nb_ligne][nb_colonne]){
     int i;
         for(i=0; i < nb_ligne; i++) {
              int j;
              printf("|");
              for (j=0; j < nb_colonne; j++)
              {
              printf("%c|",tab[i][j]);
              }
          puts("");
         }
    }
     
    /* Prendre le choix de la colonne où entrer le pion */
    int EntrerPion(){
     int numero=0;
     puts("Entrez le numero de la colonne: ");
          while(numero<1 || numero>8){
               int c;
               scanf("%d",&numero);
               while ((c=getchar ())!= '\n' && c!= EOF);
          }
      numero--;
     return numero;
    }
     
    /* Verifie que la colonne ne soit pas complet */
    int VerifPion(int numero, char tab[nb_ligne][nb_colonne]){
     char verif;
         if(tab[0][numero]=='O') verif='v';
         else {
         verif='f';
         puts("Colonne remplie");
         }
     return verif;
    }
     
    /* Entre le pion dans la grille */
    int PlacerPion(int numero,char joueur, char tab[nb_ligne][nb_colonne]){
        int ligne=7;
    	while(tab[ligne][numero]!='O'){
        ligne--;
        }
     tab[ligne][numero]=joueur;
    return ligne;
    }
     
    /* Verifie l'axe verticale du tableau pour trouver le gagnant */
    int VerifVerticale(int choix, int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
     char victory='F';
     int win=0;
        if(ligne<=3){ //si on a 4 pion aligner ou plus
         int cpt=0;
    		while(cpt<=3){
                if(tab[ligne+cpt][choix]==joueur){
    			 win++;
    			 cpt++;
    			}
    			else cpt=4;
    		}
    	}
     
    	if(win==4) victory='V';
    return victory;
    }
     
    /* Verifie l'axe horizontale*/
    int VerifHoriz(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     int win=1;
     char victory;
    	while(win<4 && choix+cpt<8){
    		if(tab[ligne][choix+cpt]==joueur){
    		win++;
    		cpt++;
    		}
    		else cpt=8;
    	}
        cpt=1;
     
    	while(win<4 && choix-cpt>-1){
    		if(tab[ligne][choix-cpt]==joueur){
    		win++;
    		cpt++; 
    		}
    		else cpt=9;
    	}
     
    	if(win>=4)victory = 'V';
    	else victory = 'F';
     
     return victory;
    }
     
    /* Verifie la diagonale partant de la droite */
    int VerifDiagoDroite(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     char stop='F';
     int win=1;
    	while(win<4 && choix+cpt<8 && ligne+cpt<7 && stop=='F'){
    		if(tab[ligne+cpt][choix+cpt]==joueur){
    		cpt++;
    		win++;
    		printf("win droite1= %d",win); //retirer
    		}
    		else stop='V';
    	}
     cpt=1;
     stop='F';
     while(win<4 && choix-cpt>0 && ligne-cpt>0 && stop=='F'){
    	if(tab[ligne-cpt][choix-cpt]==joueur){  //y+cpt et pas -
    	cpt++;
    	win++;
    	printf("win droite2 = %d",win); //retirer
    	}
    	else stop='V';
    	}
     return win;
    }
     
    /* Verifie la diagonale partant de la gauche */
    int VerifDiagoGauche(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     char stop='F';
     int win=1;
     while(win<4 && choix-cpt>0 && ligne+cpt<7 && stop=='F'){
    	if(tab[ligne+cpt][choix-cpt]==joueur){
    	cpt++;
    	win++;
    	printf("win gauche1= %d",win); //retirer
    	}
    	else stop='V';
     }
     cpt=1;
     stop='F';
     while(win<4 && choix+cpt<8 && ligne-cpt>0 && stop=='F'){
    	if(tab[ligne-cpt][choix+cpt]==joueur){
    	cpt++;
    	win++;
    	printf("win gauche2= %d",win); //retirer
    	}
    	else stop='V';
     }
     return win;
    }
     
    /* Verifie les axes des diagonales */
    int VerifDiago(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
    char victory='F';
    int win;
    win=VerifDiagoDroite(choix,ligne,joueur,tab);
    	if(win<4)win=VerifDiagoGauche(choix,ligne,joueur,tab);
     
    	if (win>=4) victory='V';
    return victory;
    }
     
    /* execute toute les sous-programme de verification du gagnant */
    int VerifGagner(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
      printf("Joueur %c tabpost %c choix: %d ligne: %d\n",joueur,tab[choix][ligne],choix,ligne);
      char winner;
      winner=VerifVerticale(choix, ligne,joueur,tab);
      printf("winner vaut == %c",winner);
    	if(winner=='F') winner=VerifHoriz(choix,ligne,joueur,tab);
    	printf("\n%c\n",winner);
     
    	if(winner=='F') winner=VerifDiago(choix,ligne,joueur,tab);
    	printf("\n%c\n",winner);
    return winner;
    }
     
    /* Alterne le joueur à chaque tour */
    int ChangeCouleur(char joueur){
    	printf("Le prochain joueur est le:");
    	if(joueur=='J') {
    	joueur='R';
    	printf(" rouge. \n");
    	}
    	else {
    	joueur='J';
    	printf(" jaune. \n");
    	}
    	return joueur;
     }
     
     int main(void){
     char grille[nb_ligne][nb_colonne];
     RemplirTab(grille);
     LireTab(grille);
     
     puts("Le 1er joueurs posséderas les pions jaunes");
     int nbpion=0;
     char couleur='J';
     char gagner='F';
     int choix;
     int ligne;
          while(gagner=='F' && nbpion<56){
          char ok='f';
                 while(ok=='f'){
                 choix = EntrerPion();
                 ok=VerifPion(choix, grille);
                 }
          ligne=PlacerPion(choix, couleur, grille);
          nbpion++;
    	    LireTab(grille);
          if (nbpion>3) gagner=VerifGagner(choix,ligne,couleur,grille);
    	  if (gagner=='F') couleur=ChangeCouleur(couleur);
    	  }
     
    	  if (gagner!='F'){
    		printf("Le gagnant est le joueur");
              if(couleur=='J') printf(" jaune. \n");
    		      else printf(" rouge. \n");
        }
     
    return EXIT_SUCCESS;
    }

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Linquisiteur Voir le message
    j'ai modifier pas mal de ce que tu ma conseiller.
    Indentation toujours catastrophique... seules les fonctions RemplirTab() et LireTab () ont été modifiées pour utiliser les constantes.
    Va falloir revoir ta définition de "pas mal"


    Citation Envoyé par Linquisiteur Voir le message
    Malheureusement j'ai encore ce même problème j'ai vérifier je ne vois pas de quel (ancien) x,y j'ai inverser.
    Regarde ce que représentent ligne et choix par rapport à x et y.

    Citation Envoyé par Linquisiteur Voir le message
    Pour les while et if que je pourrais rassembler je ne sais pas car j'ai des else à chaque fois. Donc j'ai peu de faire plus de mal qu'autre chose.
    J'ai recopié ta syntaxe et t'ai donné la solution. Je ne vois pas ce qui te bloque. Tes else ne servent strictement à rien à part dire "on veut sortir".

    Citation Envoyé par Linquisiteur Voir le message
    Edit: je ne comprend pas ce dont tu m'as parler avec les constante et nbpion directement lier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define nb_colonne 8
    #define nb_ligne 7
    Si je change ces 7 et 8 par d'autres nombres... est-ce que ton code marche ?
    Y a-t-il toujours 7*8=56 cases ? Dois-tu toujours vérifier colonne_saisie <= 8 ? etc...
    Dernière modification par Invité ; 03/05/2013 à 22h49. Motif: Edit inutile suite à suppression du Up précédent

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    j'ai un peu peur de modifier mes if et while. J'aimerais résoudre mon problème avant d'en créé de nouveau ^^'
    Désoler si ça semble nul de ma part

    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
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define nb_colonne 8
    #define nb_ligne 7
     
    /** Remplir un tableau de dimension x,y 
    * @param tab: un tableau à 2D de charactere vide
    * pré: un tableau vide.
    * post: sortie d'un tableau remplie.
    **/ 
    void RemplirTab(char tab[nb_ligne][nb_colonne]) {
         int i;
         for(i=0; i < nb_ligne; i++) {
              int j;
              for (j=0; j < nb_colonne; j++){
                  tab[i][j]='O';
              }
         }
    }
     
    /** Lire le tableau de dimension x,y
    * @param tab: un tableau initialisé de charactere
    * pré: un tableau 2D de charactere .
    * post: affichage en output du tableau
    **/ 
    void LireTab (char tab[nb_ligne][nb_colonne]){
     int i;
         for(i=0; i < nb_ligne; i++) {
              int j;
              printf("|");
              for (j=0; j < nb_colonne; j++)
              {
              printf("%c|",tab[i][j]);
              }
          puts("");
         }
    }
     
    /** Prendre le choix de la colonne où entrer le pion  
    * pré: rien
    * return numero: un nombre initialisé allant de 1 à 8
    **/
    int EntrerPion(){
     int numero=0;
     puts("Entrez le numero de la colonne: ");
          while(numero<1 || numero>nb_colonne){
               int c;
               scanf("%d",&numero);
               while ((c=getchar ())!= '\n' && c!= EOF);
          }
      numero--;
     return numero;
    }
     
    /** Verifie que la colonne ne soit pas complete
    * pré:
    * @param numero contient un nombre initialisé
    * @param tab contient un tableau de caractère initialisé
    * post: numero et tab sont inchangé
    * return: v ou f (vrai ou faux)
    **/
    int VerifPion(int numero, char tab[nb_ligne][nb_colonne]){
     char verif;
         if(tab[0][numero]=='O') verif='v';
         else {
         verif='f';
         puts("Colonne remplie");
         }
     return verif;
    }
     
    /** Entre le pion dans la grille
    * pré:
    * @param numero contient un nombre initialisé
    * @param joueur contient un char initialisé
    * @param tab contient un tableau de caractère initialisé
    * post: numero et joueur sont inchangé, tab est modifié
    * return ligne: int initialisé de 0 à 6
    **/
    int PlacerPion(int numero,char joueur, char tab[nb_ligne][nb_colonne]){
        int ligne=nb_ligne;
    	while(tab[ligne][numero]!='O'){
        ligne--;
        }
     tab[ligne][numero]=joueur;
    return ligne;
    }
     
    /** Verifie l'axe verticale du tableau pour trouver le gagnant
    * pré:
    * @param choix contient un nombre initialisé
    * @param ligne contient un nombre initialisé
    * @param joueur contient un char initialisé
    * @param tab contient un tableau de caractère initialisé
    * post: choix, ligne joueur et tab ne sont pas modifier
    * return victory: V ou F(Vrai ou Faux)
    **/
    int VerifVerticale(int choix, int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
     char victory='F';
     int win=0;
        if(ligne<=3){ //si on a 4 pion aligner ou plus
         int cpt=0;
    		while(cpt<=3){
                if(tab[ligne+cpt][choix]==joueur){
    			 win++;
    			 cpt++;
    			}
    			else cpt=4;
    		}
    	}
     
    	if(win==4) victory='V';
    return victory;
    }
     
    /** Verifie l'axe horizontale
    * pré:
    * @param choix contient un nombre initialisé
    * @param ligne contient un nombre initialisé
    * @param joueur contient un char initialisé
    * @param tab contient un tableau de caractère initialisé
    * post: choix, ligne joueur et tab ne sont pas modifier
    * return victory: V ou F(Vrai ou Faux)
    **/
    int VerifHoriz(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     int win=1;
     char victory;
    	while(win<4 && choix+cpt<nb_colonne){
    		if(tab[ligne][choix+cpt]==joueur){
    		win++;
    		cpt++;
    		}
    		else cpt=nb_colonne;
    	}
        cpt=1;
     
    	while(win<4 && choix-cpt>-1){
    		if(tab[ligne][choix-cpt]==joueur){
    		win++;
    		cpt++; 
    		}
    		else cpt=nb_colonne;
    	}
     
    	if(win>=4)victory = 'V';
    	else victory = 'F';
     
     return victory;
    }
     
    /** Verifie la diagonale partant de la droite
    * pré:
    * @param choix contient un nombre initialisé
    * @param ligne contient un nombre initialisé
    * @param joueur contient un char initialisé
    * @param tab contient un tableau de caractère initialisé
    * post: choix, ligne joueur et tab ne sont pas modifier
    * return win nombre initialisé égale ou plus grand que 1
    **/
    int VerifDiagoDroite(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     char stop='F';
     int win=1;
    	while(win<4 && choix+cpt<nb_colonne && ligne+cpt<nb_ligne && stop=='F'){
    		if(tab[ligne+cpt][choix+cpt]==joueur){
    		cpt++;
    		win++;
    		printf("win droite1= %d",win); //retirer
    		}
    		else stop='V';
    	}
     cpt=1;
     stop='F';
     while(win<4 && choix-cpt>0 && ligne-cpt>0 && stop=='F'){
    	if(tab[ligne-cpt][choix-cpt]==joueur){
    	cpt++;
    	win++;
    	printf("win droite2 = %d",win); //retirer
    	}
    	else stop='V';
    	}
     return win;
    }
     
    /** Verifie la diagonale partant de la gauche
    * pré:
    * @param choix contient un nombre initialisé
    * @param ligne contient un nombre initialisé
    * @param joueur contient un char initialisé
    * @param tab contient un tableau de caractère initialisé
    * post: choix, ligne joueur et tab ne sont pas modifier
    * return win nombre initialisé égale ou plus grand que 1
    **/
    int VerifDiagoGauche(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
     int cpt=1;
     char stop='F';
     int win=1;
     while(win<4 && choix-cpt>0 && ligne+cpt<nb_ligne && stop=='F'){
    	if(tab[ligne+cpt][choix-cpt]==joueur){
    	cpt++;
    	win++;
    	printf("win gauche1= %d",win); //retirer
    	}
    	else stop='V';
     }
     cpt=1;
     stop='F';
     while(win<4 && choix+cpt<nb_colonne && ligne-cpt>0 && stop=='F'){
    	if(tab[ligne-cpt][choix+cpt]==joueur){
    	cpt++;
    	win++;
    	printf("win gauche2= %d",win); //retirer
    	}
    	else stop='V';
     }
     return win;
    }
     
    /** Verifie les axes des diagonales
    * pré:
    * @param choix contient un nombre initialisé
    * @param ligne contient un nombre initialisé
    * @param joueur contient un char initialisé
    * @param tab contient un tableau de caractère initialisé
    * post: choix, ligne joueur et tab ne sont pas modifier
    * return victory: V ou F(Vrai ou Faux)
    **/
    int VerifDiago(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
    char victory='F';
    int win;
    win=VerifDiagoDroite(choix,ligne,joueur,tab);
    	if(win<4)win=VerifDiagoGauche(choix,ligne,joueur,tab);
     
    	if (win>=4) victory='V';
    return victory;
    }
     
    /** execute toute les sous-programme de verification du gagnant
    * pré:
    * @param choix contient un nombre initialisé
    * @param ligne contient un nombre initialisé
    * @param joueur contient un char initialisé
    * @param tab contient un tableau de caractère initialisé
    * post: choix, ligne joueur et tab ne sont pas modifier
    * return winner: V ou F(Vrai ou Faux)
    **/
    int VerifGagner(int choix,int ligne,char joueur, char tab[nb_ligne][nb_colonne]){
      printf("Joueur %c tabpost %c choix: %d ligne: %d\n",joueur,tab[choix][ligne],choix,ligne);
      char winner;
      winner=VerifVerticale(choix, ligne,joueur,tab);
      printf("winner vaut == %c",winner);
    	if(winner=='F') winner=VerifHoriz(choix,ligne,joueur,tab);
    	printf("\n%c\n",winner);
     
    	if(winner=='F') winner=VerifDiago(choix,ligne,joueur,tab);
    	printf("\n%c\n",winner);
    return winner;
    }
     
    /** Alterne le joueur à chaque tour
    * pré:
    * @param joueur: char initialisé
    * post joueur est modifié
    * return joueur: char initialisé
    **/
    int ChangeCouleur(char joueur){
    	printf("Le prochain joueur est le:");
    	if(joueur=='J') {
    	joueur='R';
    	printf(" rouge. \n");
    	}
    	else {
    	joueur='J';
    	printf(" jaune. \n");
    	}
    	return joueur;
     }
     
     int main(void){
     char grille[nb_ligne][nb_colonne];
     RemplirTab(grille);
     LireTab(grille);
     
     puts("Le 1er joueurs posséderas les pions jaunes");
     int nbpion=0;
     char couleur='J';
     char gagner='F';
     int choix;
     int ligne;
          while(gagner=='F' && nbpion<(nb_ligne*nb_colonne)){
          char ok='f';
                 while(ok=='f'){
                 choix = EntrerPion();
                 ok=VerifPion(choix, grille);
                 }
          ligne=PlacerPion(choix, couleur, grille);
          nbpion++;
    	    LireTab(grille);
          if (nbpion>3) gagner=VerifGagner(choix,ligne,couleur,grille);
    	  if (gagner=='F') couleur=ChangeCouleur(couleur);
    	  }
     
    	  if (gagner!='F'){
    		printf("Le gagnant est le joueur");
              if(couleur=='J') printf(" jaune. \n");
    		      else printf(" rouge. \n");
        }
     
    return EXIT_SUCCESS;
    }

Discussions similaires

  1. Mon script provoque une erreur et je ne comprends pas ce qui cloche !
    Par philou8 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/06/2011, 11h46
  2. Réponses: 8
    Dernier message: 26/04/2009, 10h11
  3. Je ne vois pas le container qui n'a pas de bouton
    Par rXpCH dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 03/07/2008, 16h32
  4. [UML] Je ne vois pas où mettre la vue !
    Par le Daoud dans le forum MVC
    Réponses: 12
    Dernier message: 19/03/2006, 09h31
  5. Qu'est qui cloche dans la requete suivante ?
    Par romeo9423 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/02/2005, 19h20

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