CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

help en C (morpion lol)

Gh0sTCaT
Gh0sTCaT
Niveau 5
18 mars 2003 à 18:31:40

Voila je fais un petit jeu du morpion pour m´entrainer, donc g qqs prob :

- il est chelou lol : (
- g que des O et je voudrais mettre des X
- mon code doit etre completement faux :
//les includes

  1. include <stdio.h>
  2. include <stdlib.h>

char matrice[3][3]; //matrice du morpion
char fin;

char check(void);
void init_matrice(void);
void joueur(void);
void joueur2(void);
void disp_matrice(void);

//programme principal
int main(void)
{

char done;

printf("Ceci est le jeu du morpion\n");
printf("Vous jouez contre un ami a vous\n");

done = ´ ´;
init_matrice();

do
{
disp_matrice();
joueur();

//déterminer s´il existe un vainqueur
done = check();
if ( done ! = ´ ´) break; //gagné
player2();

//déterminer s´il existe un vainqueur
done = check();
}
while ( done == ´ ´);
if(done == ´X´) printf("Vous avez gagné\n");
else printf("J\´ai gagné\n");

//afficher les positions finales
disp_matrice();
getch();
}

//initialiser la matrice
void init_matrice(void)
{

int i, j;

for ( i = 0; i < 3; i++)
for ( j = 0; j < 3; j++) matrice[i][j] = ´ ´;

}

//obtenir un mouvement du joueur
void joueur(void)
{

int x, y;

//le joueur décide où il va jouer
la :
printf("Pour jouer, entrez les coordonnées x et y\n\n");
scanf("%d %d", &, &);
getchar();
x--;
y--;

//vérification de la validité des coordonnées entrées par le joueur
if(matrice[x][y] ! = ´ ´)
{
printf("choix non valide, réentrez vos coordonnées\n");
goto la;
}
else matrice[x][y] = ´O´;

}

//faire jouer l´ordinateur
void player2(void)
{
int i, j;

for(i = 0; i < 3; i++);

for(j = 0; j < 3; j++);
if(matrice[i][j] == ´ ´)
{
goto ici;
}
if(matrice[i][j] == ´O´) getch();

//on teste si la partie est nulle
ici :
if(i * j == 9)
{
printf("partie nulle\n");
}
else matrice[i][j] = ´X´;
}

//afficher la matrice à l´écran
void disp_matrice(void)
{

int t;

for(t = 0; t < 3; t++)
{
printf(" %c | %c | %c", matrice[t][0], matrice[t][1], matrice[t][2]);
if(t ! = 2) printf("\n---|---|---\n");
}
printf("\n");
}

//déterminer s´il y a un vainqueur
char check(void)
{

int i;

//vérification des lignes
for(i = 0; i < 3; i++)
if(matrice[i][0] == matrice[i][1] && matrice [i][0] == matrice[i][2])
{
return matrice[i][0];
}

//contrôle des colonnes
for(i = 0; i < 3; i++)
if(matrice[0][i] == matrice[1][i] && matrice[0][i] == matrice[2][i])
{
return matrice[0][i];
}

//examen des diagonales
if(matrice[0][0] == matrice[1][1] && matrice[1][1] == matrice[2][2])
{
return matrice[0][0];
}

if(matrice[0][2] == matrice[1][1] && matrice[1][1] == matrice[2][0])
{
return matrice[0][2];
}

return ´ ´;
}

Diwi
Diwi
Niveau 5
19 mars 2003 à 11:32:24

Salut, ton pb provient peut etre de la.
for(i = 0; i < 3; i++);

for(j = 0; j < 3; j++);
if(matrice[i][j] == ´ ´)
{
goto ici;
}
if(matrice[i][j] == ´O´) getch();

Lorsque tu fait une boucle for avec un ; a la fin en fait, tu fait tourner tous le temps le boucle sans traiter en dessous.
Pour mieux m´exprimer, la ligne
for(i = 0; i < 3; i++);
ne traite pas en dessous mais tourne seule.
Après cette ligne ( juste apres), tu auras i = 3

Pour faire tourner ton prog comme il faut, essaie :
for(i = 0; i < 3; i++) {
for(j = 0; j < 3; j++) {
if(matrice[i][j] == ´ ´) goto ici;
}
}
if(matrice[i][j] == ´O´) getch();

Voila, dis moi si ca a marché ( j´ai pas pu le tester).
Salut.

Gh0sTCaT
Gh0sTCaT
Niveau 5
19 mars 2003 à 13:01:03

Bien vu!!
c´est exactement ca il marche maintenant.
Merci ! !

JeanYvesYves
JeanYvesYves
Niveau 10
19 mars 2003 à 13:50:27

chapeau Diwi !

C toujours les erreurs chiantes a detecter ça, les ; apres un while ou un for qui génerent des boucles a vide !

Faut faire super gaffe à ça, C une erreur con, et en général, elle ne génere pas de warnings

l´autre erreur a controler ( qui genere des fois un warning sur certains compilateurs), est :

if ( a=3) {...}
dans ce cas, a est assigné a 3, puis 3 étant positif, la condition est respectée a 100%
on le met souvent a la place de
if ( a==3) {...}

JeanYvesYves
JeanYvesYves
Niveau 10
19 mars 2003 à 13:52:17

Autre petite remarque :

ton programme contient des "goto"
en fait, goto est considéré par beaucoup de programmeurs comme une instruction sale, car elle interrompt brutalement qq chose.
Essaie, peu a peu, d´en mettre le moins possible : )

Gh0sTCaT
Gh0sTCaT
Niveau 5
19 mars 2003 à 19:02:29

je sais pour les goto, mais dans mon code de depart, j´avais mis des break, et mon compilateur ( Dev C++ 4) me disait qu´il fallait absolument etre dans un switch pour pouvoir utiliser break ou continue, j´ai donc remplace les break par des goto et la ca a marche...
Je n´ai trouve aucune autre solution a part les goto et etant un ex programmeur Basic ( pas tres bon d´ailleurs), j´ai trop tendance a utiliser les goto des que je rencontre un probleme...

Merci pour les remarques sur les erreurs!!

Passage
Passage
Niveau 10
19 mars 2003 à 19:03:33

Cher JeanYvesYves :
J´va remettre le couvert sur le goto...
Y a quelques mois, j´en ai aussi debattu sur ce forum, avec peu de succes je l´admets... Mais je suis une sacrée tete de mule alors je repars pourfendre les moulins a vents :

Pourquoi le goto est il "sale" ?
Pourquoi le break est il "propre" ?

Finalement, qu´elle est le critere d´une instruction "propre" et "sale" ? ??????

Pourtant ces 2 instructions permettent une rupture de sequence ( oh ! ! c´est beau ca le terme "rupture de sequence" ) .

  • Attention* Me faites pas dire ce que j´ai po dis: Dans le programme donné en exemple je n´approuve pas l´utilisation d´un goto.

Par contre, je note avec plaisir, la methode et le conseil. Chapeau bas pour Monsieur JeanYvesYves !

: )

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment