Morpion en C [Résolu/Fermé]

Signaler
Messages postés
2
Date d'inscription
dimanche 3 mai 2009
Statut
Membre
Dernière intervention
3 mai 2009
-
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
Bonjour,
J'ai crée un programme en langage C pour le jeu du morpion. Mais quand je l'exécute, il y a toujours écrit que la case a déjà été remplie. Est-ce que quelqu'un voit ce que j'ai fait faux ?
Merci beaucoup d'avance pour vos réponses

Voici mon programme :
#include <stdio.h>
#define nblignes 3
#define nbcolonnes 3

char grille[nblignes][nbcolonnes];

/*Initialisation de la grille du morpion a vide : */
void initialisergrille(char grille[nblignes][nbcolonnes])
{
int i, j ;
for (i=0 ; i<nblignes ; i++)
{
for (j=0 ; j<nbcolonnes ; j++)
{
grille[i][j] = ' ' ;
}
}
}

/*Affichage de la grille du morpion : */
void affichergrille(char grille[nblignes][nbcolonnes])
{
int i, j ;
for (i=0 ; i<nblignes ; i++)
{
for (j=0 ; j<(nbcolonnes) ; j++)
{
printf("%c", grille[i][j]) ;
printf("|") ;
}
printf("\n") ;
printf("- - -\n") ;
}
return ;
}

/*Saisie des coordonnees du symbole a mettre sur la grille. Si les coordonnees
sont en dehors de la grille ou si la case a deja ete remplie, la saisie est
refusee, un message d'erreur s'affiche et le joueur doit rejouer. */
void mettresymbole(char symbole, char grille[nblignes][nbcolonnes])
{
int ligne, colonne ;
printf("Veuillez donner les numeros de la ligne et de la colonne :") ;
do
{
scanf_s("%i %i", &ligne, &colonne) ;
if ((ligne>0) && (ligne<=nblignes) && (colonne>0) && (colonne<=nbcolonnes))
{
ligne-- ; /*pour etre compatible avec les indices du tableau*/
colonne-- ;
if (grille[ligne][colonne]!=' ')
printf("La case a deja ete remplie. Veuillez en choisir une autre :") ;
else { grille[ligne][colonne]=symbole ;
if (symbole=='X') {symbole='O' ; }
else {symbole='X' ; }
}
}
else printf("Indice de ligne ou colonne incorrect. Veuillez resaisir :") ;
} while(grille[ligne][colonne]!=' ') ;
}

/*Test pour voir si l'un des joueurs a gagne : */
int testgagnant(char grille[nblignes][nbcolonnes], char symbole)
{
int i, j, somme, gagne ;
somme = 0 ;
gagne = 0 ;
for (i=0 ; i<nblignes ; i++)
{
for (j=0 ; j<nbcolonnes ; j++)
{
somme+=grille[i][j] ;
}
if((somme==237) || (somme==264))
{ gagne = 1 ; }
}
for(j=0 ; j<nbcolonnes ; j++)
{
for(i=0 ; i<nblignes ; i++)
{
somme+=grille[i][j] ;
}
if((somme==237) || (somme==264))
{ gagne = 1 ; }
}
if(grille[0][0] + grille[1][1] + grille[2][2] == 237 || grille[0][0] + grille[1][1] + grille[2][2] == 264)
{ gagne = 1 ; }
if(grille[0][2] + grille[1][1] + grille[2][0] == 237 || grille[0][2] + grille[1][1] + grille[2][0] == 264)
{ gagne = 1 ; }
if (gagne==1)
{ printf("Felicitations au joueur ayant les ") ;
if(symbole=='X')
printf("X") ;
else
printf("O") ;
printf("qui a gagne.\n") ;
}
/* Test si la grille est pleine :*/
if(gagne==0){
for(i=0 ; i<nblignes ; i++)
{
for(j=0 ; j<= nbcolonnes ; j++)
{
if(grille[i][j] != ' ')
gagne=2 ;
printf("Aucun des 2 joueurs n'a gagne") ;
}
}
}
return gagne ;
}

void main()
{
char grille[nblignes][nbcolonnes] ;
char symbole ;
int gagne ;
initialisergrille(grille) ;
affichergrille(grille) ;
printf("Veuillez choisir votre symbole, O ou X :") ;
scanf("%c", &symbole) ;
do
{ mettresymbole(symbole, grille) ;
affichergrille(grille);
testgagnant(grille, symbole) ;
}
while(gagne=0) ;

}

4 réponses

Après correction de quelques erreurs:
#include <stdio.h>
#define nblignes 3
#define nbcolonnes 3

//char grille[nblignes][nbcolonnes];

/*Initialisation de la grille du morpion a vide : */
void initialisergrille(char grille[nblignes][nbcolonnes])
{
	int i, j;
	for (i=0; i<nblignes; i++)
		for (j=0; j<nbcolonnes; j++)
			grille[i][j] = ' ';
}

/*Affichage de la grille du morpion : */
void affichergrille(char grille[nblignes][nbcolonnes])
{
	int i, j;
	for (i=0; i<nblignes; i++)
	{
		for (j=0; j<nbcolonnes; j++)
			printf("%c|", grille[i][j]);
		printf("\n- - -\n");
	}
	return;
}

/*Saisie des coordonnees du symbole a mettre sur la grille. Si les coordonnees
sont en dehors de la grille ou si la case a deja ete remplie, la saisie est
refusee, un message d'erreur s'affiche et le joueur doit rejouer. */
void mettresymbole(char symbole, char grille[nblignes][nbcolonnes])
{
	int ligne, colonne;
	printf("Veuillez donner les numeros de la ligne et de la colonne :");
	do
	{
		scanf("%i %i", &ligne, &colonne);
		if ((ligne>0) && (ligne<=nblignes) && (colonne>0) && (colonne<=nbcolonnes))
		{
			ligne--; /*pour etre compatible avec les indices du tableau*/
			colonne--;
			if (grille[ligne][colonne]!=' ')
				printf("La case a deja ete remplie. Veuillez en choisir une autre :");
			else
			{
				grille[ligne][colonne]=symbole;
				if (symbole=='X')
					symbole='O';
				else
					symbole='X';
			}
		}
		else
			printf("Indice de ligne ou colonne incorrect. Veuillez resaisir :");
	}
	while(grille[ligne][colonne]==' ');
}

/*Test pour voir si l'un des joueurs a gagne : */
int testgagnant(char grille[nblignes][nbcolonnes], char symbole)
{
	int i, j, somme, gagne=0;
	for (i=0; i<nblignes; i++, somme=0)
	{
		for (j=0; j<nbcolonnes; j++)
			somme+=grille[i][j];
		if((somme==237) || (somme==264))
			gagne = 1;
	}
	for(j=0 ; j<nbcolonnes ; j++, somme=0)
	{
		for(i=0 ; i<nblignes ; i++)
			somme+=grille[i][j] ;
		if((somme==237) || (somme==264))
			gagne = 1;
	}
	if ( (grille[0][0] + grille[1][1] + grille[2][2] == 237) ||
			 (grille[0][0] + grille[1][1] + grille[2][2] == 264) ||
			 (grille[0][2] + grille[1][1] + grille[2][0] == 237) ||
			 (grille[0][2] + grille[1][1] + grille[2][0] == 264) )
		gagne = 1;
	if (gagne)
	{
		printf("Felicitations au joueur ayant les %c qui a gagne\n", symbole);
		return 1;
	}
	/* Test si la grille est pleine :*/
	for(i=0; i<nblignes; i++)
		for(j=0; j<nbcolonnes; j++)
			if(grille[i][j] == ' ')
				return 0;
	printf("Aucun des 2 joueurs n'a gagne");
	return 2;
}

int main()
{
	char grille[nblignes][nbcolonnes];
	char symbole;
	initialisergrille(grille);
	affichergrille(grille);
	printf("Veuillez choisir votre symbole, O ou X :");
	scanf("%c", &symbole);
	do
	{
		mettresymbole(symbole, grille);
		affichergrille(grille);
	}
	while(!testgagnant(grille, symbole));
	return 0;
}
Je ne garantis rien surtout au niveau des 'scanf'.
Bon courage.
9
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 58241 internautes nous ont dit merci ce mois-ci

Messages postés
1274
Date d'inscription
samedi 30 août 2008
Statut
Membre
Dernière intervention
21 juin 2015
795
Je pense que la majorité de tes soucis viennent de ta fonction mettresymbole().
La condition de ta boucle do...while() est toujours vraie si tu saisies des coordonnées correctes (puisque dans ce cas, tu auras placé symbole à la place de l'espace, donc la condition de ta while est vraie puisque symbole != ' ').
Les %i je ne connais pas mais si ça marche chez toi et que tu veux faire avec tant mieux, moi je mets des %d pour les int.
Sinon, dans ta fonction main(), c'est while(gagne==0); sinon ce n'est pas un test mais une affectation (qui fonctionne en principe toujours, et qui renvoie la valeur affectée, donc dans l'état actuel c'est comme une while(0); donc comme pas de do...while();).
Et une petite dernière chose : une fonction main() renvoie un int (pas void).

J'espère que ça t'avanceras, je ne sais pas si ce n'est que ça qui fait "foirer" ton programme ;-).
Messages postés
2
Date d'inscription
dimanche 3 mai 2009
Statut
Membre
Dernière intervention
3 mai 2009

Merci beaucoup à tous les deux pour vos réponses.
Loupius, avec les modifications que tu as faites, le programme fonctionne. Merci 1000 fois. Il reste juste un problème, c'est qu'il ne change pas de O ou de X.
Salut. Désolé de revenir sur ça deux ans après, mais j'avais simplement une question par rapport à ce programme.
Pourquoi somme=237 ou somme=264 ?
J'imagine que ces valeurs correspondent aux X ou O ?
J'ai besoin de ce genre de choses pour un autre programme et j'aimerai savoir comment ça marche.
Merci d'avance. Bol33
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 688
Bonjour,
L'utilisateur doit choisir entre 'X' ou 'O'.
En ascii, 'X' vaut 88 et 'O' vaut 79.
Trois ronds (ou trois croix alignés) donnent : 79*4=237 (ou 88*3=264).
Cdlt,