Bonjour petite communauté!
Je me tourne vers vous en cette "belle" journée pour vous soumettre un problème qui semble illogique... pour tous ceux à qui j'ai posée la question...
Pour mes études, je doit realiser un projet, un puissance 4 en C. Jusque là, tout va bien.
Toutefois, certaine regles sont imposées:
-2 variables globales ( ... ) -Un tableau a deux dimensions 6x7 d'entier appelé grille definissant une configuration du jeu
-Un tableau de 6 entiers appelé remplissage definissant l'état de remplissage de chaque colonne.
-Une fonction dansGrille(int x, int y) qui prend 2 entiers x et y et renvoie vrai s'il existe une case de coordonnées (x,y) dans la grille
-Une fonction jouable(int x) qui renvoie vrai s'il est possible de poser un jeton dans la colonne x.
-Une fonction saisirCoup() qui demande de saisir un numero de colonne jusqu'a ce que celui ci soit valide puis retourne ce numero.
-Une fonction afficherGrille() qui affiche la grille en mode texte.
( Espace pour les cases vides, O et X pour les jetons des joueurs.
-Le programme main() qui permet d'initialiser la grille et de faire jouer les joueurs (et afficher la grille)
-Une fonction estRemplieOuNon() qui renvoie vrai si la grille est pleine (faux si non...)
Le reste, pour l'instant peu importe.
J'ai donc un problème pour le positionnement des jetons...
Voilà mon code brut:
Code:
___________________________________________________________________________________________________________
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197 //initialisation des bibliotheques necessaire au preprocesseur pour compiler le programme. #include <stdio.h> #include <stdlib.h> //Declarations des variables globales (beurkkkkkk!!!!!!) int grille[6][7];//le tableau grille garde en memoire les coups joués (caractere "X" pour le premier joueur et "O" pour le second; " " pour les case vide. int remplissage[6];//remplissage defini le nombre de case restante dans une colonne donnée. remplissage[]=0 <=> la colonne est pleine. Initialement, remplissage[]=6 // prototypes des fonctions. permet au programme principal main() de trouver les fonctions suivantes même si celles-ci sont placées en aval (aprés). int dansGrille(int x, int y); int jouable(int x); int saisirCoup(); int afficherGrille(); int estRemplieOuNon(); int adjacent(int c, int l, int dirV, int dirH); int partieEstGagneeOuPas(int c, int l); int main() { //declaration et initialisation des variables du programme main() int x, y, colonneDemandee, ligneDemandee, colonneJouee, ligneJouee; int numeroMatch = 1, victoireJ1 = 0, victoireJ2 = 0, aQuiLeTour=1; char nomJ1[100], nomJ2[100]; char rejouerUnePartie; //Initialisation des variables globales for (x=0; x<=6; x++) { remplissage[x]=6; //initialisation du tableau remplissage. Initialement il y a 6 cases vides dans chaque colonne. for (y=0; y<=5; y++) grille[x][y]=32; /*initialisation du tableau grille (met toutes les cases a "libre"). 32 est le nombre pour lequel le caractere "espace" apparaitra lors de l'affichage de la grille*/ } //Debut du programme printf("******* Projet Puissance 4 ******** \n\t\t\t\t by X. \n\n"); printf("Bonjour, veuillez entrez le nom du premier joueur: "); scanf("%s", nomJ1); printf("Veuillez a present entrez le nom du second joueur: "); scanf("%s", nomJ2); system("cls"); printf("Match numero %d\n", numeroMatch); printf(" Victoires\n%s: %d %s:%d\n\n", nomJ1, victoireJ1, nomJ2, victoireJ2); do { afficherGrille(); //Au joueur 1 de jouer do { printf("Joueur 1:\n");//renseigne les joueurs sur la personne devant jouer. colonneDemandee=saisirCoup(); //Le numero de colonne valide (verifié par la fonction saisirCoup) est stocké dans la variable "colonneDemandee". } while (jouable(colonneDemandee)!=1); // condition inversée! redemandera au joueur de rentrer un numero de colonne jusqu'a ce que celui ci soit valide et validé par la fonction jouable. ligneDemandee=remplissage[colonneDemandee]; grille[colonneDemandee][ligneDemandee]='X'; // Une fois que la colonne et la ligne choisis sont valides, on place le caractere specifique au joueur dans la grille. remplissage[colonneDemandee]=remplissage[colonneDemandee]-1; // On met a jour le tableau remplissage en enlevant la case pris par le pion joué if (partieEstGagneeOuPas(colonneJouee, ligneJouee)==0) { //Au joueur 2 de jouer do { system("cls"); afficherGrille(); printf("Joueur 2:\n"); colonneDemandee=saisirCoup(); } while (jouable(colonneDemandee)!=1); grille[colonneDemandee][remplissage[colonneDemandee]]='O'; colonneJouee=colonneDemandee; ligneJouee=remplissage[colonneDemandee]; remplissage[colonneDemandee]=remplissage[colonneDemandee]-1; if (partieEstGagneeOuPas(colonneJouee, ligneJouee)==1) printf("%s a gagnee!!\n", nomJ2); } else printf("%s a gagnee!!\n", nomJ1); } while (partieEstGagneeOuPas(colonneJouee, ligneJouee)==0 || estRemplieOuNon()==0); printf("Voullez vous rejouer une partie? (O/N):"); scanf("%c", rejouerUnePartie); if (rejouerUnePartie='O') system("main"); return 0; } int afficherGrille() //fonction permettant l'affichage de la grille du jeu. { //system("Cls");//permet d'effacer l'ecran et reafficher une nouvelle grille. printf("\t 1 2 3 4 5 6 7\n\t"); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][0], (char) grille[1][0], (char) grille[2][0], (char) grille[3][0], (char) grille[4][0], (char) grille[5][0], (char) grille[6][0]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][1], (char) grille[1][1], (char) grille[2][1], (char) grille[3][1], (char) grille[4][1], (char) grille[5][1], (char) grille[6][1]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][2], (char) grille[1][2], (char) grille[2][2], (char) grille[3][2], (char) grille[4][2], (char) grille[5][2], (char) grille[6][2]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][3], (char) grille[1][3], (char) grille[2][3], (char) grille[3][3], (char) grille[4][3], (char) grille[5][3], (char) grille[6][3]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][4], (char) grille[1][4], (char) grille[2][4], (char) grille[3][4], (char) grille[4][4], (char) grille[5][4], (char) grille[6][4]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][5], (char) grille[1][5], (char) grille[2][5], (char) grille[3][5], (char) grille[4][5], (char) grille[5][5], (char) grille[6][5]); printf("+-+-+-+-+-+-+-+\n\t\n\n"); return 0; } int saisirCoup() { //declaration et initialisation variable colonneDemandee necessaire a saisircoup() int colonneDemandee; printf("Saisissez le numero de la colonne ou vous souhaitez faire tomber le jeton\n"); scanf("%d", &colonneDemandee); colonneDemandee=colonneDemandee-1; // Le -1 est pour la correlation entre l'affichage et le tableau du programme. while (colonneDemandee<0 || colonneDemandee>6) { printf("Veuillez entrez un numero de colonne valide:"); scanf("%d", &colonneDemandee); colonneDemandee=colonneDemandee-1; } return (colonneDemandee); } int jouable(int x) { //declaration et initialisation de la variable colonneJouable necessaire a jouable() int colonneDemandee; colonneDemandee = (remplissage[x]>0) ? 1 : 0; //colonneJouable = 1 si il est possible de jouer (la colonne n'est pas pleine) return colonneDemandee; } int dansGrille(int x, int y) { //declaration et initialisation de la variable caseExisteOuPas necessaire a dansGrille(), initialement la case est supposé ne pas exister int caseExisteOuPas = 0; /* Utilisation des conditions "basiques" if (x>0 && y>0 && x=<6 && y=<7) caseExisteOuPas = 1; else caseExisteOuPas = 0; */ caseExisteOuPas = (x>0 && y>0 && x<=6 && y<=5) ? 1 : 0; //renvoie vrai si la condition est satisfaite (caseExisteOuPas = 1) ou renvoie faux sinon (caseExisteOuPas = 0) a l'aide de ternaire return caseExisteOuPas; } int estRemplieOuNon() { int grilleRemplie = 0; //Si toutes les colonnes du tableau sont pleines (=7), alors la grille est remplie. if(remplissage[0]==7 && remplissage[1]==7 && remplissage[2]==7 && remplissage[3]==7 && remplissage[4]==7 && remplissage[5]==7 && remplissage[6]==7) grilleRemplie = 1; else grilleRemplie = 0; return grilleRemplie; } int partieEstGagneeOuPas(int c, int l) { return 0; }
Mais j'ai reussi a plus ou moins localiser le probleme:
En simplifiant au maximun mon code et en rajoutant quelques lignes pour voir ce qui se passe dans les 2 tableaux (grille et remplissage):
Code:
______________________________________________________________________________________________________________________________
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167 //initialisation des bibliotheques necessaire au preprocesseur pour compiler le programme. #include <stdio.h> #include <stdlib.h> //Declarations des variables globales (beurkkkkkk!!!!!!) int grille[6][7];/*le tableau grille garde en memoire les coups joués (caractere "X" pour le premier joueur et "O" pour le second; " " pour les case vide.*/ int remplissage[6];/*remplissage defini le nombre de case restante dans une colonne donnée. remplissage[]=0 <=> la colonne est pleine. Initialement, remplissage[]=6 car il y a six cases vides dans chaque colonne */ // prototypes des fonctions. permet au programme principal main() de trouver les fonctions suivantes même si celles-ci sont placées en aval (aprés). int dansGrille(int x, int y); int jouable(int x); int saisirCoup(); int afficherGrille(); int main() { //declaration et initialisation des variables du programme main() int x, y, colonneDemandee, ligneDemandee; //Initialisation des variables globales for (x=0; x<=6; x++) { remplissage[x]=6; //initialisation du tableau remplissage. Initialement il y a 6 cases vides dans chaque colonne. printf("%d %d\n", x, remplissage[x]); for (y=0; y<=5; y++) { grille[x][y]=' '; /*initialisation du tableau grille (met toutes les cases a "libre")*/ printf("%d-%d -- %d\n", x, y, grille[x][y]); } } //Debut du programme printf("******* Projet Puissance 4 ******** \n\t\t\t\t by X. \n\n"); do { afficherGrille(); //Au joueur 1 de jouer do { printf("Joueur 1:\n");//renseigne les joueurs sur la personne devant jouer. colonneDemandee=saisirCoup(); /*Le numero de colonne valide (verifié par la fonction saisirCoup) est stocké dans la variable "colonneDemandee".*/ } while (jouable(colonneDemandee)!=1); /* condition inversée! redemandera au joueur de rentrer un numero de colonne jusqu'a ce que celui ci soit valide et validé par la fonction jouable.*/ ligneDemandee=remplissage[colonneDemandee]; grille[colonneDemandee][ligneDemandee]='X'; /* Une fois que la colonne et la ligne choisis sont valides, on place le caractere specifique au joueur dans la grille.*/ remplissage[colonneDemandee]--; // On met a jour le tableau remplissage en enlevant la case pris par le pion joué for (x=0; x<=6; x++) { printf("%d %d\n", x, remplissage[x]); for (y=0; y<=5; y++) { printf("%d-%d -- %d\n", x, y, grille[x][y]); }} //Au joueur 2 de jouer do { afficherGrille(); printf("Joueur 2:\n"); colonneDemandee=saisirCoup(); } while (jouable(colonneDemandee)!=1); grille[colonneDemandee][remplissage[colonneDemandee]]='O'; remplissage[colonneDemandee]=remplissage[colonneDemandee]-1; for (x=0; x<=6; x++) { printf("%d %d\n", x, remplissage[x]); for (y=0; y<=5; y++) { printf("%d-%d -- %d\n", x, y, grille[x][y]); }} } while (1); return 0; } int afficherGrille() //fonction permettant l'affichage de la grille du jeu. { //system("Cls");//permet d'effacer l'ecran et reafficher une nouvelle grille. printf("\t 1 2 3 4 5 6 7\n\t"); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][0], (char) grille[1][0], (char) grille[2][0], (char) grille[3][0], (char) grille[4][0], (char) grille[5][0], (char) grille[6][0]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][1], (char) grille[1][1], (char) grille[2][1], (char) grille[3][1], (char) grille[4][1], (char) grille[5][1], (char) grille[6][1]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][2], (char) grille[1][2], (char) grille[2][2], (char) grille[3][2], (char) grille[4][2], (char) grille[5][2], (char) grille[6][2]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][3], (char) grille[1][3], (char) grille[2][3], (char) grille[3][3], (char) grille[4][3], (char) grille[5][3], (char) grille[6][3]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][4], (char) grille[1][4], (char) grille[2][4], (char) grille[3][4], (char) grille[4][4], (char) grille[5][4], (char) grille[6][4]); printf("+-+-+-+-+-+-+-+\n\t"); printf("|%c|%c|%c|%c|%c|%c|%c|\n\t", (char) grille[0][5], (char) grille[1][5], (char) grille[2][5], (char) grille[3][5], (char) grille[4][5], (char) grille[5][5], (char) grille[6][5]); printf("+-+-+-+-+-+-+-+\n\t\n\n"); return 0; } int saisirCoup() { //declaration et initialisation variable colonneDemandee necessaire a saisircoup() int colonneDemandee; printf("Saisissez le numero de la colonne ou vous souhaitez faire tomber le jeton\n"); scanf("%d", &colonneDemandee); colonneDemandee=colonneDemandee-1; // Le -1 est pour la correlation entre l'affichage et le tableau du programme. while (colonneDemandee<0 || colonneDemandee>6) { printf("Veuillez entrez un numero de colonne valide:"); scanf("%d", &colonneDemandee); colonneDemandee=colonneDemandee-1; } return (colonneDemandee); } int jouable(int x) { //declaration et initialisation de la variable colonneJouable necessaire a jouable() int colonneDemandee; colonneDemandee = (remplissage[x]>0) ? 1 : 0; //colonneJouable = 1 si il est possible de jouer (la colonne n'est pas pleine) return colonneDemandee; } int dansGrille(int x, int y) { //declaration et initialisation de la variable caseExisteOuPas necessaire a dansGrille(), initialement la case est supposé ne pas exister int caseExisteOuPas = 0; /* Utilisation des conditions "basiques" if (x>0 && y>0 && x=<6 && y=<7) caseExisteOuPas = 1; else caseExisteOuPas = 0; */ caseExisteOuPas = (x>0 && y>0 && x<=6 && y<=5) ? 1 : 0; //renvoie vrai si la condition est satisfaite (caseExisteOuPas = 1) ou renvoie faux sinon (caseExisteOuPas = 0) a l'aide de ternaire return caseExisteOuPas; }
Et voilà... les pions ne se mettent pas ou ils devraient, et une autre case joue les jmen foutiste en se decrementant de 1 a chaque fois qu'un joueur joue...
Je ne vois vraiment pas le probleme, s'il vous plait, HELPPPPPPPP!!!!!!!!!!!!!!!!!!!!!!
Pour ceux qui prendront un peu de leur temp, merci infiniment!!!!!
A bientôt (J'espere!!!!!)
Partager