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
neutron.c
... ... @@ -8,50 +8,54 @@
8 8 #define vert "\033[;32m"
9 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 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 19 int indl; //indice de ligne du neutron
19 20 int indc; //indice de colonne du neutron
20 21 }damier;
21 22  
22 23  
23   -//fonction qui initialise un damier
  24 +//Fonction qui initialise un damier
24 25 damier init(){
25 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 29 for(i=0;i<N;i++){
29 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 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 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 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 53 void affichage(damier d){
53 54 int i,j;
  55 +
  56 + printf("\n");
54 57 for (i=0;i<N;i++){
  58 + printf("%d ",N-i);//Affiche les numéros de lignes
55 59 for (j=0;j<N;j++){
56 60 if (d.tab[i][j]==green){
57 61 printf("%s%s %s ",vert,reverse,reset);
... ... @@ -66,24 +70,30 @@ void affichage(damier d){
66 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 91 void dep(int i,int j,int dir,damier *d){
83   - int temp;
  92 + int temp;//Variable temporaire
84 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 97 if (dir==1){
88 98 while ((i>=1) && ((d->tab[i-1][j])==empty)){
89 99 temp=d->tab[i][j];
... ... @@ -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 185 int valide(int i,int j,int dir,damier d){
172 186 int valide;
173 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 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 195 if(dir==8 && (i==0 || j==0 || (d.tab[i-1][j-1]!=empty)) ){
180 196 valide=0;}
181 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 208 valide=0;}
193 209 else if(dir==7 && (j==0 || d.tab[i][j-1]!=empty)){
194 210 valide=0;}
195   - /*else if (1<=dir || dir>=8){
196   - valide=0;}*/
197 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 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 243 for(j=0;j<N;j++){
214 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 247 c++;}
217   -
218 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 267 for(i=0;i<N;i++){
233 268 for(j=0;j<N;j++){
234 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 272 c++;}
237   -
  273 +
  274 + //Si les 8 directions n'ont pas été valides, on comptes le pion comme non déplacable
238 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 317 scanf("%d",&dir);
278 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 371 do{
284   - printf("saisir un déplacement valide TOUR2\n");
  372 + printf("Saisir un déplacement valide du PION\n");
285 373 scanf("%d",&dir);
286 374 v=valide(i,j,dir,*d);
287 375  
288 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 380 dep(i,j,dir,d);
295 381 affichage(*d);
  382 +
  383 + }
296 384 }
297 385  
298 386  
299 387  
300 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 391 damier d;
308 392 d=init();
309 393 affichage(d);
310 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 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 441 return 0;
343 442 }
344 443  
345 444  
346   -
  445 +
347 446  
... ...