Problème puissance 4

cs_tlmvpsp Messages postés 2 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 15 décembre 2011 - 15 déc. 2011 à 16:30
BunoCS Messages postés 15331 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 7 décembre 2022 - 16 déc. 2011 à 11:50
Voila, mon problème se situe au niveau du "check vertical" à savoir que mon programme ne comprend pas lorsque un joueur gagne en vertical.
Je n'arrive pas à voir où est le problème, s'il se situe dans ma fonction "checkvertical" ou bien dans le main??
Merci de bien vouloir éclairer ma lanterne...


Le programme:



#include <stdio.h>
#include <stdlib.h>


#define LIGNES 6
#define COLONNES 7

////////////////////////////// AFFICHER //////////////////////////////

void afficherPlateau (char plateauJeu [LIGNES][COLONNES]){

int i, j;

printf("\n=============================\n");
printf("| 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n");
printf("=============================\n");


for(i=0 ; i<LIGNES ; i++){

printf("-----------------------------\n");
printf("|");

for(j=0 ; j<COLONNES ; j++){

printf(" %c |", plateauJeu [i][j]);

}

printf("\n");

}

printf("-----------------------------\n\n");
}


////////////////////////////// TEST PLATEAU PLEIN //////////////////////////////


int checkplateau ( int plateau [LIGNES][COLONNES]){

int i, j;

for(i=0 ; i<LIGNES ; i++){

for(j=0 ; j<COLONNES ; j++){

if( plateau [i][j] == 0){

return 0;

}
}
}

return 1;
}


////////////////////////////// TEST PLAYER VALIDE //////////////////////////////

int checkplayer (int player){

if(player 1 || player 2){

return 1;

}

return 0;
}



////////////////////////////// TEST LIGNES VALIDE //////////////////////////////

int checklineok (joueur){

if(joueur >= 0 && joueur<LIGNES){

return 1;

}

return 0;

}


////////////////////////////// TEST COLONNE VALIDE //////////////////////////////

int checkcolumnok (joueur){

if(joueur >= 0 && joueur<=COLONNES){

return 1;

}

return 0;

}


////////////////////////////// TEST COLONNES PLEINE //////////////////////////////

int testColonne (int plateau [LIGNES][COLONNES], int joueur, int *colonne){

if(checkcolumnok (joueur)){

if(*colonne<COLONNES){

*colonne ++;
return 1;

}

}

return 0;
}



////////////////////////////// REMPLISSAGE JOUEUR 1 //////////////////////////////

void remplissagePlateau (char plateauJeu [LIGNES][COLONNES], int plateau [LIGNES][COLONNES], int joueur, int player){

int i=LIGNES-1;
int n=0;

while(n==0 && i>=0){

if(plateau [i][joueur-1] == 1 || plateau [i][joueur-1] == 2){

i--;

}

else if (plateau [i][joueur-1] == 0){

if(player == 1){

plateauJeu [i][joueur-1] = 'O';
plateau [i][joueur-1] = player;
n++;

}

else if(player == 2){

plateauJeu [i][joueur-1] = 'X';
plateau [i][joueur-1] = 2;
n++;

}
}
}
}





////////////////////////////// CHECK VERTICALES JOUEUR //////////////////////////////

int checkVerticale (int plateau [LIGNES][COLONNES], int player){

int i,j;
for(i=0;i<7;i++)
{
for(j=0;j<3;j++)
{
if(plateau[i][j]==1 && plateau[i][j+1]==1 && plateau[i][j+2]==1 && plateau[i][j+3]==1){
return 1;
}
else {
return 0;
}
}
}
}






////////////////////////////// CHECK HORIZONTALES JOUEUR //////////////////////////////

int checkHorizontale (int plateau [LIGNES][COLONNES], int player){

int i,j;
int compt;

for(i=0 ; i<LIGNES ; i++){

compt = 0;

for(j=0 ; j<COLONNES ; j++){

if(plateau [i][j] == player){

compt ++;

}



else if(compt >= 4){

return 1;

}

else {

compt = 0;

}
}

}

return 0;
}


////////////////////////////// RETOURNE PLAYER DANS LA CASE JOUEE //////////////////////////////

int case_egale_player (int plateau [LIGNES][COLONNES], int player, int joueur){

int i;

if(checklineok (joueur) && checkcolumnok (joueur)){

for(i= LIGNES-1 ; i>=0 ; i--){

if (checkplayer (player)){

if(plateau [i][joueur] == 0){

plateau [i][joueur] = player;

return player;

}
}

}
}

return 0;
}







////////////////////////////// CLEAR SCREEN //////////////////////////////

void ClearScreen()
{
int n;
for (n = 0; n < 10; n++)
printf( "\n\n\n\n\n\n\n\n\n\n" );
}



////////////////////////////// MAIN //////////////////////////////

int main (void) {

char plateauJeu [LIGNES][COLONNES] = {" " , " " , " " , " " , " " , " "};
int plateau [LIGNES][COLONNES] = {{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0}};
int joueur, player = 1;
//char nom1 [20], nom2 [20];
int colonne = 0;

printf("Bienvenue dans le jeu du PUISSANCE 4 !\n\n");

/*printf("(Pour afficher l'aide tapez << ? >> )\n\n");

printf("Joueur 1, choississez votre nom : ");
scanf("%s", &nom1);

printf("Joueur 2, choississez votre nom : ");
scanf("%s", &nom2);*/

afficherPlateau(plateauJeu);


while(checkplateau(plateau) != 1){

printf("Joueur %d , choississez une colonne : ", player);
scanf("%d", &joueur);

if(checkcolumnok(joueur) && testColonne(plateau, joueur, &colonne) ){

remplissagePlateau(plateauJeu, plateau, joueur, player);
afficherPlateau(plateauJeu);

if(checkHorizontale(plateau, player) || checkVerticale(plateau, player)){

printf("Joueur %d gagne!", player);
return 0;

}
}

while(checkcolumnok(joueur) == 0){

printf("Le numero de cette colonne n'est pas valide, veuillez rejouer : ");
scanf("%d", joueur);

if(checkcolumnok(joueur) && testColonne(plateau, joueur, &colonne) ){

remplissagePlateau(plateauJeu, plateau, joueur, player);
afficherPlateau(plateauJeu);

if(checkHorizontale(plateau, player) || checkVerticale(plateau, player)){

printf("Joueur %d gagne!", player);
return 0;

}
}
}

while(testColonne(plateau, joueur, &colonne) == 0){

printf(" Cette colonne est deja pleine, veuillez rejouer : ");
scanf("%d", joueur);

if(checkcolumnok(joueur) && testColonne(plateau, joueur, &colonne) ){

remplissagePlateau(plateauJeu, plateau, joueur, player);
afficherPlateau(plateauJeu);

if(checkHorizontale(plateau, player) || checkVerticale(plateau, player)){

printf("Joueur %d gagne!", player);
return 0;

}
}

}


player ++;

if (checkplayer(player) == 0){
player=1;

}
}


/*while(k<1000){

printf("%s , choississez une colonne : ", nom1);
scanf("%d", &joueur1);

printf("dfasdv : %d\n", testColonne(plateau, joueur1));


if(testColonne(plateau, joueur1) == 0){

remplissagePlateau1 (plateauJeu, plateau, joueur1);
afficherPlateau(plateauJeu);


if(checkHorizontale1(plateau)==1 || checkVerticale1(plateau)==1){

printf("%s gagne!\n", nom1);

return 0;
}

}


else if(testColonne(plateau, joueur1) == 1){

if(checkHorizontale1(plateau)==1 || checkVerticale1(plateau)==1){

printf("%s gagne!\n", nom1);

return 0;
}

else{

printf("Cette colonne est deja pleine. Veuillez re-jouer : \n");
printf("%s , choississez une colonne : ", nom1);
scanf("%d", &joueur1);
remplissagePlateau1 (plateauJeu, plateau, joueur1);
afficherPlateau(plateauJeu);


}

}

printf("%s , choississez une colonne : ", nom2);
scanf("%d", &joueur2);

printf("dfasdv : %d\n", testColonne(plateau, joueur2));



if(testColonne(plateau, joueur2) == 0){

remplissagePlateau2 (plateauJeu, plateau, joueur2);
afficherPlateau(plateauJeu);
checkHorizontale2(plateau);
checkVerticale2(plateau);

if(checkHorizontale2(plateau)==1 || checkVerticale2(plateau)==1){

printf("%s gagne!\n", nom2);

return 0;
}


}

else if(testColonne(plateau, joueur2) == 1){

if(checkHorizontale2(plateau)==1 || checkVerticale1(plateau)==1){

printf("%s gagne!\n", nom2);

return 0;
}

else{

printf("Cette colonne est deja pleine. Veuillez re-jouer : \n");
printf("%s , choississez une colonne : ", nom2);
scanf("%d", &joueur2);
remplissagePlateau2 (plateauJeu, plateau, joueur2);
afficherPlateau(plateauJeu);
checkHorizontale2(plateau);
checkVerticale2(plateau);

}

}



k++;*/



return 0;

}

5 réponses

BunoCS Messages postés 15331 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 7 décembre 2022 103
15 déc. 2011 à 16:43
Bien le bonjour à toi aussi!!
Alors, 1èrement, ça ne doit pas compiler.. checklineok et checkcolumnok: il manque le type de a variable "joueur".
Ensuite, merci d'utiliser les balises "code". C'est la 3e icone en partant de la droite, juste au-dessus de la zone de texte.
Enfin, je penche pour un problème dans la méthode checkVertical. Pourquoi ne pas l'avoir bâti suivant le même modèle de checkHorizontal? Par exemple, tu n'utilise pas le paramètre player...


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
BunoCS Messages postés 15331 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 7 décembre 2022 103
15 déc. 2011 à 16:54
Tiens, autre remarque.
Ta méthode main contient 3 boucles while. C'est inutile, 1 seule suffit.


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_tlmvpsp Messages postés 2 Date d'inscription vendredi 25 novembre 2011 Statut Membre Dernière intervention 15 décembre 2011
15 déc. 2011 à 21:21
Bonjour Buno et merci pour vos réponses.
J'ai, comme vous l'avez suggéré, modifié mon checkvertical mais cela ne marche toujours pas.
Le programme demande simplement de placer un nouveau jeton alors que 4 jetons ou plus sont déjà alignés verticalement.
Si vous pouviez y jeter un coup d'oeil et me dire ce que vous pensez qui ne va pas...
merci d'avance.
(pour ce qui est des balises "code" j'ai cliqué sur la 3ème icone j'espère que sa vous ira)




[u]
#include <stdio.h>
#include <stdlib.h>


#define LIGNES 6
#define COLONNES 7

////////////////////////////// AFFICHER //////////////////////////////

void afficherPlateau (char plateauJeu [LIGNES][COLONNES]){

int i, j;

printf("\n=============================\n");
printf("| 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n");
printf("=============================\n");


for(i=0 ; i<LIGNES ; i++){

printf("-----------------------------\n");
printf("|");

for(j=0 ; j<COLONNES ; j++){

printf(" %c |", plateauJeu [i][j]);

}

printf("\n");

}

printf("-----------------------------\n\n");
}


////////////////////////////// TEST PLATEAU PLEIN //////////////////////////////


int checkplateau ( int plateau [LIGNES][COLONNES]){

int i, j;

for(i=0 ; i<LIGNES ; i++){

for(j=0 ; j<COLONNES ; j++){

if( plateau [i][j] == 0){

return 0;

}
}
}

return 1;
}


////////////////////////////// TEST PLAYER VALIDE //////////////////////////////

int checkplayer (int player){

if(player 1 || player 2){

return 1;

}

return 0;
}



////////////////////////////// TEST LIGNES VALIDE //////////////////////////////

int checklineok (int joueur){

if(joueur >= 0 && joueur<LIGNES){

return 1;

}

return 0;

}


////////////////////////////// TEST COLONNE VALIDE //////////////////////////////

int checkcolumnok (int joueur){

if(joueur > 0 && joueur<=COLONNES){

return 1;

}

return 0;

}


////////////////////////////// TEST COLONNES PLEINE //////////////////////////////

int testColonne (int plateau [LIGNES][COLONNES], int joueur, int *colonne){

if(checkcolumnok (joueur)){

if(*colonne<COLONNES){

*colonne ++;
return 1;

}

}

return 0;
}



////////////////////////////// REMPLISSAGE JOUEUR 1 //////////////////////////////

void remplissagePlateau (char plateauJeu [LIGNES][COLONNES], int plateau [LIGNES][COLONNES], int joueur, int player){

int i=LIGNES-1;
int n=0;

while(n==0 && i>=0){

if(plateau [i][joueur-1] == 1 || plateau [i][joueur-1] == 2){

i--;

}

else if (plateau [i][joueur-1] == 0){

if(player == 1){

plateauJeu [i][joueur-1] = 'O';
plateau [i][joueur-1] = player;
n++;

}

else if(player == 2){

plateauJeu [i][joueur-1] = 'X';
plateau [i][joueur-1] = 2;
n++;

}
}
}
}




////////////////////////////// CHECK VERTICALES JOUEUR 1 //////////////////////////////

int checkVerticale (int plateau [LIGNES][COLONNES], int player){

int i,j;
int compt;

for(i=0 ; i<COLONNES ; i++){

compt = 0;

for(j=LIGNES-1 ; j>=0 ; j--){

if(plateau [i][j] == player){

compt ++;

}

if(compt >= 4){

return 1;

}

else{

compt = 0;

}

}

}

return 0;
}




////////////////////////////// CHECK HORIZONTALES JOUEUR 1 //////////////////////////////

int checkHorizontale (int plateau [LIGNES][COLONNES], int player){

int i,j;
int compt;

for(i=0 ; i<LIGNES ; i++){

compt = 0;

for(j=0 ; j<COLONNES ; j++){

if(plateau [i][j] == player){

compt ++;

}



else if(compt >= 4){

return 1;

}

else {

compt = 0;

}
}

}

return 0;
}


////////////////////////////// RETOURNE PLAYER DANS LA CASE JOUEE //////////////////////////////

int case_egale_player (int plateau [LIGNES][COLONNES], int player, int joueur){

int i;

if(checklineok (joueur) && checkcolumnok (joueur)){

for(i= LIGNES-1 ; i>=0 ; i--){

if (checkplayer (player)){

if(plateau [i][joueur] == 0){

plateau [i][joueur] = player;

return player;

}
}

}
}

return 0;
}



////////////////////////////// CHECK DIAGONALES JOUEUR 1 //////////////////////////////

int checkDiago1 (int plateau [LIGNES][COLONNES]){

int i;
int compteur = 0;

for(i=0 ; i<COLONNES ; i++){

if(plateau [i][i] == 1){

compteur ++;

}

else if (compteur >=4){

return 1;

}

else {

compteur = 0;

}
}

return 0;

}


////////////////////////////// CHECK DIAGONALES JOUEUR 2 //////////////////////////////

int checkDiago2 (int plateau [LIGNES][COLONNES]){


int i;
int compteur = 0;

for(i=0 ; i<COLONNES ; i--){

if(plateau [i][i] == 1){

compteur ++;

}

else {

compteur = 0;

}
}

if (compteur >=4){

return 1;

}

else {

return 0;

}


}



////////////////////////////// CLEAR SCREEN //////////////////////////////

void ClearScreen()
{
int n;
for (n = 0; n < 10; n++)
printf( "\n\n\n\n\n\n\n\n\n\n" );
}



////////////////////////////// MAIN //////////////////////////////

int main (void) {

char plateauJeu [LIGNES][COLONNES] = {" " , " " , " " , " " , " " , " "};
int plateau [LIGNES][COLONNES] = {{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0},{0,0,0,0,0,0,0}};
int joueur, player = 1;
//char nom1 [20], nom2 [20];
int colonne = 0;

printf("Bienvenue dans le jeu du PUISSANCE 4 !\n\n");

/*printf("(Pour afficher l'aide tapez << ? >> )\n\n");

printf("Joueur 1, choississez votre nom : ");
scanf("%s", &nom1);

printf("Joueur 2, choississez votre nom : ");
scanf("%s", &nom2);*/

afficherPlateau(plateauJeu);


while(checkplateau(plateau) != 1){

printf("Joueur %d , choississez une colonne : ", player);
scanf("%d", &joueur);

if(checkcolumnok(joueur) && testColonne(plateau, joueur, &colonne) ){

remplissagePlateau(plateauJeu, plateau, joueur, player);
afficherPlateau(plateauJeu);

if(checkHorizontale(plateau, player) || checkVerticale(plateau, player)){

printf("Joueur %d gagne!", player);
return 0;

}
}

while(checkcolumnok(joueur) == 0){

printf("Le numero de cette colonne n'est pas valide, veuillez rejouer : ");
scanf("%d", joueur);

if(checkcolumnok(joueur) && testColonne(plateau, joueur, &colonne) ){

remplissagePlateau(plateauJeu, plateau, joueur, player);
afficherPlateau(plateauJeu);

if(checkHorizontale(plateau, player) || checkVerticale(plateau, player)){

printf("Joueur %d gagne!", player);
return 0;

}
}
}

while(testColonne(plateau, joueur, &colonne) == 0){

printf(" Cette colonne est deja pleine, veuillez rejouer : ");
scanf("%d", joueur);

if(checkcolumnok(joueur) && testColonne(plateau, joueur, &colonne) ){

remplissagePlateau(plateauJeu, plateau, joueur, player);
afficherPlateau(plateauJeu);

if(checkHorizontale(plateau, player) || checkVerticale(plateau, player)){

printf("Joueur %d gagne!", player);
return 0;

}
}

}


player ++;

if (checkplayer(player) == 0){
player=1;

}
}


return 0;

}

/u
0
BunoCS Messages postés 15331 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 7 décembre 2022 103
16 déc. 2011 à 08:48
A droite! 3e icone à droite!!
C'est encore plus illisible comme cela...
Bon, je regarderais ça quand j'aurais un peu de temps...mais je te conseille de voir en debug, avec point d'arrêt, pourquoi ta solution ne fonctionne pas.

@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15331 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 7 décembre 2022 103
16 déc. 2011 à 11:50
Ta condition else était mal placée. Tu remettais systématiquement le compteur à 0. Une solution:

int checkVerticale (int plateau [LIGNES][COLONNES], int player){ 

  int i,j; 
  int compt; 

  for(j=0 ; j<COLONNES ; j++)
  { 
    compt = 0; 

    for(i=0 ; i<LIGNES ; i++)
    { 
      if(plateau [i][j] == player)
      { 
        compt ++; 
      }
      else
      {
        compt = 0;
      }

      if(compt >= 4)
      { 
        return 1; 
      } 

      //else{ 
      //  compt = 0; 
      //} 
    } 
  } 

  return 0; 
}


NB: Tu vois l'intérêt des balises "code"

@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0