[C] Jeux du morpion. [Résolu/Fermé]

Signaler
Messages postés
239
Date d'inscription
mercredi 8 octobre 2008
Statut
Membre
Dernière intervention
1 mars 2014
-
Messages postés
239
Date d'inscription
mercredi 8 octobre 2008
Statut
Membre
Dernière intervention
1 mars 2014
-
Bonjour,
J'ai essayé de programmer un jeu du morpion en langage C, mais voilà, j'ai deux ou trois petis bug que je n'arrive pas à corriger. Si cela ne vous dérange pas trop, je voudrais que vous m'aidiez à réduire au néant les bugs dans mon programme.

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

int choixJ1(char Joueur1[]); //permet au joueur de saisir une case de jeu
int choixJ2(char Joueur2[]); //permet au joueur de saisir une case de jeu
void afficheTableau(char carre[]); //affiche la grille de jeu
char verifierChoix(int choixCase, char carre[], int joueurCommence, int rejouer); /*verifie si la case est déjà jouée et la remplace par X ou par 0*/
int verifierGagne(char carre[], int gagne); //verifie si il y a 3 X ou 3 0 alignés et si c'est le cas dis quel joueur à gagné

int main()
{
int rejouer = 0, i = 0;
int choixCase = 0;
int gagne = 0; // variable qui lorsque un joueur gagne est mise a 1 et arrête le jeu
char carre[9] = {'1','2','3','4','5','6','7','8','9'}; //grille de jeu
char Joueur1[50] = {0}; // char contenant le nom du joueur 1
char Joueur2[50] = {0}; // char contenant le nom du joueur 2
srand(time(NULL));
int MIN = 1, MAX = 2, joueurCommence = (rand() % (MAX - MIN + 1)) + MIN; //tirage au sort du joueur qui commence.
	
	printf("================Bienvenue dans le jeu du pendu !================\n\n");
	printf("Veuillez saisir le nom du joueur 1 : ");
	scanf("%s", Joueur1);
	printf("\n\nMaintenant celui du joueur 2 : ");
	scanf("%s", Joueur2);
	printf("\n\nLe jeu peut commencer !");

 afficheTableau(carre); // affiche la grille de jeu.

while(gagne != 1) //boucle principale du jeu
{
  do 
   {
     rejouer = 0;
	if(joueurCommence == 1)	// si le joueur 1 a été tiré au sort
        choixJ1(Joueur1); //on récupère la saisie au de la case à jouer.
	else //si le joueur 2 a été tiré au sort
	choixJ2(Joueur2); //on récupère la saisie de la case à jouer
		
	verifierChoix(choixCase, carre, joueurCommence, rejouer); //on appelle la fonction verifierChoix.
        
      }while(rejouer != 0); //on recommence cela tant que la case jouée ne l'est pas déjà

afficheTableau(carre); // on réaffiche la grille avec les changements.
verifierGagne(carre, gagne); //on vérifie si le joueur a gagné  

if(gagne == 1 && joueurCommence == 1)//si le joueur 1 a gagné
{
	printf("\n\nBravo %s, vous avez gagne !", Joueur1);
	break;
}
else if(gagne == 1 && joueurCommence == 2)//si le joueur 2 a gagné
{
	printf("\n\nBravo %s, vous avez gagne !", Joueur2);
	break;
}

i++;

if(i==9)//si toutes les cases sont jouées et qu'il n'y a pas de gagnant.
{
  printf("\nMatch nul, dommage.");
  break;
}

if(joueurCommence == 1)// on change l'ordre des joueurs
{
 joueurCommence == 2;
}
else if(joueurCommence == 2)
{
 joueurCommence == 1;
}
}

printf("\n\nAu revoir !");
return 0;
}

void afficheTableau(char carre[]) 
{
printf("&#9487;&#9473;&#9473;&#9473;&#9473;&#9523;&#9473;&#9473;&#9473;&#9473;&#9523;&#9473;&#9473;&#9473;&#9473;&#9491;\n");
        printf("&#9475; %c  &#9475; %c  &#9475; %c  &#9475;\n", carre[0], carre[1], carre[2]);
        printf("&#9507;&#9473;&#9473;&#9473;&#9473;&#9547;&#9473;&#9473;&#9473;&#9473;&#9547;&#9473;&#9473;&#9473;&#9473;&#9515;\n");
        printf("&#9475; %c  &#9475; %c  &#9475; %c  &#9475;\n", carre[3], carre[4], carre[5]);
        printf("&#9507;&#9473;&#9473;&#9473;&#9473;&#9547;&#9473;&#9473;&#9473;&#9473;&#9547;&#9473;&#9473;&#9473;&#9473;&#9515;\n");
        printf("&#9475; %c  &#9475; %c  &#9475; %c  &#9475;\n", carre[6], carre[7], carre[8]);
        printf("&#9495;&#9473;&#9473;&#9473;&#9473;&#9531;&#9473;&#9473;&#9473;&#9473;&#9531;&#9473;&#9473;&#9473;&#9473;&#9499;\n");
}

int choixJ1(char Joueur1[])
{
 int choixCase = 0;

do {
 printf("%s choisissez la case ou vous voulez jouer : ", Joueur1);
 scanf("%d", &choixCase);
}while(choixCase < 1 || choixCase > 9);

return choixCase;
}

int choixJ2(char Joueur2[])
{
 int choixCase = 0;

do {
 printf("%s choisissez la case ou vous voulez jouer : ", Joueur2);
 scanf("%d", &choixCase);
}while(choixCase < 1 || choixCase > 9);
return choixCase;
}

char verifierChoix(int choixCase, char carre[], int joueurCommence, int rejouer)
{
 int i = 0;
 int j = 1;
 for(i = 0 ; i < 9 ; i++)
 {
  if(choixCase == j && carre[i] != 1 && joueurCommence == 1)
   {
    carre[i] = 'X';
    j++;
	rejouer = 0;
   }
  else if(choixCase == j && carre[i] != 1 && joueurCommence == 2)
   {
    carre[i] = '0';
    j++;
	rejouer = 0;
   }
   else
   {
   rejouer = 1;
   return rejouer;
   }
  }
return carre[];
}

int verifierGagne(char carre[], int gagne)
{
	if( (carre[0] == carre[1] && carre[0] == carre[2]) || (carre[3] == carre[4] && carre[3] == carre[5]) ||
        (carre[6] == carre[7] && carre[6] == carre[8]) || (carre[0] == carre[3] && carre[0] == carre[6]) ||
        (carre[1] == carre[4] && carre[1] == carre[7]) || (carre[2] == carre[5] && carre[2] == carre[8]) ||
        (carre[0] == carre[4] && carre[0] == carre[8]) || (carre[2] == carre[4] && carre[2] == carre[6])  )
   {
	   gagne = 1;
   }
   else
   {
	   gagne = 0;
   }
return gagne;
}


Voilà, voilà, si vous n'y arrivez pas tant pis je me débrouillerai autrement. De plus j'accepte toutes les remarques (mêmes négatives) sur l'ensemble de mon programme (s'il pourrait être amélioré et comment,...).

Et bien en attente d'une réponse je vous remercie !

PS : les erreurs sont :
-main.c:69: attention : déclaration sasn effet
-main.c:73: attention : déclaration sasn effet
-main.c:139: erreur: expected expression before ‘]’ token
-main.c:140: attention : control reaches end of non-void function

8 réponses

Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
135
joueurCommence == 2;
Inutile ou plus probablement erreur d'inattention.

char verifierChoix(int choixCase, char carre[], int joueurCommence, int rejouer)
return carre[];

carre[] n'est pas un caractère !

Bonne continuation.
Messages postés
239
Date d'inscription
mercredi 8 octobre 2008
Statut
Membre
Dernière intervention
1 mars 2014
5
Merci, j'ai modifier ce que tu m'as dis, mais j'obtiens une nouvelle erreur :
main.c:139: attention : return makes integer from pointer without a cast.

Voici la fonction ou il y a l'erreur :
int verifierChoix(int choixCase, char carre[], int joueurCommence, int rejouer)
{
 int i = 0;
 int j = 1;
 for(i = 0 ; i < 9 ; i++)
 {
  if(choixCase == j && carre[i] != 1 && joueurCommence == 1)
   {
    carre[i] = 'X';
    j++;
	rejouer = 0;
   }
  else if(choixCase == j && carre[i] != 1 && joueurCommence == 2)
   {
    carre[i] = '0';
    j++;
	rejouer = 0;
   }
   else
   {
   rejouer = 1;
   return rejouer;
   }
  }
return carre;
}

Tu as :
return carre;

qui est un pointeur alors que ta fonction retourne un int.
Retourne plutot une valeur d'erreur comme -1.

Bon courage.
Messages postés
239
Date d'inscription
mercredi 8 octobre 2008
Statut
Membre
Dernière intervention
1 mars 2014
5
Merci.
Messages postés
239
Date d'inscription
mercredi 8 octobre 2008
Statut
Membre
Dernière intervention
1 mars 2014
5
Bonjour,
J'ai corrigé mon programme, et la compilation marche ! En revanche, j'ai un petit soucis : lorsque le jeu demande au joueur de sélectionner la case ou il veut jouer, j'entre dans une sorte de boucle infinie :

"ben choisissez la case ou vous voulez jouer : "
"ben choisissez la case ou vous voulez jouer : "
"ben choisissez la case ou vous voulez jouer : "
...

Et que je choisisse de jouer sur la première ou la dernière case on me redemande toujours de saisir une case.

Voici mon code corrigé :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int choixJ1(char Joueur1[]); //permet au joueur de saisir une case de jeu
int choixJ2(char Joueur2[]); //permet au joueur de saisir une case de jeu
void afficheTableau(char carre[]); //affiche la grille de jeu
void verifierChoix(int choixCase, char carre[], int joueurCommence, int *rejouer); /*verifie si la case est déjà jouée et la remplace par X ou par 0*/
int verifierGagne(char carre[], int gagne); //verifie si il y a 3 X ou 3 0 alignés et si c'est le cas dis quel joueur à gagné

int main()
{
int rejouer = 1, i = 0;
int choixCase = 0;
int gagne = 0; // variable qui lorsque un joueur gagne est mise a 1 et arrête le jeu
char carre[9] = {'1','2','3','4','5','6','7','8','9'}; //grille de jeu
char Joueur1[50] = {0}; // char contenant le nom du joueur 1
char Joueur2[50] = {0}; // char contenant le nom du joueur 2
srand(time(NULL));
int MIN = 1, MAX = 2, joueurCommence = (rand() % (MAX - MIN + 1)) + MIN; //tirage au sort du joueur qui commence.
	
	printf("===================Bienvenue dans le jeu du morpion !===================\n\n");
	printf("Veuillez saisir le nom du joueur 1 : ");
	scanf("%s", Joueur1);
	printf("\n\nMaintenant celui du joueur 2 : ");
	scanf("%s", Joueur2);
	printf("\n\nLe jeu peut commencer !\n\n");

 afficheTableau(carre); // affiche la grille de jeu.

while(gagne != 1) //boucle principale du jeu
{
  do 
   {
     rejouer = 1;
	if(joueurCommence == 1)	// si le joueur 1 a été tiré au sort
        choixJ1(Joueur1); //on récupère la saisie au de la case à jouer.
	else //si le joueur 2 a été tiré au sort
	choixJ2(Joueur2); //on récupère la saisie de la case à jouer
		
	verifierChoix(choixCase, carre, joueurCommence, &rejouer); //on appelle la fonction verifierChoix.
        
      }while(rejouer == 1); //on recommence cela tant que la case jouée ne l'est pas déjà

afficheTableau(carre); // on réaffiche la grille avec les changements.
verifierGagne(carre, gagne); //on vérifie si le joueur a gagné  

if(gagne == 1 && joueurCommence == 1)//si le joueur 1 a gagné
{
	printf("\n\nBravo %s, vous avez gagne !", Joueur1);
	break;
}
else if(gagne == 1 && joueurCommence == 2)//si le joueur 2 a gagné
{
	printf("\n\nBravo %s, vous avez gagne !", Joueur2);
	break;
}

i++;

if(i==9)//si toutes les cases sont jouées et qu'il n'y a pas de gagnant.
{
  printf("\nMatch nul, dommage.");
  break;
}

joueurCommence = joueurCommence%2 +1; // on change les joueurs.
}

printf("\n\nAu revoir !");
return 0;
}

void afficheTableau(char carre[]) 
{
printf("&#9487;&#9473;&#9473;&#9473;&#9473;&#9523;&#9473;&#9473;&#9473;&#9473;&#9523;&#9473;&#9473;&#9473;&#9473;&#9491;\n");
        printf("&#9475; %c  &#9475; %c  &#9475; %c  &#9475;\n", carre[0], carre[1], carre[2]);
        printf("&#9507;&#9473;&#9473;&#9473;&#9473;&#9547;&#9473;&#9473;&#9473;&#9473;&#9547;&#9473;&#9473;&#9473;&#9473;&#9515;\n");
        printf("&#9475; %c  &#9475; %c  &#9475; %c  &#9475;\n", carre[3], carre[4], carre[5]);
        printf("&#9507;&#9473;&#9473;&#9473;&#9473;&#9547;&#9473;&#9473;&#9473;&#9473;&#9547;&#9473;&#9473;&#9473;&#9473;&#9515;\n");
        printf("&#9475; %c  &#9475; %c  &#9475; %c  &#9475;\n", carre[6], carre[7], carre[8]);
        printf("&#9495;&#9473;&#9473;&#9473;&#9473;&#9531;&#9473;&#9473;&#9473;&#9473;&#9531;&#9473;&#9473;&#9473;&#9473;&#9499;\n");
}

int choixJ1(char Joueur1[])
{
 int choixCase = 0;

do {
 printf("%s choisissez la case ou vous voulez jouer : ", Joueur1);
 scanf("%d", &choixCase);
}while(choixCase < 1 || choixCase > 9);

return choixCase;
}

int choixJ2(char Joueur2[])
{
 int choixCase = 0;

do {
 printf("%s choisissez la case ou vous voulez jouer : ", Joueur2);
 scanf("%d", &choixCase);
}while(choixCase < 1 || choixCase > 9);
return choixCase;
}

void verifierChoix(int choixCase, char carre[], int joueurCommence, int *rejouer)
{
 int i = 0;
 int j = 0;
 for(i = 0 ; i < 9 ; i++)
 {
	 j++;
  if(choixCase == j && carre[i] != 'X' && carre[i] != '0' && joueurCommence == 1)
   {
    carre[i] = 'X';
    *rejouer = 0;
   }
  else if(choixCase == j && carre[i] != '0' && carre[i] != 'X' && joueurCommence == 2)
   {
    carre[i] = '0';
    *rejouer = 0;
   }
   else 
   {
   *rejouer = 1;
    }
  }
}

int verifierGagne(char carre[], int gagne)
{
	if( (carre[0] == carre[1] && carre[0] == carre[2]) || (carre[3] == carre[4] && carre[3] == carre[5]) ||
        (carre[6] == carre[7] && carre[6] == carre[8]) || (carre[0] == carre[3] && carre[0] == carre[6]) ||
        (carre[1] == carre[4] && carre[1] == carre[7]) || (carre[2] == carre[5] && carre[2] == carre[8]) ||
        (carre[0] == carre[4] && carre[0] == carre[8]) || (carre[2] == carre[4] && carre[2] == carre[6])  )
   {
	   gagne = 1;
   }
   else
   {
	   gagne = 0;
   }
return gagne;
}


Voilà, si vous pouviez m'aider cela m'arrangerait beaucoup.

D'avance merci.
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
135
La boucle vient sans doute de la fonction 'verifierChoix' qui retourne toujours 'rejouer = 1'.
Je ne sais pas pourquoi, mais cette fonction est mal foutue ;-)
int j = 0;
for(i = 0 ; i < 9 ; i++)
{
j++;

Quel est l'intérêt de 'j' ? Il vaut toujours 'i+1'.
if(choixCase == j && carre[i] != 'X' && carre[i] != '0' && joueurCommence == 1)
if(choixCase == j && carre[i] != '0' && carre[i] != 'X' && joueurCommence == 2)

Quel est l'intérêt de ce test ? Seul 'joueurCommence est différent.
Bonne réflexion.
Messages postés
239
Date d'inscription
mercredi 8 octobre 2008
Statut
Membre
Dernière intervention
1 mars 2014
5
J'ai modifié quelques trucs dans ma fonction 'verfierChoix' et il y a du mieux ! Maintenant je ne suis plus dans la boucle 'a choisissez la case ou vous voulez jouer', mais lorsque un joueur saisi une case (exemple le joueur choisi la case 1, et que le joueur 2 saisie une autre case), seul la case 1 est modifiée (remplacée par un X ou un 0).

Voici la nouvelle fonction :
void verifierChoix(int *choixCase, char carre[], int joueurCommence, int *rejouer)
{
  
	  if(joueurCommence == 1)
		 {		    
           carre[*choixCase] = 'X';
		   *choixCase = 0;
           *rejouer = 0;
         }
         else if(joueurCommence == 2)
         {
          carre[*choixCase] = '0';
		  *choixCase = 0;
          *rejouer = 0;
         }
	 
   else 
   {
   *choixCase = 0;
   *rejouer = 1;
    }
 
 }


D'avance merci.
Messages postés
239
Date d'inscription
mercredi 8 octobre 2008
Statut
Membre
Dernière intervention
1 mars 2014
5
C'est bon, mon programme fonctionne, j'ai résolu le problème, merci à vous.