Morpion en C

Résolu
Abby14 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
 Collraoul -
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

loupius
 
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.
10
Collraoul
 

Merci

1
Utilisateur anonyme
 
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 ;-).
1
Abby14 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0
Bol33
 
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
-1
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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,
0