C'était juste pour m'amuser avec des goto que je l'ai fait
[...]
J'ai pas pris mon temps pour ... espacer tout ça dsl
De ce fait, je ne le commenterai pas.
@ GurneyH : Fan !
Tu pourrais expliquer ça pour les débutants par contre : putchar(" 0X"[grid[i*W+j]]);
Tu pourrais aussi expliquer ça : while((unsigned)i<H&&(unsigned)j<W)
Tout de même un peu.
Je vais regarder ça. Merci pour le retour.
edit: c'est corrigé.
Citation : Pouet
Tu pourrais expliquer ça pour les débutants par contre : putchar(" 0X"[grid[i * W + j]]);
Tu pourrais aussi expliquer ça : while((unsigned)i < H && (unsigned)j < W)
pour
putchar(" 0X"[grid[i * W + j]])
La grille contient 0(case vide), 1 ou 2(le joueur qui occupe la case).
J'ai choisi de stocker ma grille sous la forme d'un tableau à 1 dimension.
A partir d'une ligne(i) et d'une colonne donnée(j), pour récupèrer l'indice de la case je fais
i * W + j
(faire un dessin pour visualiser si ce n'est pas clair)
Ensuite" OX", c'est une chaîne de caractère.
On peut accèder à chaque caractère la composant à partir d'un indice
" OX"[0] = ' '
" OX"[1] = 'O'
" OX"[2] = '1'
Pour
while((unsigned)i < H && (unsigned)j < W)
c'est équivalent à
while(i >= 0 && i < H && j >= 0 && j < W)
Si i(par exemple) est négatif (-1 encore pour exemple), après cast en unsigned
i aura pour valeur UINT_MAX(défini dans limits.h)
si i = -2 -> (unsigned)i == UINT_MAX - 1
Ainsi on a à tester qu'une borne, la borne supérieure.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#ifndef principal
#include "grille.h"
#define principal
#endif
int main (void)
{
Case grille[LONGUEUR][LARGEUR];
int ligne = 0;
int colonne = 0;
int joueur = 1;
int continuer = 1;
int nbCoups = 0;
int gagne = 0;
int coupPasJoue = 1;
srand(time(NULL));
printf("Jeu du morpion. Pour jouer entrez une ligne et une colonne,\n");
printf("au format suivant x,y[entree], x étant la ligne et y la colonne\n");
printf("ces deux chiffres étant compris entre 1 et 3.");
printf("\n");
while (continuer == 1)
{
gagne = 0;
nbCoups = 0;
prepare_Grille(grille);
while (nbCoups < 9 && gagne != 1)
{
afficherGrille(grille);
if (nbCoups == 0)
{
joueur = rand();
if ((joueur % 2) == 0)
{
joueur = 1;
}
else
{
joueur = 2;
}
}
else if ((nbCoups % 2) == 0)
{
joueur = 1;
}
else
{
joueur = 2;
}
coupPasJoue = 1;
while (coupPasJoue)
{
printf("Joueur %d, jouez : ", joueur);
scanf("%d,%d", &ligne, &colonne);
vider_Buffer();
coupPasJoue = placerPion(joueur, grille, ligne, colonne);
}
nbCoups++;
printf("Nb de coups joues : %d\n", nbCoups);
gagne = verifierGrille(grille, ligne, colonne, joueur);
}
if (gagne)
{
printf("Le joueur %d a gagne !\n", joueur);
}
else
{
printf("Egalite ! \n");
}
afficherGrille(grille);
printf("Une autre partie ?(0 = Non, 1 = oui)");
scanf("%d", &continuer);
vider_Buffer();
}
return 0;
}
grille.h
enum Case
{
VIDE,
PIONJOUEUR1,
PIONJOUEUR2
};
typedef enum Case Case;
#define LONGUEUR 3
#define LARGEUR 3
#define NBPIONS 3
void vider_Buffer(void);
int placerPion (int joueur, Case grille[LONGUEUR][LARGEUR], int ligne, int colonne);
void prepare_Grille(Case Grille[LONGUEUR][LARGEUR]);
void afficher_ligne(void);
int verifierLigne(Case Grille[LONGUEUR][LARGEUR], int ligne, unsigned int pion);
int verifierColonne(Case Grille[LONGUEUR][LARGEUR], int colonne, unsigned int pion);
int verifierDiagonales(Case Grille[LONGUEUR][LARGEUR], int ligne, int colonne, unsigned int pion);
int verifierGrille(Case Grille[LONGUEUR][LARGEUR], int ligne, int colonne, int joueur);
void afficherGrille (Case grille[LONGUEUR][LARGEUR]);
grille.c
#ifndef grid
#include "grille.h"
#define grid
#endif
#include <stdio.h>
void vider_Buffer(void)
{
int c = 0;
c = getchar();
while (c != '\n')
{
c = getchar();
}
}
int placerPion (int joueur, Case grille[LONGUEUR][LARGEUR], int ligne, int colonne)
{
int pasPlace = 1;
ligne--;
colonne--;
if (grille[ligne][colonne] != VIDE)
{
printf("Case déjà occupée, choisissez une autre case !\n");
pasPlace = 1;
}
else
{
if (joueur == 1)
{
grille[ligne][colonne] = PIONJOUEUR1;
}
else
{
grille[ligne][colonne] = PIONJOUEUR2;
}
pasPlace = 0;
}
return pasPlace;
}
void prepare_Grille(Case Grille[LONGUEUR][LARGEUR])
{
int i = 0;
int j = 0;
while (i < LONGUEUR)
{
while (j < LARGEUR)
{
Grille[i][j] = VIDE;
j++;
}
i++;
j = 0;
}
}
void afficher_ligne(void)
{
int nbTirets = 0;
while (nbTirets < 2 * LONGUEUR)
{
printf("-");
nbTirets++;
}
}
int verifierLigne(Case Grille[LONGUEUR][LARGEUR], int ligne, unsigned int pion)
{
int colonne = 0;
int alignes = 0;
while (colonne != LARGEUR && alignes != NBPIONS)
{
if (Grille[ligne][colonne] == pion)
{
alignes++;
}
else
{
alignes = 0;
}
colonne++;
}
return alignes;
}
int verifierColonne(Case Grille[LONGUEUR][LARGEUR], int colonne, unsigned int pion)
{
int ligne = 0;
int alignes = 0;
while (ligne != LONGUEUR && alignes != NBPIONS)
{
if (Grille[ligne][colonne] == pion)
{
alignes++;
}
else
{
alignes = 0;
}
ligne++;
}
return alignes;
}
int verifierDiagonales(Case Grille[LONGUEUR][LARGEUR], int ligne, int colonne, unsigned int pion)
{
int alignes = 0;
int ligneDiagonale;
int colonneDiagonale;
/* Verification vers la droite */
ligneDiagonale = ligne;
colonneDiagonale = colonne;
while (Grille[ligneDiagonale][colonneDiagonale] == pion && alignes != NBPIONS)
{
alignes++;
ligneDiagonale++;
colonneDiagonale++;
if (ligneDiagonale == LONGUEUR || colonneDiagonale == LARGEUR)
{
break;
}
}
ligneDiagonale = ligne;
colonneDiagonale = colonne;
if (alignes != NBPIONS)
{
alignes = 0;
}
/* Puis vers la gauche si on n'a pas trouvé */
while (Grille[ligneDiagonale][colonneDiagonale] == pion && alignes != NBPIONS)
{
alignes++;
ligneDiagonale++;
colonneDiagonale--;
if (ligneDiagonale == LONGUEUR || colonneDiagonale < 0)
{
break;
}
}
if (alignes != NBPIONS)
{
alignes = 0;
}
/* Verification vers le bas à gauche */
ligneDiagonale = ligne;
colonneDiagonale = colonne;
while (Grille[ligneDiagonale][colonneDiagonale] == pion && alignes != NBPIONS)
{
alignes++;
ligneDiagonale--;
colonneDiagonale--;
if (ligneDiagonale < 0 || colonneDiagonale < 0)
{
break;
}
}
ligneDiagonale = ligne;
colonneDiagonale = colonne;
if (alignes != NBPIONS)
{
alignes = 0;
}
/* Puis à droite */
while (Grille[ligneDiagonale][colonneDiagonale] == pion && alignes != NBPIONS)
{
alignes++;
ligneDiagonale--;
colonneDiagonale++;
if (ligneDiagonale < 0 || colonneDiagonale == LARGEUR)
{
break;
}
}
return alignes;
}
int verifierGrille(Case Grille[LONGUEUR][LARGEUR], int ligne, int colonne, int joueur)
{
int gagne = 0;
int alignes = 0;
unsigned int pion;
ligne--;
colonne--;
if (joueur == 1)
{
pion = PIONJOUEUR1;
}
else
{
pion = PIONJOUEUR2;
}
alignes = verifierLigne(Grille, ligne, pion);
if (alignes == NBPIONS)
{
gagne = 1;
}
else
{
alignes = verifierColonne(Grille, colonne, pion);
if (alignes == NBPIONS)
{
gagne = 1;
}
else
{
alignes = verifierDiagonales(Grille, ligne, colonne, pion);
if (alignes == NBPIONS)
{
gagne = 1;
}
}
}
return gagne;
}
void afficherGrille (Case grille[LONGUEUR][LARGEUR])
{
int nbBarresVerticales = 0;
int nbLignesHorizontales = 0;
while (nbLignesHorizontales < LONGUEUR)
{
afficher_ligne();
printf("\n");
while (nbBarresVerticales < LARGEUR)
{
printf("|");
if (grille[nbLignesHorizontales][nbBarresVerticales] == VIDE)
{
printf(" ");
}
else if (grille[nbLignesHorizontales][nbBarresVerticales] == PIONJOUEUR1)
{
printf("O");
}
else
{
printf("X");
}
nbBarresVerticales++;
}
nbBarresVerticales = 0;
nbLignesHorizontales++;
printf("|");
printf("\n");
}
}
Quelques petites choses à propos de ce code :
- Un problème avec la saisie d'une ligne. Si on saisit plus de quinze ou seize caractères le programme sort une erreur de segmentation. Gdb n'arrive pas à m'indiquer d'où elle vient malgré plusieurs essais.
- Si on saisit moins de trois caractères il faut appuyer plusieurs fois sur Entrée pour avoir la possibilité de recommencer la saisie.
- L'algorithme qui se contente de tester toutes les combinaisons et n'est pas évolutif. J'essaierai d'en poster une meilleure version, surtout concernant les diagonales.
Edit : code modifié en prenant en compte les remarques de Pouet_Forever en dessous. En espérant que le code soit mieux découpé.
Tu t'emmerde trop la vie avec la saisie utilisateur. Fais un scanf("%d%d",&i,&j); et le tour est joué.
Le but de l'exo c'est pas la saisie utilisateur.
Pourquoi tu fais des pointeurs directement sur tes variables ?
J'ai pas regardé en profondeur, mais tu pourrais déjà gérer ton header par rapport à l'inclusion multiple.
Découper un peu plus ton code.
salut, en lisent le sujet j ai u tout de suite envie de le faire (donc merci a se lui qui a lance l'exo)
donc j ai fait sa ( je suis encore un débutant s est donc pas très propre):
/* Par : Coyote
Jeux du morpion en console (exo pour le site du zero)
*/
#include <stdio.h>
#include <stdlib.h>
//taille de la grille
#define NOMBRE_DE_LIGNE 3
#define NOMBRE_DE_CASE (NOMBRE_DE_LIGNE * NOMBRE_DE_LIGNE)
//pour OS
#define WINDOWS
//#define LINUX
//initialisation des variable
void initialisation(int *Pjoueur, int *grille)
{
int i = 0;
//mise a zéro de la grille
for(i=0;i<NOMBRE_DE_CASE;i++)
{
grille[i] = 0;
}
*Pjoueur = 0;
}
void quelleJoueur(int *Pjoueur)
{
//pour os
#ifdef WINDOWS
system("cls");
#endif
//pour os
#ifdef LINUX
system("clear");
#endif
switch(*Pjoueur)
{
case 0:
*Pjoueur = (rand() % (2 - 1 + 1)) + 1;
printf("joueur %d commence !\n",*Pjoueur);
break;
case 1:
*Pjoueur = 2;
break;
case 2:
*Pjoueur = 1;
break;
}
}
void affichage(const int grille[], int joueur)
{
int i = 0, ligne = 0;
for(i=0;i<NOMBRE_DE_CASE;i++)
{
switch(grille[i])
{
case 0:
printf(".");
break;
case 1:
printf("x");
break;
case 2:
printf("o");
break;
}
ligne++;
if(ligne == NOMBRE_DE_LIGNE)
{
printf("\n");
ligne = 0;
}
}
printf("joueur %d:",joueur);
}
//verifie si le coup est jouable est le pace dans la grille
void jouerCoup(int *grille[],const int joueur)
{
int coup = 0, coupBon = 0;
do
{
//-1 pour ratrapé le 0 du tableau
coup = (saisie() - 1);
//verifie si le coup est jouable et le place dans la grille
if(grille[coup] == 0)
{
coupBon = 0;
if(joueur == 1)
{
grille[coup] = 1;
}
if(joueur == 2)
{
grille[coup] = 2;
}
}
else
{
coupBon = 1;
printf("\nvous ne pouvait pas jouer set case choisisé une autre case :");
}
}while(coupBon);
}
//recupére la saisie du joueur
int saisie()
{
int coupJouer = 0, coupValide = 1;
do
{
scanf("%d",&coupJouer);
if((coupJouer > 0 )&&(coupJouer <= NOMBRE_DE_CASE))
{
coupValide = 0;
}
else
{
printf("\nle nombre n'est pas valide choisi un autre nombre :");
}
}while(coupValide);
return coupJouer;
}
int testerGagnant(const int grille[],const int joueur)
{
int i = 0,l = 0,
gagne[4] = {0}, partieNul = 0;
for(i=0;i<NOMBRE_DE_LIGNE;i++)
{
for(l=0;l<NOMBRE_DE_LIGNE;l++)
{
//test les lignes horizontal
if ((grille[(NOMBRE_DE_LIGNE * i)] != 0) && (grille[(NOMBRE_DE_LIGNE * i)] == grille[(l+(NOMBRE_DE_LIGNE * i))]))
{
gagne[0]++;
}
//.........
//test les vertival
if ((grille[i] != 0) && (grille[i] == grille[(l * NOMBRE_DE_LIGNE + i)]))
{
gagne[1]++;
}
//........
// test des diagonals
if(i == 0)
{
if((grille[i] !=0) && (grille[i] == grille[(l * NOMBRE_DE_LIGNE)+ l]))
{
gagne[2]++;
}
if((grille[NOMBRE_DE_LIGNE -1] !=0) && (grille[NOMBRE_DE_LIGNE - 1] == grille[(NOMBRE_DE_LIGNE - 1) + (l*(NOMBRE_DE_LIGNE - 1))]))
{
gagne[3]++;
}
}
//............
//test si la partie nai pas nul
if (grille[(l+(NOMBRE_DE_LIGNE * i))] == 0)
{
partieNul++;
}
}
//verifie si il y a une ligne gagniente
for(l=0;l<4;l++)
{
if(gagne[l] >= NOMBRE_DE_LIGNE)
{
affichage(grille,joueur);
printf("\nle joueur %d a gagnée !",joueur);
return 0;
}
else //si non remis a 0
{
gagne[l] = 0;
}
}
}
//...............
if(partieNul > 0)
{
return 1;
}
//si match nul
else
{
printf("\nmatch nul !");
return 0;
}
}
int main()
{
//joueur definie a qui est le toure
int joueur = 0,i = 0,
continu = 0,rejouer = 0,
coupJouer = 0,
grille[NOMBRE_DE_CASE];
srand(time(NULL));
//boucle pour rejouer
do
{
//installation pour rejouer
installation(&joueur, grille);
//boucle du jeux
do
{
quelleJoueur(&joueur);
affichage(grille,joueur);
jouerCoup(grille, joueur);
continu = testerGagnant(grille,joueur);
}while(continu);
printf("\nvoule vous rejouer 1.NON 2.OUI ?:");
switch(saisie())
{
case 1:
rejouer = 0;
break;
default:
rejouer = 1;
break;
}
}while(rejouer);
return 0;
}
j ai qu'elle que warning , le code est évolutif je les test avec une grille de 4x4 sa marche (par contre le système de saisie est pas terrible, mai comme précisé s est pas le plus important )
@coyote60: Je n'ai pas regardé le code mais déjà, stp corrige les fautes d'orthographes, il y en a plein.
J'aime pas trop les switch qui font lourd et qui pourraient être remplacés par un if ou même en une ligne(par les ternaires).
Comme dis précédemment, tu testes toutes les possibilités alors que l'on peut ne pas tout vérifier.
Je pense pas que tu sois obligé d'effacer l'écran. (rand()%(2-1+1))+1; Tu peux aussi faire les calculs tout seul non ? intjoueur=0,i=0; Je ne vois pas oû est utiliser i.
Il ne te manquerait pas un/des include(s) ?
Après je que regardé le code de loin, j'ai pas testé.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
rebonjour, j'essay actuellement de corigé mon code mais la sa plante et je ne sais pas pourquoi, quand je vuex jou sur la case 1, il ne joue pas et sur la 2 il m'affiche la 3
voila mon code :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void affichage(char grille[]);
int demande(void);
int teste_Case(int choix, char grille[]);
int main(int argv, char *argc[])
{
srand(time(NULL));
char grille[9] = {'.','.','.','.','.','.','.','.','.'};
int c = 2;
int gagnant = 1;
int joueur = rand() % c + 1;
int choix;
int ok = 1;
printf("\t\t\t===MORPION===\n\n");
while(gagnant)
{
do
{
printf("A toi, JOUEUR %d : Ou veut tu jouer ?\n", joueur);
choix = demande();
ok = teste_Case(choix, grille);
affichage(grille);
}while(ok);
if(joueur == 1)
{
grille[choix] = 'o';
joueur++;
}
else if(joueur == 2)
{
grille[choix] = 'x';
joueur--;
}
}
return 0;
}
void affichage(char grille[])
{
printf("%c %c %c\n", grille[0] ,grille[1], grille[2]);
printf("%c %c %c\n", grille[3] ,grille[4], grille[5]);
printf("%c %c %c\n", grille[6] ,grille[7], grille[8]);
}
int demande(void)
{
int choix;
printf("Je joue sur le case : n°");
scanf("%d", &choix);
return choix;
}
int teste_Case(int choix, char grille[])
{
int ok;
char testeur[] = {'.'};
if(grille[choix] != testeur[0])
{
printf("C'est pri, joue ailleur\n\n");
ok = 1;
}
else if(grille[choix] == testeur[0])
{
ok = 0;
}
return ok;
}
@coyote60 :
ligne 224 : fonction installation ? je connais pas, le compilateur non plus
Les variables i et coupJouer sont à supprimer, elles ne sont pas utilisées
Tu n'as pas inclus time.h
Tes fonctions qui ne prennent aucun argument devraient avoir 'void' en argument
Osef des fonctions de suppression d'affichage
(rand() % (2 - 1 + 1)) + 1 --> Tu penses pas que tu peux supprimer les calculs inutiles T_T
Ta fonction quelleJoueur n'a pas un nom très explicite non plus
Ta fonction jouerCoup attend int *grille et non int *grille[]
Ta fonction de saisie est appelée avant d'être déclarée
Je pense que tu peux simplifier ces instructions :
Ta fonction testerGagnant fait aussi de l'affichage, une chose par fonction
Les switch pour tester 1 ou 2 conditions ne sont pas utiles, ils allourdissent le code inutilement
Une chose très importante à mes yeux T_T : corrige les fautes d'orthographe, il existe des dictionnaires, des bescherelles pour ça, utilises les par pitié... T_T T_T
@molipate : Mets ton code entre balises 'secret' stp
Pour ton problème, affiche ta grille après que le joueur aie joué la case, je pense que ça devrait résoudre ton problème.
j ai essayer d'appliquer tous vous modification ( a par s elle du "testGagnant" pour test que le coup jouer il faut que je la refasse sa va me prendre plus de temps :euh:)
j ai aussi essayer de corrige mai faute (il en a sûrement encore désolé )
par contre le "scanf" me renvoi un warning, est je s est pas pour quoi ?
/* Par : Coyote
Jeux du morpion en console (exo pour le site du zéro)
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//taille de la grille
#define NOMBRE_DE_LIGNE 3
#define NOMBRE_DE_CASE (NOMBRE_DE_LIGNE * NOMBRE_DE_LIGNE)
//initialisation des variables
void initialisation(int *Pjoueur, int *grille)
{
int i = 0;
//mise a zéro de la grille
for(i=0;i<NOMBRE_DE_CASE;i++)
{
grille[i] = 0;
}
*Pjoueur = 0;
}
void choixDuJoueur(int *Pjoueur)
{
if(!*Pjoueur)
{
*Pjoueur = rand() % 2 + 1;
printf("joueur %d commence !\n",*Pjoueur);
}
if(*Pjoueur == 1)
{
*Pjoueur = 2;
}
else
{
*Pjoueur = 1;
}
}
void affichage(const int grille[], int joueur)
{
int i = 0, ligne = 0;
for(i=0;i<NOMBRE_DE_CASE;i++)
{
switch(grille[i])
{
case 0:
printf(".");
break;
case 1:
printf("x");
break;
case 2:
printf("o");
break;
}
ligne++;
if(ligne == NOMBRE_DE_LIGNE)
{
printf("\n");
ligne = 0;
}
}
printf("joueur %d:",joueur);
}
int saisie(void)
{
int coupJouer = 0;
do
{
scanf("%d",&coupJouer);
if((coupJouer > 0 )&&(coupJouer <= NOMBRE_DE_CASE))
{
return coupJouer;
}
else
{
printf("\nle nombre n'est pas valide choisi un autre nombre :");
}
}while(1);
}
void jouerCoup(int *grille,const int joueur)
{
int coup = 0, coupBon = 0;
do
{
//-1 pour rattraper
coup = (saisie() - 1);
//vérifié si le coup est jouable et le place dans la grille
if(grille[coup] == 0)
{
coupBon = 0;
grille[coup] = joueur;
}
else
{
coupBon = 1;
printf("\nvous ne pouvez pas jouez cet case choisissez une autre case :");
}
}while(coupBon);
}
int testGagnant(const int grille[],const int joueur)
{
int i = 0,l = 0,
gagne[4] = {0}, partieNul = 0;
for(i=0;i<NOMBRE_DE_LIGNE;i++)
{
for(l=0;l<NOMBRE_DE_LIGNE;l++)
{
//test les horizontal
if ((grille[(NOMBRE_DE_LIGNE * i)] != 0) && (grille[(NOMBRE_DE_LIGNE * i)] == grille[(l+(NOMBRE_DE_LIGNE * i))]))
{
gagne[0]++;
}
//.........
//test les vertical
if ((grille[i] != 0) && (grille[i] == grille[(l * NOMBRE_DE_LIGNE + i)]))
{
gagne[1]++;
}
//........
// test des diagonal
if(i == 0)
{
if((grille[i] !=0) && (grille[i] == grille[(l * NOMBRE_DE_LIGNE)+ l]))
{
gagne[2]++;
}
if((grille[NOMBRE_DE_LIGNE -1] !=0) && (grille[NOMBRE_DE_LIGNE - 1] == grille[(NOMBRE_DE_LIGNE - 1) + (l*(NOMBRE_DE_LIGNE - 1))]))
{
gagne[3]++;
}
}
//............
//test si partie nul
if (grille[(l+(NOMBRE_DE_LIGNE * i))] == 0)
{
partieNul++;
}
}
//verifie si une ligne gagnant
for(l=0;l<4;l++)
{
if(gagne[l] >= NOMBRE_DE_LIGNE)
{
printf("\nle joueur %d a gagner !",joueur);
return 0;
}
else //si non remis a 0
{
gagne[l] = 0;
}
}
}
//...............
if(partieNul > 0)
{
return 1;
}
//si match nul
else
{
printf("\nmatch nul !");
return 0;
}
}
int main(void)
{
int joueur = 0,
grille[NOMBRE_DE_CASE];
srand(time(NULL));
//boucle pour rejouer
do
{
initialisation(&joueur, grille);
//boucle du jeux
do
{
choixDuJoueur(&joueur);
affichage(grille,joueur);
jouerCoup(grille, joueur);
}while(testGagnant(grille,joueur));
printf("\nvous rejouez 1.NON 2.OUI ?:");
}while(saisie() != 1);
return 0;
}
@moliplate :
Tu n'utilises pas les argc et argv, inutile de les déclarer dans le main. D'ailleurs tu as inversé argc et argv. argc sert à compter le nombre d'arguments : ARGument Count et argv ARGument Vector.
On préfèrera appeler les fonctions après les déclarations de variables (srand).
Ton nom de variable pour la boucle est mal choisi je trouve. Si je traduit ta boucle ça fait : Tant que j'ai 'gagne' je boucle.
J'ai pas bien saisi pourquoi tu crée un tableau dans ta fonction teste_Case.
Tu pourrais améliorer ton if...else dans ta boucle principale histoire d'éviter tes répétitions.
Dans ta fonction teste_Gagnant tu devrais mettre des parenthèses.
Ta condition d'arrêt est fausse :
o x o
o x x
o o x
Match null ...
@@che : (trop fort le @@)
Comme je t'ai dis, à mon goût ya encore des choses à améliorer.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int end_game(char tab[][3])
{
int i;
for(i=0;i<3;i++)/*On vérifie les lignes et les colonnes*/
{
if(tab[0][i] != '.' && tab[0][i] == tab[1][i] && tab[1][i] == tab[2][i])
{
printf("\nLe joueur %d a gagné", (tab[0][i]=='X')+1);
return 0;
}
else if(tab[i][0] != '.' && tab[i][0]==tab[i][1] && tab[i][1]==tab[i][2])
{
printf("\nLe joueur %d a gagné", (tab[i][0]=='X')+1);
return 0;
}
}
if(tab[0][0] != '.' && tab[0][0]==tab[1][1] && tab[1][1]==tab[2][2])/*On vérifie une diagonale*/
{
printf("\nLe joueur %d a gagné", (tab[1][1]=='X')+1);
return 0;
}
else if(tab[0][2] != '.' && tab[0][2]==tab[1][1] && tab[1][1]==tab[2][0])/*On vérifie l'autre*/
{
printf("\nLe joueur %d a gagné", (tab[1][3]=='X')+1);
return 0;
}
for(i=0;i<9;i++)/*On vérifie si il n'y a pas de match nul*/
{
if(tab[i/3][i%3]!='X' || tab[i/3][i%3]!='O')
return 1;
if(i==8)
printf("\nMatch nul !");
}
return 0;
}
void treat_input(char tab[][3], int entry, int player)
{
if(entry<9 && entry>=0)
{
if(player==1)
tab[entry/3][entry%3]='O';
else
tab[entry/3][entry%3]='X';
}
}
void display_tab(char tab[][3])
{
int i;
for(i=0;i<9;i++)
{
if(!(i%3))
printf("\n\n");
printf("%c ", tab[i/3][i%3]);
}
}
int game(void)
{
int entry=0, player=0;
char tab[3][3]={{'.', '.', '.'}, {'.', '.', '.'}, {'.', '.', '.'}};
srand(time(NULL));
player=rand()%2+1; /*détermine quel est le joueur qui joue le premier*/
printf("Au joueur %d de commencer\n", player);
display_tab(tab);
do
{
printf("\nJoueur %d : ", player);
scanf("%d", &entry);
entry--;/*On décrémente d'un pour faire correspondre l'entrée avec les indices du tableau*/
treat_input(tab, entry, player);
display_tab(tab);
player=(player)%2+1; /*on change le joueur*/
}while(end_game(tab));/*Tant que la partie n'est pas finie*/
return 0;
}
int main(void)
{
char c;
do
{
game();
while(getchar()!='\n');/*On vide le buffer*/
printf("Voulez vous rejouer ? (o/n) : ");
scanf("%c", &c);
}while(c!='n');
return 0;
}
J'ai également plusieurs questions du coup :
- Est-ce qu'il est mieux de mettre mon tableau en variable globale, et de l'initialiser à cha<ue début de partie, ou bien comme je fais actuellement ?
- Dans certaines fonctions, je fais plusieurs fois le même calcul (entry/3 et entry%3 par exemple). Le mieux est-il de laisser tel quel ou de créer une variable, faire le calcul une bonne fois pour toutes, puis d'utiliser ces variables pour accéder aux éléments de mon tableau ?
- Est-ce qu'il est mieux de mettre mon tableau en variable globale, et de l'initialiser à cha<ue début de partie, ou bien comme je fais actuellement ?
Non car tu vas te faire réprimander par Pouet_Forever.
Citation : baki
- Dans certaines fonctions, je fais plusieurs fois le même calcul (entry/3 et entry%3 par exemple). Le mieux est-il de laisser tel quel ou de créer une variable, faire le calcul une bonne fois pour toutes, puis d'utiliser ces variables pour accéder aux éléments de mon tableau ?
Je sais pas moi j'aurais mis une define. A mon avis c'est toi qui vois.
Sinon petite erreur dans ton code, un joueur peut remplacer une croix par un rond. Facile si on a envi de gagner
Joueur 1 : 1
O . .
. . .
. . .
Joueur 2 : 1
X . .
. . .
. . .
Sinon aussi tu ne gères pas les match nul (et c'est la que j'ai remarquer le bug précédents qui m'a permis de terminer la partie)
Joueur 1 : 9
X O X
. O X
O X O
Joueur 2 : 4
X O X
X O X
O X O
Joueur 1 : 1
O O X
X O X
O X O
Le joueur 1 a gagnéVoulez vous rejouer ? (o/n) :
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
J'ai bien la gestion du nombre de parti gagner, l'affichage bof(j'aime plutôt les affichages classiques) mais celui-ci est pas mal, main un peu surcharger.
Sinon dans l'ensemble pas mal, parcontre mauvaise gestion de qui à gagner:
| | | |
| X | O | X |
|___|___|___|
| | | |
| O | X | O |
|___|___|___|
| | | |
| 7 | X | 9 |
|___|___|___|
Victoire du joueur 1.
Rejouer ? 1. Oui
2. Non
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.