Morpion pour 2 joueurs humains, en mode texte (pas top d'ailleurs...)
Merci cmarsc pour m'avoir aidé à optimiser le code
Source / Exemple :
- Morpion*********************
//Morpion en mode texte
//Mon premier (vrai) programme !!
//Ecrit par Cal en 2002
#include <stdio.h>
#include <conio.h>
extern int grille[3][3] = {0}; //Grille du morpion
extern int cases[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; //Pour faire son choix...
extern int ok = 0; //Flag pour erreur
extern int v = 0; //Vainqueur
void AFFICHE(int *tableau) //Affiche un tableau [3][3] avec l'aide de pointeurs
{
int i;
for(i = 0; i < 9; i++)
{
if(!(i%3)) //Pour aller à la ligne tout les 3 éléments
printf("\n\n");
tableau += i;
printf("%d\t", *tableau);
tableau -= i;
}
printf("\n\n");
return;
}
int VERIF_CASE(int *pgrille) //Pour vérifier si la case n'est pas déjà prise
{
if(*pgrille)
{
clrscr();
AFFICHE(pgrille);
printf("\nCase d\x82j\x85 prise !\n");
ok = 0;
}
else
ok = 1;
return ok;
}
void MESSAGE_ERREUR(void)
{
printf("\n\nTu t'es plant\x82 quelque part ! Recommence :\n\n");
return;
}
int VERIF_VAINQUEUR(int joueur)
{
int c0, c1, c2, c3, c4, c5, c6, c7, c8;
c0 = grille [0][0];
c1 = grille [0][1];
c2 = grille [0][2];
c3 = grille [1][0];
c4 = grille [1][1];
c5 = grille [1][2];
c6 = grille [2][0];
c7 = grille [2][1];
c8 = grille [2][2];
if(((c0 && c1 && c2) && (c0 + c1 + c2 == 3*(joueur))) ||
((c3 && c4 && c5) && (c3 + c4 + c5 == 3*(joueur))) ||
((c6 && c7 && c8) && (c6 + c7 + c8 == 3*(joueur))) ||
((c0 && c3 && c6) && (c0 + c3 + c6 == 3*(joueur))) ||
((c1 && c4 && c7) && (c1 + c4 + c7 == 3*(joueur))) ||
((c2 && c5 && c8) && (c2 + c5 + c8 == 3*(joueur))) ||
((c0 && c4 && c8) && (c0 + c4 + c8 == 3*(joueur))) ||
((c2 && c4 && c6) && (c2 + c4 + c6 == 3*(joueur)))))
//Vérifie si chaque ligne ou chaque diagonale est égale à 3 ou 6 suivant le numero du joueur
//Mais il ne faut pas de 0 car 1 + 2 + 0 = 3
{
printf("\n\nLe joueur %d \x85 gagn\x82 !\n\n",(joueur));
v = 1;
}
return v;
}
void jeux_morpion(void)
{
int *pgrille = &grille; //Pointeur pour selectionner la case choisie par le joueur
int *pcases = &cases; //Pointeur pour afficher le tableau "cases"
int c0, c1, c2, c3, c4, c5, c6, c7, c8; //Cases
int x; //Selections des joueurs
int i, j; //Pour afficher les tableaux
int c; //Compteur de coups
int score1 = 0;
int score2 = 0;
char selection;
printf("\n*********************MORPION*********************\n\n");
printf("Ecrit par u Cal en 2002\n\n");
printf("*************************************************\n\n");
printf("Grille : 0 -> Case vide\n");
printf(" 1 -> Case jou%ce par le joueur 1\n", 130);
printf(" 2 -> Case jou%ce par le joueur 2\n", 130);
start: v = 0;
for(i = 0; i < 3; i++) //Re-initialisation de la grille pour les nouvelles parties
{
for(j = 0; j <3; j++)
grille[i][j] = 0;
}
for(c = 1; c < 9; c += 2) //Si les 9 coups n'ont pas été joués (en fait ça s'arrete au 8e,
//mais si un joueur arrive au 9e coup, c'est un match nul)
{
do
{
printf("\n\n\nJoueur 1: entrez votre case : (0 - 8)\n");
printf("\nCases : ");
AFFICHE(pcases);
printf("Votre case = ");
scanf("%d", &x);
if ((x >= 0) && (x <= 8)) //Si x est un chiffre entre 0 et 8
{
pgrille += x; //Positionnement dans la case du tableau choisie
VERIF_CASE(pgrille);
if(ok) //Assigne la valeur 1 si la case n'est pas déjà prise
pgrille -= x; //Reviens au debut du tableau
}
else
MESSAGE_ERREUR();
}
while (!ok);
clrscr();
printf("Grille : ");
AFFICHE(pgrille);
VERIF_VAINQUEUR(1);
if(v) //Si il y a un vainqueur
{
score1++;
printf("\n\nScore du joueur 1 : %d", score1);
printf("\nScore du joueur 2 : %d", score2);
printf("\n\nVoulez vous faire une autre partie ? (o/n) :");
if((selection = getche()) == 'o')
{
clrscr();
goto start;
}
else
{
printf("\n\nPartie finie !\n\n");
exit(0);
}
}
do //Au tour du joueur 2
{
printf("\n\n\nJoueur 2: entrez votre case : (0 - 8)\n");
printf("\nCases :");
AFFICHE(pcases);
printf("Votre case = ");
scanf("%d", &x);
if ((x >= 0) && (x <= 8))
{
pgrille += x;
VERIF_CASE(pgrille);
if(ok)
pgrille -= x;
}
else
MESSAGE_ERREUR();
}
while (!ok);
clrscr();
printf("Grille :");
AFFICHE(pgrille);
VERIF_VAINQUEUR(2);
if(v)
{
score2++;
printf("\n\nScore du joueur 1 : %d", score1);
printf("\nScore du joueur 2 : %d", score2);
printf("\n\nVoulez vous faire une autre partie ? (o/n)");
selection = getche();
if(selection == 'o')
{
clrscr();
goto start;
}
else
{
printf("\n\nPartie finie !\n\n");
exit(0);
}
}
} //Si il n'y a aucun vainqueur
printf("\n\nMatch nul !\n");
printf("\n\nScore du joueur 1 : %d", score1);
printf("\nScore du joueur 2 : %d\n\n", score2);
printf("\n\nVoulez vous faire une autre partie ? (o/n)");
if((selection = getche()) == 'o')
goto start;
else
{
printf("\nPartie finie !");
exit(0);
}
return;
}
int main()
{
jeux_morpion();
return 0;
}
Conclusion :
Ce code peut servir aux débutant comme moi, c'est pas mal de commencer par un morpion je pense (j'ai super progressé en une semaine grâce à cette idée)
Si vous trouvez des bugs ou des idées pour une future version je suis preneur (j'ai l'intention de faire jouer l'ordinateur).
Si vous avez des remarques ou des conseils, n'ésitez pas.
Cal.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.