gcc -W -Wall -std=c99 morpion.c
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> static const int SIZE = 3; void initTableau2D(char tab[SIZE][SIZE]) { for(int i = 0; i < SIZE; ++i) for (int j = 0; j < SIZE; ++j) tab[i][j] = ' '; } int lireChiffre(void) { int nb = 0; bool stop = false; do { printf("Entrez votre positionnement: "); int res = scanf("%i", &nb); if (res != 1 || nb < 1 || nb > 9) printf("Nombre invalide !\n"); else stop = true; } while (!stop); return nb; } bool placerPion(char tab[SIZE][SIZE], int joueur, int v, int h) { char valeur = joueur == 1 ? 'X' : 'O'; if (tab[v][h] != ' ') { printf("La case est déjà remplie !\n"); return false; } tab[v][h] = valeur; return true; } void placement(char tab[SIZE][SIZE], int joueur) { bool place = false; while (!place) { switch (lireChiffre()) { case 1: place = placerPion(tab, joueur, 2, 0); break; case 2: place = placerPion(tab, joueur, 2, 1); break; case 3: place = placerPion(tab, joueur, 2, 2); break; case 4: place = placerPion(tab, joueur, 1, 0); break; case 5: place = placerPion(tab, joueur, 1, 1); break; case 6: place = placerPion(tab, joueur, 1, 2); break; case 7: place = placerPion(tab, joueur, 0, 0); break; case 8: place = placerPion(tab, joueur, 0, 1); break; case 9: place = placerPion(tab, joueur, 0, 2); break; } } } bool verifieVictoire(char tab[SIZE][SIZE], int joueur) { char valeur = joueur == 1 ? 'X' : 'O'; for (int i = 0; i < SIZE; ++i) { if (tab[i][0] == valeur && tab[i][1] == valeur && tab[i][2] == valeur) return true; if (tab[0][i] == valeur && tab[1][i] == valeur && tab[2][i] == valeur) return true; } if (tab[0][0] == valeur && tab[1][1] == valeur && tab[2][2] == valeur) return true; if (tab[0][2] == valeur && tab[1][1] == valeur && tab[2][0] == valeur) return true; return false; } void affichageTable(char tab[SIZE][SIZE]) { printf("-------\n"); for (int i = 0; i < SIZE; ++i) { printf("|"); for(int j = 0; j < SIZE; ++j) printf("%c|", tab[i][j]); printf("\n"); } printf("-------\n"); } int main(void) { int joueur = 0; int tour = 0; char table[SIZE][SIZE]; bool stop = false; initTableau2D(table); affichageTable(table); while (!stop) { joueur = (joueur + 1) % 2; printf("Joueur %i, ", joueur); placement(table, joueur); affichageTable(table); if (verifieVictoire(table, joueur)) { printf("Joueur %i gagne !", joueur); stop = true; } ++tour; if (!stop && tour >= 9) { printf("Egalité !"); stop = true; } } return 0; }
peu etre pas la meilleur façon de coder mais c'est la mienne pour le momentTu ne progresseras pas si tu fais à ta "sauce". Pour progresser, il faut assimiler les conseils que l'on te donne, et non les ignorer.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question#include <stdio.h> #include <stdlib.h> static const int SIZE = 3; void InitTableau2D(char Temp[SIZE][SIZE]); void placement(char Temp[SIZE][SIZE],int joueur); void placerPion(char tab[SIZE][SIZE], int joueur, int v, int h); int VerifieVictoire(char Temp[SIZE][SIZE]); void AffichageTable(char Temp[SIZE][SIZE]); int LireCiffre(void); int main(void) { int joueur = 0; char gagnant; char table[SIZE][SIZE]; InitTableau2D(table); AffichageTable(table); do { if((joueur%2)==0) { gagnant='A'; } else { gagnant='B'; } if(joueur==9) { printf("\negaliter\n"); printf("continuer? O/n ?"); if(getchar()=='O'||'\n'||'o') { gagnant='N'; InitTableau2D(table); AffichageTable(table); } else { gagnant='O'; } } else { printf("Joueur %c",gagnant); placement(table,joueur); AffichageTable(table); if(VerifieVictoire(table)!=0) { printf("\nJoueur %c gagne\n",gagnant); printf("continuer? O/n ?"); if(getchar()=='O'||'\n'||'o') { gagnant='N'; joueur=-1; InitTableau2D(table); AffichageTable(table); } else { gagnant='O'; } } } joueur++; }while(gagnant!='O'); return 0; } int LireCiffre(void) { char chaine[1]; int nb; gets(chaine); nb=atoi(chaine); return nb; } void InitTableau2D(char Temp[SIZE][SIZE]) { int i,j; for(i=0;i<SIZE;i++) { for(j=0;j<SIZE;j++) { Temp[i][j]=' '; } } } void placement(char Temp[SIZE][SIZE],int joueur) { printf("\nentrer votre positionement\n"); switch (LireCiffre()) { case 1: placerPion(Temp, joueur, 2, 0); break; case 2: placerPion(Temp, joueur, 2, 1); break; case 3: placerPion(Temp, joueur, 2, 2); break; case 4: placerPion(Temp, joueur, 1, 0); break; case 5: placerPion(Temp, joueur, 1, 1); break; case 6: placerPion(Temp, joueur, 1, 2); break; case 7: placerPion(Temp, joueur, 0, 0); break; case 8: placerPion(Temp, joueur, 0, 1); break; case 9: placerPion(Temp, joueur, 0, 2); break; default: printf("erreur "); placement(Temp,joueur); break; } } void placerPion(char tab[SIZE][SIZE], int joueur, int v, int h) { char valeur; if((joueur%2)!=0) { valeur='O'; } else { valeur='X'; } if (tab[v][h] != ' ') { printf("La case est déjà remplie !\n"); placement(tab,joueur); } else { tab[v][h] = valeur; } } int VerifieVictoire(char Temp[SIZE][SIZE]) { int i; for(i=0;i<SIZE;i++) { if((Temp[i][0]==Temp[i][1])&&(Temp[i][1]==Temp[i][2])&&(Temp[i][1]!=' ')) { return 1; } else { if((Temp[0][i]==Temp[1][i])&&(Temp[1][i]==Temp[2][i])&&(Temp[1][i]!=' ')) { return 1; } } } if((Temp[0][0]==Temp[1][1])&&(Temp[1][1]==Temp[2][2])&&(Temp[1][1]!=' ')) { return 1; } else { if((Temp[0][2]==Temp[1][1])&&(Temp[1][1]==Temp[2][0])&&(Temp[1][1]!=' ')) { return 1; } } return 0; } void AffichageTable(char Temp[SIZE][SIZE]) { int i,j; printf("-------\n"); for(i=0;i<SIZE;i++) { printf("|"); for(j=0;j<SIZE;j++) { if(Temp[i][j]==' ') { printf(" "); } else { if(Temp[i][j]=='X') { printf("X"); } else { if(Temp[i][j]=='O') { printf("O"); } } } printf("|"); } printf("\n-------\n"); } }
le fait de les refaire a ma sauce etais justement pour bute de mieux assimiler le codeJe ne critique pas la démarche du "je refait à ma sauce pour comprendre", qui est louable (Si ne serait-ce que 10% des visiteurs de ce site en faisant autant que toi, ça serait vraiment génial !). Ce qui n'est pas terrible, c'est que la formulation laisse penser que c'est une bonne version. Ce n'est malheureusement pas le cas. Pour bien préciser, la démarche est bien évidemment bonne, et je ne la critique pas. Mais étant sur un site de débutant, ça créer une ambiguïté accentué par le fait que ta réponse était la dernière (et un débutant n'y connaissant rien, va sauter, à tort, sur la dernière réponse).
(c'est pas mechant mais tu n'a pas vraiment expliquer ton code).Il suffit simplement de demander des précisions. Je ne peux pas deviner ce qui n'est pas clair pour toi, mais je peux t'expliquer n'importe quel point sans souci.
Apres le fait de declarer mes fonction en premier vien de comment j'ai apris a coder et du fait que je trouve sa plus claireL'ordre deviendra plus important pour "ranger" tes fonctions plus tard. Notamment quand tu découperas tes fonctions dans des fichiers (et que tu voudras limiter la portée d'utilisation de celle-ci, notion que tu découvriras plus tard) ou que tu auras des soucis de "forward declaration" (en gros de dépendances circulaires). Bien comprendre que l'ordre à une importance, et prendre l'habitude de l'utiliser, te servira plus tard. D'ou mon "c'est moche", car tu verras vite que c'est une pratique que tu abandonneras rapidement. D'un point de vue technique, ce n'est bien évidemment pas une erreur, et c'est complètement équivalent.
Ensuite de fonction d'eprecier sa depand par qui et pourquoi enfin bon zapon.Déprécié (deprecated en anglais) ne veut pas dire: "Des gens trouvent ça moche", mais "La fonction est considérée comme obsolète, son utilisation pose problème, et cette fonction a vocation a offciellement disparaître dans les prochaines versions". C'est par exemple le cas de "gets", qui ne fait aucune vérification de débordement, et augmente sensiblement les risques de "plantage". C'est la fonction préférée des experts en sécurité car elle est source de grosse faille logiciel, ce qui les arrange bien ^^. Cette fonction va disparaître dans la prochaine version "C11" (déjà utilisable d'ailleurs).
Et tu conseille a quiquonque interesser pas se thread de reprendre ma versionC'est l'inverse en fait, je le déconseille. Comme déjà expliqué, je suis obligé de le faire, puisqu'un débutant ne peut pas faire la différence entre ce qu'il faut faire et éviter.