[C] Jeux du morpion.
Résolu
niernier
Messages postés
256
Statut
Membre
-
niernier Messages postés 256 Statut Membre -
niernier Messages postés 256 Statut Membre -
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.
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
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
A voir également:
- Morpion en c
- Jeu de morpion google - Guide
8 réponses
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.
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.
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 :
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.
return carre;
qui est un pointeur alors que ta fonction retourne un int.
Retourne plutot une valeur d'erreur comme -1.
Bon courage.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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é :
Voilà, si vous pouviez m'aider cela m'arrangerait beaucoup.
D'avance merci.
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.
D'avance merci.
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.
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.
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 :
D'avance merci.
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.