Morpion en C

cs_puich Messages postés 2 Date d'inscription vendredi 1 janvier 2010 Statut Membre Dernière intervention 2 janvier 2010 - 1 janv. 2010 à 15:54
cs_puich Messages postés 2 Date d'inscription vendredi 1 janvier 2010 Statut Membre Dernière intervention 2 janvier 2010 - 2 janv. 2010 à 15:30
Bonjour a tous je suis nouveau sur le forum.

Je doit crée un jeux (morpion) en C mais je ne c pas trop comment le faire car je ne suis pas super fort en C !
Pouvez vous m'aidez ?
C'est assez Urgent car je doit rendre le projet début de semaine !!!

Un tout grand MERCI a tous ceux qui pourront m'aider.

Voici ci-dessous ce qu'il mes demandé :

Définition du projet :
Le Tic-Tac-Toe est une variante simplifiée du morpion, qui se joue sur
des damiers 3x3.
Les joueurs doivent placer chacun à leur tour sur le damier le symbole
qui leur est attribué : O ou X. Le gagnant est celui qui arrive à aligner
trois symboles identiques, horizontalement, verticalement ou en
diagonale.
Spécifications de l’interface texte :
Au lancement du programme, affichez les informations reprises ci-dessous ainsi que le menu.
-----------------------------------------

====== MENU ========
(1) : Jouer
(2) : Règles du jeu
(3) : Quitter
=====================
Que voulez-vous faire ?
Le programme ne peut pas « planter » si l’utilisateur saisi une entrée non valide pour le choix du
menu.
Lors du lancement du jeu (menu « Jouer » ) :
· chaque joueur saisi son nom
· le programme affiche le damier 3x3 en numérotant chaque case
· le programme invite le premier joueur (choisi aléatoirement) à placer son symbole en
désignant le numéro de la case.


PuIcH

2 réponses

cs_puich Messages postés 2 Date d'inscription vendredi 1 janvier 2010 Statut Membre Dernière intervention 2 janvier 2010 1
2 janv. 2010 à 15:30
Bonjours , oui je c que vous n'allez pas faire le boulot a ma place...

Je bloque sur cette partie (ces oui il y a =>) :

char Jeu()
{
int i,j,coup = 0;
char Plateau[3][3],*ptPlateau,etat_partie=0,Joueur[2][100],*ptJoueur,nom[100],case_choisie=0;

=> ptPlateau = Init(Plateau); // Initialisation du plateau du jeu
ptJoueur = &Joueur[0];
srand(time(NULL));
coup = 1+rand()%2; // Choix au hasard du premier joueur a placer un pion



Voici l'ensemble du code,pouvez vous me dire si il est correcte ?
merci

Voici le code :

/* Importation des bibliothèque */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>

/* Prototype des fonctions */

int AfficherMenu();
char Jeu();
void Regles();
char Init(char Plateau[3][3]);
void AfficherResultat(char etat_gen);
void AfficherDamier(char Plateau[3][3]);
char choixJoueur(char Joueur[2][100],int coup);
char coupJoueur(char Plateau[3][3],char case_choisie,int coup);
char analyserJeu(char Plateau[3][3],int coup);

/* --------------- Programme principal (bloc main)------------------ */

int main()
{
int menu=0;
char etat_gen=0,recommencer='o';

printf("-----------------------------------------\n");
printf("Programme réalisé par: Hannard Gaetan\n");
printf("Section : Infographie Groupe : 2\n");
printf("Année académique : 2009-2010\n");
printf("Nom de l'enseignant : M. Tricarico\n");
printf("Projet : Jeu Tic-tac-toe\n");
printf("-----------------------------------------\n\n");

while (recommencer 79 || recommencer 111) // Boucle de recommecement du programme avec utilisation du code ascii pour le test
{
menu = AfficherMenu(); //Affichage du menu avec memorisation du choix

switch(menu) // Test du choix du menu
{
case 1:

etat_gen = Jeu(); // Lancement du jeu avec récupération de l'état a la fin de la partie
AfficherResultat(etat_gen); // Affichage du résultat en fonction de l'état du jeu

break;

case 2:
Regles(); // Affichage des règles
break;

case 3:
recommencer = 'n'; // Met 'N' dans recommencer pour quitter le programme
break;

default:

printf("Choix erroné"); // Lorsque l'utilisateur essaye un choix non disponible
break;
}
if (recommencer != 110 || recommencer!=78) // Pour eviter de poser la question lorsque l'utilisateur a choisi de quitter le programme juste avant
{
printf("Voulez vous recommencer (o)ui / (n)on ??\n");
scanf("%d",&recommencer);
fflush(stdin); // Vide le cache mémoire
}
}


return 0;
}

/* --------------------------------------------------------- */

int AfficherMenu()
{
int choix=0;

printf("MENU\n\n");
printf("(1) : Jouer\n");
printf("(2) : Règles du jeu\n");
printf("(3) : Quitter\n\n");
printf("=======================\n\n\n");
printf("Que voulez-vous faire ?\n");
scanf("%d",&choix);

return choix; // Renvoi le choix de l'utilisateur au programme principal
}

/* --------------------------------------------------------- */

void Regles()
{
printf("Règles du jeu: 2 joueurs: \n\nChaque joueur a son tour pose un de ses pions sur une case.\n Le premier des deux qui arrive a aligner trois de ses pions horizontalement, verticalement ou en diagonale\n est déclaré vainqueur.\n");
}

/* --------------------------------------------------------- */

void AfficherResultat(char etat_gen)
{

if (etat_gen == 'N') // test de l'état du jeu MATCH NUL ou FINI
{
printf("Match NUL !!!!!!!\n");
}
else
{
printf("félicitations vous avez gagné \\o/ *\n");
printf("********************************************\n");
}
}

/* --------------------------------------------------------- */

char Jeu()
{
int i,j,coup = 0;
char Plateau[3][3],*ptPlateau,etat_partie=0,Joueur[2][100],*ptJoueur,nom[100],case_choisie=0;

ptPlateau = Init(Plateau); // Initialisation du plateau du jeu
ptJoueur = &Joueur[0];
srand(time(NULL));
coup = 1+rand()%2; // Choix au hasard du premier joueur a placer un pion

/* Enregistrement du nom des joueur */

printf("Entrer le nom du joueur 1: ");
scanf("%s",nom);
strcpy(Joueur[0],nom);

printf("Entrer le nom du joueur 2: ");
scanf("%s",nom);
strcpy(Joueur[1],nom);

AfficherDamier(Plateau); // Affichage du plateau du jeu

while (etat_partie != 'F' && etat_partie != 'N') // Tant que la partie n'est pas finie ou en match nul on continue a jouer
{
coup++; // Incrémentation du nombre des coup pour retrouver le joueur grace au modulo (%)

do
{
case_choisie = choixJoueur(Joueur,coup); // Appel de la fonction pour choisir la case

}while(case_choisie <=47 && case_choisie >=58); // Tant que la case choisie n'est pas un chiffre compris entre 1 et 9, on redemande et change de joueur

ptPlateau = coupJoueur(Plateau,case_choisie,coup); // Place le O ou le X dans la case voulue par l'utilisateur

etat_partie = analyserJeu(Plateau,coup); // Analyse de l'état du jeu

AfficherDamier(Plateau); // Affiche le plateau

}

if (etat_partie == 'F')
{
printf("********************************************\n");
printf("* CHER %s ",Joueur[coup%2]);
}

return etat_partie;
}

/* --------------------------------------------------------- */

char Init(char Plateau[3][3])
{

/* Etablissage de la grille de départ */

char *ptPlateau;
ptPlateau = &Plateau[0];

strcpy(Plateau[0],"123");
strcpy(Plateau[1],"456");
strcpy(Plateau[2],"789");

return ptPlateau;
}

/* --------------------------------------------------------- */

void AfficherDamier(char Plateau[3][3])
{
int i,j;

printf("-------------\n");
for (i=0;i<3;i++) // Boucle pour les lignes
{
if (i!=0)
{
printf("| \n");
printf("-------------\n");
}
for (j=0;j<3;j++) // Boucle pour les colonnes
{

printf("| %c ",Plateau[i][j]); // Affichage de la case
}
}
printf("|\n");
printf("-------------\n");
}

/* --------------------------------------------------------- */

char choixJoueur(char Joueur[2][100],int coup)
{
int place_voulue;
char place;
fflush(stdin); // Vide la cache mémoire

if (coup%2==0) // Test pour savoir c'est a quel joueur de jouer ( en fonction du reste de la division du nombre de coup par le nombre de joueur)
{
printf("C'est a vous %s de jouer\n",Joueur[0]);
printf("Entrer le numero de la case ou vous voulez jouer (O): ");
scanf("%d",&place_voulue);
}
else
{
printf("C'est a vous %s de jouer\n",Joueur[1]);
printf("Entrer le numero de la case ou vous voulez jouer (X): ");
scanf("%d",&place_voulue);
}

place = 48+place_voulue; // Transforme l'entier (place_voulue) en son équivalent caractère (place) grace au code ascii

return place;
}

/* --------------------------------------------------------- */

char coupJoueur(char Plateau[3][3],char case_choisie, int coup)
{
char *ptPlateau,place;
int i,j,invalide=0;
ptPlateau = &Plateau[0];

for (i=0;i<3;i++) // Boucle des lignes
{
for (j=0;j<3;j++) // Boucle des colonnes
{
if (Plateau[i][j] == case_choisie) // Regarde si la case du tableau correspond a celle choisie par le joueur
{

ptPlateau = &Plateau[i][j]; // Si oui on place le pointeur sur cette case

if (coup%2 == 0) // On regarde si c'est le joueur (X) ou (O) toujours grace au modulo entre le nombre de coup joués et le nombre de joueurs
{
*ptPlateau = 'O'; // Place le O dans la dite case

}
else
{
*ptPlateau = 'X'; // Place le X dans la dite case
}
}
}
}
return ptPlateau;
}

/* --------------------------------------------------------- */

char analyserJeu(char Plateau[3][3],int coup)
{
char etat=0;
int i,j,ligne=0,colonne = 0,diago = 0,case_utilisee=0;

for (i=0;i<3;i++) // Boucle des lignes
{
for (j=0;j<3;j++) // Boucles des colonnes
{
if (Plateau[i][j] == 'O' || Plateau[i][j] =='X' ) //Regarde les case une par une si elles sont prises par un X ou un O
{
case_utilisee++; // Si oui on augmente le nombre de cases utilisées

if (case_utilisee == 9) // Si le nombre de case utilisée vaut 9
{
etat = 'N'; // c'est peut etre un match nul donc on met 'N' dans etat en attendant de voir si c'est autre chose qu'un match nul

}
}
}
}

if (coup%2 == 0) // Regarde quel joueur a jouer pour savoir si on test les O ou les X
{
if ((Plateau[0][0] == 'O'&& Plateau [1][1] == 'O' && Plateau[2][2] == 'O') || (Plateau[2][0] == 'O'&& Plateau [1][1] == 'O' && Plateau[0][2] == 'O')) // D'abord le test des deux diagonales
{
diago = 3; // Si une des deux diagonales est complete on met 3 dans diagonale car il y a 3 cases
etat = 'F'; // On met 'F' dans etat (F pour fini)
}
for (i=0;i<3;i++) // Boucle des lignes
{
ligne = 0; // Remet ligne a 0
colonne = 0; // remet colonne a 0
for (j=0;j<3;j++) // Boucles des colonnes
{

if(Plateau[i][j] == 'O') // Regarde si la case est un 'O' et on met Plateau [i][j] pour parcourir ligne par ligne donc de gauche a droite
{
ligne++; // Si la condition est remplie on augmente le nombre de ligne de 1
if(ligne == 3) // Si ligne vaut 3 c'est que une ligne est remplie
{
etat = 'F'; // Donc on met F dans etat
}
}
if (Plateau[j][i] == 'O') // Regarde si la case est un 'O' et on met Plateau [j][i] pour parcourir colonne par colonne donc de haut en bas
{
colonne++; // Si la condition est remplie on augmente le nombre de colonne de 1
if(colonne == 3) // Si colonne vaut 3 c'est que une colonne est remplie
{
etat = 'F'; // Donc on met F dans etat
}
}

}
}

}
else // Meme vérification met pour le cas des X cette fois
{
if ((Plateau[0][0] == 'X'&& Plateau [1][1] == 'X' && Plateau[2][2] == 'X') || (Plateau[2][0] == 'X'&& Plateau [1][1] == 'X' && Plateau[0][2] == 'X')) // D'abord le test des deux diagonales
{
diago = 3; // Si une des deux diagonales est complete on met 3 dans diagonale car il y a 3 cases
etat = 'F'; // On met 'F' dans etat (F pour fini)
}
for (i=0;i<3;i++) // Boucle des lignes
{
ligne = 0; // Remet ligne a 0
colonne = 0; // remet colonne a 0
for (j=0;j<3;j++) // Boucles des colonnes
{

if(Plateau[i][j] == 'X') // Regarde si la case est un 'X' et on met Plateau [i][j] pour parcourir ligne par ligne donc de gauche a droite
{
ligne++; // Si la condition est remplie on augmente le nombre de ligne de 1
if(ligne == 3) // Si ligne vaut 3 c'est que une ligne est remplie
{
etat = 'F'; // Donc on met F dans etat
}
}
if (Plateau[j][i] == 'X') // Regarde si la case est un 'X' et on met Plateau [j][i] pour parcourir colonne par colonne donc de haut en bas
{
colonne++; // Si la condition est remplie on augmente le nombre de colonne de 1
if(colonne == 3) // Si colonne vaut 3 c'est que une colonne est remplie
{
etat = 'F'; // Donc on met F dans etat
}
}

}
}

}

return etat; // REnvoi l'etat après la vérification
}

/* --------------------------------------------------------- */

Dans l'attente d'une réponce je vous remercie.


PuIcH
1
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
1 janv. 2010 à 21:33
Bienvenue,

Désolé, on ne va pas faire le boulot à ta place.
Tu as avancé un peu ? Sur quoi bloques-tu ?

Tu as des cours de C je supposes... Tu as de la doc sur le la lib C standard, par exemple ici pour afficher du texte. Cours de C ici.
0
Rejoignez-nous