Commit b7871cd9435d3bc39dda0c0e457425211f0836e2

Authored by afofana
1 parent 3823fa4b

version finale de notre projet

Showing 1 changed file with 209 additions and 110 deletions   Show diff stats
@@ -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