Problème puissance 4

Signaler
Messages postés
2
Date d'inscription
vendredi 25 novembre 2011
Statut
Membre
Dernière intervention
15 décembre 2011
-
Messages postés
14814
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 octobre 2020
-
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;

}
A voir également:

5 réponses

Messages postés
14814
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 octobre 2020
93
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...
Messages postés
14814
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 octobre 2020
93
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...
Messages postés
2
Date d'inscription
vendredi 25 novembre 2011
Statut
Membre
Dernière intervention
15 décembre 2011

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
Messages postés
14814
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 octobre 2020
93
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...
Messages postés
14814
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
30 octobre 2020
93
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...