Commit b7871cd9435d3bc39dda0c0e457425211f0836e2
1 parent
3823fa4b
version finale de notre projet
Showing
1 changed file
with
209 additions
and
110 deletions
Show diff stats
neutron.c
@@ -8,50 +8,54 @@ | @@ -8,50 +8,54 @@ | ||
8 | #define vert "\033[;32m" | 8 | #define vert "\033[;32m" |
9 | #define bleu "\033[;34m" | 9 | #define bleu "\033[;34m" |
10 | 10 | ||
11 | -#define green 0 | ||
12 | -#define blue 1 | ||
13 | -#define red 2 | ||
14 | -#define empty -1 | 11 | +#define green 0 //L'entier 0 correspond au neutron |
12 | +#define blue 1 //L'entier 1 correspond au pion bleu (Joueur Bleu) | ||
13 | +#define red 2 //L'entier 2 correspond au pion rouge (Joueur Rouge) | ||
14 | +#define empty -1 //L'entier -1 correspond à une case vide | ||
15 | 15 | ||
16 | +//Structure damier | ||
16 | typedef struct d{ | 17 | typedef struct d{ |
17 | - int tab[N][N]; | 18 | + int tab[N][N];//tableau d'entier dont chaque entier correspond à un pion selon les variables globales définies |
18 | int indl; //indice de ligne du neutron | 19 | int indl; //indice de ligne du neutron |
19 | int indc; //indice de colonne du neutron | 20 | int indc; //indice de colonne du neutron |
20 | }damier; | 21 | }damier; |
21 | 22 | ||
22 | 23 | ||
23 | -//fonction qui initialise un damier | 24 | +//Fonction qui initialise un damier |
24 | damier init(){ | 25 | damier init(){ |
25 | damier d; | 26 | damier d; |
26 | - int i,j; | 27 | + int i,j;//indice de ligne et de colonne du champ tab dans le damier |
27 | 28 | ||
28 | for(i=0;i<N;i++){ | 29 | for(i=0;i<N;i++){ |
29 | for(j=0;j<N;j++){ | 30 | for(j=0;j<N;j++){ |
30 | - d.tab[i][j]=-1; | 31 | + d.tab[i][j]=-1;//On rempli le tableau de cases vides |
31 | } | 32 | } |
32 | } | 33 | } |
33 | 34 | ||
34 | for(j=0;j<N;j++){ | 35 | for(j=0;j<N;j++){ |
35 | - d.tab[0][j]=2; | 36 | + d.tab[0][j]=2;//On rempli la première ligne de pions rouges |
36 | } | 37 | } |
37 | 38 | ||
38 | for(j=0;j<N;j++){ | 39 | for(j=0;j<N;j++){ |
39 | - d.tab[4][j]=1; | 40 | + d.tab[4][j]=1;//On rempli la première ligne de pions bleus |
40 | } | 41 | } |
41 | 42 | ||
42 | 43 | ||
43 | - d.tab[2][2]=0; | 44 | + d.tab[2][2]=0;//On place le neutron au centre |
44 | 45 | ||
45 | - d.indl=3; | ||
46 | - d.indc=3; | 46 | + d.indl=3;//On initialise l'indice de ligne du neutron |
47 | + d.indc=3;//On initialise l'indice de colonne du neutron | ||
47 | 48 | ||
48 | return d; | 49 | return d; |
49 | } | 50 | } |
50 | 51 | ||
51 | -//fonction d'affichage d'un damier d donné | 52 | +//Fonction d'affichage d'un damier d donné |
52 | void affichage(damier d){ | 53 | void affichage(damier d){ |
53 | int i,j; | 54 | int i,j; |
55 | + | ||
56 | + printf("\n"); | ||
54 | for (i=0;i<N;i++){ | 57 | for (i=0;i<N;i++){ |
58 | + printf("%d ",N-i);//Affiche les numéros de lignes | ||
55 | for (j=0;j<N;j++){ | 59 | for (j=0;j<N;j++){ |
56 | if (d.tab[i][j]==green){ | 60 | if (d.tab[i][j]==green){ |
57 | printf("%s%s %s ",vert,reverse,reset); | 61 | printf("%s%s %s ",vert,reverse,reset); |
@@ -66,24 +70,30 @@ void affichage(damier d){ | @@ -66,24 +70,30 @@ void affichage(damier d){ | ||
66 | printf(" "); | 70 | printf(" "); |
67 | } | 71 | } |
68 | } | 72 | } |
69 | - printf("\n"); | 73 | + printf("\n\n"); |
70 | } | 74 | } |
75 | + printf(" "); | ||
76 | + for (j=0;j<N;j++){ | ||
77 | + printf(" %d ",j+1);}//Affiche les numéros de colonnes | ||
78 | + printf("\n\n"); | ||
71 | } | 79 | } |
72 | 80 | ||
73 | 81 | ||
74 | 82 | ||
75 | 83 | ||
76 | 84 | ||
77 | -/* dir : Donnée (donne la direction voulu par le joueur) | ||
78 | - i,j : Données,indice de ligne et de colonne du pion qu'on veut déplacer | ||
79 | - d: D/R | 85 | +/* dir : Donnée (donne la direction entre 1 et 8 voulu par le joueur) |
86 | + i,j : Données, indice de ligne et de colonne du pion qu'on veut déplacer | ||
87 | + d: D/R : Un damier donnée qu'on modifiera selon le déplacement voulu par le joueur | ||
80 | */ | 88 | */ |
81 | 89 | ||
90 | +//Fonction qui déplace un pion à la position i,j du damier d donné vers une direction dir donnée | ||
82 | void dep(int i,int j,int dir,damier *d){ | 91 | void dep(int i,int j,int dir,damier *d){ |
83 | - int temp; | 92 | + int temp;//Variable temporaire |
84 | i=N-i; | 93 | i=N-i; |
85 | - j=j-1; | 94 | + j=j-1;//remise des indices de lignes et de colonnes du pion à déplacer en indice de language C |
86 | 95 | ||
96 | + //Pour chaque direction donnée, on effectue un déplacement précis du pion choisi | ||
87 | if (dir==1){ | 97 | if (dir==1){ |
88 | while ((i>=1) && ((d->tab[i-1][j])==empty)){ | 98 | while ((i>=1) && ((d->tab[i-1][j])==empty)){ |
89 | temp=d->tab[i][j]; | 99 | temp=d->tab[i][j]; |
@@ -167,15 +177,21 @@ void dep(int i,int j,int dir,damier *d){ | @@ -167,15 +177,21 @@ void dep(int i,int j,int dir,damier *d){ | ||
167 | 177 | ||
168 | } | 178 | } |
169 | 179 | ||
170 | -// Fonction qui renvoie 0 si le déplacement n'est pas valide et 1 sinon | 180 | +/* d : damier donné |
181 | + i,j,dir : entiers donnés*/ | ||
182 | + | ||
183 | +//Fonction qui renvoie 0 si le déplacement d'un pion d'indices données i,j n'est pas valide (le déplacement vers la direction dir n'est pas possible pour le pion donné) et 1 sinon. | ||
184 | + | ||
171 | int valide(int i,int j,int dir,damier d){ | 185 | int valide(int i,int j,int dir,damier d){ |
172 | int valide; | 186 | int valide; |
173 | i=N-i; | 187 | i=N-i; |
174 | - j=j-1; | 188 | + j=j-1;//remise des indices de lignes et de colonnes du pion à déplacer en indice de language C |
189 | + | ||
175 | 190 | ||
176 | 191 | ||
177 | valide=1; | 192 | valide=1; |
178 | 193 | ||
194 | + //Pour chaque direction, on met valide à 0 si selon cette direction le pion est sur le bord du tableau ou la case à côté n'est pas vide | ||
179 | if(dir==8 && (i==0 || j==0 || (d.tab[i-1][j-1]!=empty)) ){ | 195 | if(dir==8 && (i==0 || j==0 || (d.tab[i-1][j-1]!=empty)) ){ |
180 | valide=0;} | 196 | valide=0;} |
181 | else if(dir==1 && (i==0 || d.tab[i-1][j]!=empty)){ | 197 | else if(dir==1 && (i==0 || d.tab[i-1][j]!=empty)){ |
@@ -192,156 +208,239 @@ int valide(int i,int j,int dir,damier d){ | @@ -192,156 +208,239 @@ int valide(int i,int j,int dir,damier d){ | ||
192 | valide=0;} | 208 | valide=0;} |
193 | else if(dir==7 && (j==0 || d.tab[i][j-1]!=empty)){ | 209 | else if(dir==7 && (j==0 || d.tab[i][j-1]!=empty)){ |
194 | valide=0;} | 210 | valide=0;} |
195 | - /*else if (1<=dir || dir>=8){ | ||
196 | - valide=0;}*/ | ||
197 | return valide==1; | 211 | return valide==1; |
198 | } | 212 | } |
199 | 213 | ||
200 | -// 1 si joueur est bleu et 2 si le joueur est rouge | ||
201 | -//renvoie 0 si perd et 1 si gagne | 214 | + |
215 | + | ||
216 | +/* d : un damier donné | ||
217 | +joueur :entier donné, 1 si le joueur est bleu et 2 si le joueur est rouge*/ | ||
218 | + | ||
219 | +//Fonction qui renvoie 1 si le joueur perd et 0 si il ne perd pas. On dit qu'un joueur perd lorsque le neutron ne peut plus se déplacer, ou aucun de ses pions ne peut plus se déplacer (aucun déplacement n'est valide pour tous ses pions) ou encore le neutron est dans le camp de l'autre joueur. | ||
202 | int perd(int joueur,damier d){ | 220 | int perd(int joueur,damier d){ |
203 | - int i=d.indl; | ||
204 | - int j=d.indc; | ||
205 | - int c=1; | ||
206 | - int perd=0; | 221 | + int i,j;//indice de ligne et de colonne du champ tableau dans le damier donné |
222 | + int c=1;//donne la direction de déplacement du pion | ||
223 | + int p=0;//si le joueur perd p=1, sinon p=0 | ||
224 | + int cpt; //compte le nomrbe de pions qui ne peuvent pas bouger | ||
225 | + | ||
207 | 226 | ||
227 | + //TEST SI LE NEUTRON PEUT SE DÉPLACER | ||
228 | + | ||
229 | + while(c<=8 && valide(d.indl,d.indc,c,d)==0){ | ||
230 | + c++;} | ||
208 | 231 | ||
232 | + if(c==9){ | ||
233 | + p=1;} | ||
234 | + | ||
235 | + | ||
209 | 236 | ||
210 | - //Test si les pions du joueur bleu peuvent se déplacer | ||
211 | - if(joueur==blue){ | ||
212 | - for(i=0;i<N;i++){ | 237 | + // TEST SI LES PIONS DU JOUEUR BLEU PEUVENT SE DÉPLACER |
238 | + | ||
239 | + cpt=0; | ||
240 | + if ( p!=1 && joueur==blue){ | ||
241 | + //On regarde si chaque déplacement de 1 à 8 peut être fait ou non pour le pion bleu à la position i,j | ||
242 | + for(i=0;i<N;i++){ | ||
213 | for(j=0;j<N;j++){ | 243 | for(j=0;j<N;j++){ |
214 | if(d.tab[i][j]==blue){ | 244 | if(d.tab[i][j]==blue){ |
215 | - while(c<=8 && valide(i,j,c,d)==0){ | 245 | + c=1; |
246 | + while(c<=8 && valide(N-i,j+1,c,d)==0){ | ||
216 | c++;} | 247 | c++;} |
217 | - | ||
218 | if(c==9){ | 248 | if(c==9){ |
219 | - perd=1;} | ||
220 | - else { perd=0;} | 249 | + cpt++;} |
221 | 250 | ||
222 | } | 251 | } |
223 | } | 252 | } |
224 | } | 253 | } |
225 | - if(d.indl==0) { | ||
226 | - perd=1; | 254 | + |
255 | + //Le joueur bleu perd si tous ses pions ne peuvent pas se déplacer ou si le neutron est la ligne adverse | ||
256 | + if(cpt==5 || d.indl==5) { | ||
257 | + p=1; | ||
227 | } | 258 | } |
259 | + | ||
228 | } | 260 | } |
261 | + | ||
229 | 262 | ||
230 | - //Test si les pions du joueur rouge peuvent se déplacer | ||
231 | - else if(joueur==red){ | 263 | + // TEST SI LES PIONS DU JOUEUR ROUGE PEUVENT SE DÉPLACER |
264 | + | ||
265 | + else if(p!=1 && joueur==red){ | ||
266 | + //On regarde si chaque déplacement de 1 à 8 peut être fait ou non pour le pion rouge à la position i,j | ||
232 | for(i=0;i<N;i++){ | 267 | for(i=0;i<N;i++){ |
233 | for(j=0;j<N;j++){ | 268 | for(j=0;j<N;j++){ |
234 | if(d.tab[i][j]==red){ | 269 | if(d.tab[i][j]==red){ |
235 | - while(c<=8 && valide(i,j,c,d)==0){ | 270 | + c=1; |
271 | + while(c<=8 && valide(N-i,j+1,c,d)==0){ | ||
236 | c++;} | 272 | c++;} |
237 | - | 273 | + |
274 | + //Si les 8 directions n'ont pas été valides, on comptes le pion comme non déplacable | ||
238 | if(c==9){ | 275 | if(c==9){ |
239 | - perd=1;} | ||
240 | - else { perd=0;} | 276 | + cpt++;} |
277 | + | ||
278 | + | ||
241 | } | 279 | } |
242 | } | 280 | } |
243 | } | 281 | } |
244 | - if(d.indl==4) { | ||
245 | - perd=1; | 282 | + |
283 | + //Si les cinq pions rouges ne peuvent pas se déplacer ou si le neutron est dans la ligne adverse, alors le joueur rouge perd | ||
284 | + if(cpt==5 || d.indl==1) { | ||
285 | + p=1; | ||
286 | + | ||
246 | } | 287 | } |
247 | } | 288 | } |
248 | - | ||
249 | - | ||
250 | - //TEST SI LE NEUTRON PEUT SE DÉPLACER | ||
251 | - c=1; | ||
252 | - while(c<=8 && valide(i,j,c,d)==0){ | ||
253 | - c++;} | ||
254 | - | ||
255 | - if(c==9){ | ||
256 | - perd=1;} | ||
257 | - | ||
258 | - return perd; | ||
259 | - | ||
260 | - | 289 | + |
290 | + return p; | ||
291 | + | ||
261 | } | 292 | } |
262 | - | ||
263 | 293 | ||
264 | 294 | ||
265 | - | ||
266 | -//Défini un coup joué | ||
267 | 295 | ||
268 | -void tour(int joueur,damier *d){ | ||
269 | - int ind=d->indl; | ||
270 | - int col=d->indc; | ||
271 | - int dir; | ||
272 | - int v; | ||
273 | - int i,j; | ||
274 | - | ||
275 | - do{ | ||
276 | - printf("saisir un déplacement valide TOUR1\n"); | 296 | + |
297 | +/*joueur : D | ||
298 | + d : D/R | ||
299 | + p : D/R | ||
300 | +*/ | ||
301 | + | ||
302 | +//Un joueur donné déplace le neutron d'un damier donné. Après déplacement, on renvoie p qui dit s'il a perdu ou pas. | ||
303 | +void tourNeutron(int joueur,damier *d,int *p){ | ||
304 | + int ind=d->indl;// ind indice de ligne du neutron dans le damier donné | ||
305 | + int col=d->indc;// col indice de colonne du neutron dans le damier donné | ||
306 | + int dir;// donne la direction de déplacement voulue | ||
307 | + int v;//stock la validité d'une direction donnée | ||
308 | + int i,j;// indice de ligne et de colonne du champ tableau dans le damier | ||
309 | + int b; //booléen pour la boucle tant que | ||
310 | + | ||
311 | + if (perd(joueur,*d)==1) *p=1;//On teste si le joueur perd avant de commencer son tour | ||
312 | + | ||
313 | + else { | ||
314 | + //Tant que la direction donnée n'est pas possible, on redemande une autre direction valide | ||
315 | + do{ | ||
316 | + printf("Saisir un déplacement valide du NEUTRON\n"); | ||
277 | scanf("%d",&dir); | 317 | scanf("%d",&dir); |
278 | v=valide(ind,col,dir,*d); | 318 | v=valide(ind,col,dir,*d); |
319 | + }while(v==0); | ||
279 | 320 | ||
280 | - }while(v==0); | ||
281 | - dep(ind,col,dir,d); | ||
282 | - | 321 | + dep(ind,col,dir,d); |
322 | + affichage(*d); | ||
323 | + | ||
324 | + //Réinitialisation des coordonnées du neutron | ||
325 | + i=0; | ||
326 | + b=0; | ||
327 | + while (i<N && b==0){ | ||
328 | + j=0; | ||
329 | + while (j<N && b==0){ | ||
330 | + if ((d->tab[i][j])==green){ | ||
331 | + b=1; | ||
332 | + } | ||
333 | + else j++; | ||
334 | + } | ||
335 | + if(j==N) i++; | ||
336 | + } | ||
337 | + | ||
338 | + ((*d).indl)=N-i; | ||
339 | + ((*d).indc)=j+1; | ||
340 | + | ||
341 | + } | ||
342 | + | ||
343 | +} | ||
344 | + | ||
345 | + | ||
346 | + | ||
347 | +/*joueur : D | ||
348 | + d : D/R | ||
349 | + p : D/R | ||
350 | +*/ | ||
351 | + | ||
352 | +//Un joueur donné déplace le pion d'un damier donné. Après déplacement, on renvoie p qui dit s'il a perdu ou pas. | ||
353 | +void tourPion(int joueur,damier *d,int *p){ | ||
354 | + int dir;// donne la direction de déplacement voulue | ||
355 | + int v; //stock la validité d'une direction donnée | ||
356 | + int t; | ||
357 | + int i,j;// indice de ligne et de colonne du champ tableau dans le damier | ||
358 | + | ||
359 | + if (perd(joueur,*d)==1) *p=1;//On teste si le joueur perd avant de commencer son tour | ||
360 | + | ||
361 | + | ||
362 | + else { | ||
363 | + //Tant que les indices donnés ne correspondent pas à un pion du joueur, on redemande de nouveaux indices | ||
364 | + do{ | ||
365 | + printf("Saisir l'indice de ligne et de colonne du PION\n"); | ||
366 | + scanf("%d,%d",&i,&j); | ||
367 | + t=(d->tab[N-i][j-1]); | ||
368 | + }while(t!=joueur); | ||
369 | + | ||
370 | + //Tant que la direction donnée n'est pas possible, on redemande une autre direction valide | ||
283 | do{ | 371 | do{ |
284 | - printf("saisir un déplacement valide TOUR2\n"); | 372 | + printf("Saisir un déplacement valide du PION\n"); |
285 | scanf("%d",&dir); | 373 | scanf("%d",&dir); |
286 | v=valide(i,j,dir,*d); | 374 | v=valide(i,j,dir,*d); |
287 | 375 | ||
288 | }while(v==0); | 376 | }while(v==0); |
289 | 377 | ||
290 | - printf("Saisir l'indice de ligne et de colonne du pion\n"); | ||
291 | - scanf("%d,%d",&i,&j); | ||
292 | 378 | ||
293 | 379 | ||
294 | dep(i,j,dir,d); | 380 | dep(i,j,dir,d); |
295 | affichage(*d); | 381 | affichage(*d); |
382 | + | ||
383 | + } | ||
296 | } | 384 | } |
297 | 385 | ||
298 | 386 | ||
299 | 387 | ||
300 | int main(){ | 388 | int main(){ |
301 | - int i; //indice de ligne | ||
302 | - int j; //indice de colonne | ||
303 | - int dir;//indice de déplacement | ||
304 | - int v; | ||
305 | - | 389 | + int p=0; |
306 | 390 | ||
307 | damier d; | 391 | damier d; |
308 | d=init(); | 392 | d=init(); |
309 | affichage(d); | 393 | affichage(d); |
310 | printf("\n\n"); | 394 | printf("\n\n"); |
311 | 395 | ||
312 | - | ||
313 | - printf("Indice de ligne et de colonne du pion\n"); | ||
314 | - scanf("%d,%d",&i,&j); | ||
315 | - do{ | ||
316 | - printf("saisir un déplacement valide MAIN\n"); | ||
317 | - scanf("%d",&dir); | ||
318 | - v=valide(i,j,dir,d); | ||
319 | - | ||
320 | - }while(v==0); | ||
321 | - | ||
322 | - dep(i, j, dir, &d); | ||
323 | - affichage(d); | ||
324 | - | 396 | + printf("Bleu joue!\n"); |
397 | + tourPion(blue,&d,&p);//Le joueur bleu effectue le premier déplacement de son pion | ||
398 | + | ||
399 | + | ||
325 | 400 | ||
326 | - while (perd(blue,d)==1 && perd(red,d)==1){ | ||
327 | - tour(red,&d); | ||
328 | - affichage(d); | 401 | + while (p==0){//Tant qu'aucun des deux joueurs ne perd,la partie continue. |
402 | + printf("%s%s Rouge joue! %s\n",rouge,reverse,reset); | ||
403 | + tourNeutron(red,&d,&p);//Le joueur rouge déplace le neutron | ||
404 | + if (p==1) { | ||
405 | + printf("%s Joueur rouge ne peut plus déplacer le neutron, tu perds ! %s\n\n%s%s FELICITATION, JOUEUR BLEU GAGNE !!! %s\n\n",rouge,reset,vert,reverse,reset); | ||
406 | + break;//On arrête la boucle dès que le joueur rouge ne peut plus bouger le neutron | ||
407 | + } | ||
408 | + | ||
409 | + if (d.indl==5) {printf("%sVous avez ramener le neutron dans votre camp%s\n%s%s FELICITATION, JOUEUR ROUGE GAGNE !!! %s\n\n",rouge,reset,vert,reverse,reset); | ||
410 | + break;//On arrête la boucle quand rouge a ramené le neutron dans son camp | ||
411 | + } | ||
412 | + | ||
413 | + tourPion(red,&d,&p);//Le joueur rouge déplace le pion qu'il a choisi | ||
414 | + if (p==1) { | ||
415 | + printf("%s Joueur rouge ne peut plus déplacer ses pions, tu perds ! %s\n\n%s%s FELICITATION, JOUEUR BLEU GAGNE !!! %s\n\n",rouge,reset,vert,reverse,reset); | ||
416 | + break;//On arrête la boucle dès que le neutron est encerclé | ||
417 | + } | ||
418 | + | ||
419 | + printf("\n\n"); | ||
420 | + | ||
421 | + printf("%s%s Bleu joue! %s\n",bleu,reverse,reset); | ||
422 | + tourNeutron(blue,&d,&p); //Le joueur bleu déplace le neutron | ||
423 | + if (p==1) { | ||
424 | + printf("%s Joueur bleu ne peut plus déplacer le neutron, tu perds ! %s\n\n%s%s FELICITATION, JOUEUR ROUGE GAGNE !!! %s\n\n",bleu,reset,vert,reverse,reset); | ||
425 | + break;//On arrête la boucle dès que le neutron est encerclé | ||
426 | + } | ||
427 | + | ||
428 | + if (d.indl==5) {printf("%sVous avez ramener le neutron dans votre camp%s\n%s%s FELICITATION, JOUEUR BLEU GAGNE !!! %s\n\n",bleu,reset,vert,reverse,reset); | ||
429 | + break;//On arrête la boucle quand rouge a ramené le neutron dans son camp | ||
430 | + } | ||
431 | + | ||
432 | + tourPion(blue,&d,&p);//Le joueur rouge déplace le pion qu'il a choisi | ||
433 | + if (p==1) { | ||
434 | + printf("%s Joueur bleu ne peut plus déplacer ses pions, tu perds ! %s\n\n%s%s FELICITATION, JOUEUR ROUGE GAGNE !!! %s\n\n",bleu,reset,vert,reverse,reset); | ||
435 | + break; //On arrête la boucle dès que le joueur bleu ne peut plus bouger ses pions | ||
436 | + } | ||
329 | printf("\n\n"); | 437 | printf("\n\n"); |
330 | - tour(blue,&d); | ||
331 | - affichage(d); | ||
332 | - } | ||
333 | - | ||
334 | - if (perd(blue,d)==0){ | ||
335 | - printf("Joueur Bleu gagne\n"); | ||
336 | - } | ||
337 | - | ||
338 | - else if (perd(red,d)==0){ | ||
339 | - printf("Joueur Rouge gagne\n"); | ||
340 | } | 438 | } |
439 | + | ||
341 | 440 | ||
342 | return 0; | 441 | return 0; |
343 | } | 442 | } |
344 | 443 | ||
345 | 444 | ||
346 | - | 445 | + |
347 | 446 |