Morpion en c

Description

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 = 1;
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 = 2;
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.

Codes Sources

A voir également

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.

Du même auteur (cs_Cal)