niernier
Messages postés239Date d'inscriptionmercredi 8 octobre 2008StatutMembreDernière intervention 1 mars 2014
-
29 janv. 2010 à 21:23
niernier
Messages postés239Date d'inscriptionmercredi 8 octobre 2008StatutMembreDernière intervention 1 mars 2014
-
30 janv. 2010 à 20:19
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("┏━━━━┳━━━━┳━━━━┓\n");
printf("┃ %c ┃ %c ┃ %c ┃\n", carre[0], carre[1], carre[2]);
printf("┣━━━━╋━━━━╋━━━━┫\n");
printf("┃ %c ┃ %c ┃ %c ┃\n", carre[3], carre[4], carre[5]);
printf("┣━━━━╋━━━━╋━━━━┫\n");
printf("┃ %c ┃ %c ┃ %c ┃\n", carre[6], carre[7], carre[8]);
printf("┗━━━━┻━━━━┻━━━━┛\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
niernier
Messages postés239Date d'inscriptionmercredi 8 octobre 2008StatutMembreDernière intervention 1 mars 20145 29 janv. 2010 à 21:42
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.
niernier
Messages postés239Date d'inscriptionmercredi 8 octobre 2008StatutMembreDernière intervention 1 mars 20145 30 janv. 2010 à 10:12
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("┏━━━━┳━━━━┳━━━━┓\n");
printf("┃ %c ┃ %c ┃ %c ┃\n", carre[0], carre[1], carre[2]);
printf("┣━━━━╋━━━━╋━━━━┫\n");
printf("┃ %c ┃ %c ┃ %c ┃\n", carre[3], carre[4], carre[5]);
printf("┣━━━━╋━━━━╋━━━━┫\n");
printf("┃ %c ┃ %c ┃ %c ┃\n", carre[6], carre[7], carre[8]);
printf("┗━━━━┻━━━━┻━━━━┛\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.
loupius
Messages postés697Date d'inscriptiondimanche 1 novembre 2009StatutMembreDernière intervention31 décembre 2017148 30 janv. 2010 à 12:52
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.
niernier
Messages postés239Date d'inscriptionmercredi 8 octobre 2008StatutMembreDernière intervention 1 mars 20145 30 janv. 2010 à 13:13
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).