neutron.c 6.81 KB
#include <stdio.h>
#define N 5

#define reset "\033[0m"
#define reverse "\033[7m"

#define rouge "\033[;31m"
#define vert "\033[;32m"
#define bleu "\033[;34m"

#define green 0
#define blue 1
#define red 2
#define empty -1

typedef struct d{
    int tab[N][N];
    int indl; //indice de ligne du neutron
    int indc; //indice de colonne du neutron
}damier;


//fonction qui initialise un damier
damier init(){
  damier d;
  int i,j;

  for(i=0;i<N;i++){
     for(j=0;j<N;j++){
       d.tab[i][j]=-1;
     }
  }
  
  for(j=0;j<N;j++){
    d.tab[0][j]=2;
  }
  
  for(j=0;j<N;j++){
    d.tab[4][j]=1;
  }
  
  
  d.tab[2][2]=0;

  d.indl=3;
  d.indc=3;

  return d;
}

//fonction d'affichage d'un damier d donné
void affichage(damier d){
    int i,j;
    for (i=0;i<N;i++){
         for (j=0;j<N;j++){
             if (d.tab[i][j]==green){
	       printf("%s%s   %s ",vert,reverse,reset);
             }
             else if (d.tab[i][j]==blue){
                 printf("%s%s   %s ",bleu,reverse,reset);
             }
             else if (d.tab[i][j]==red){
                 printf("%s%s   %s ",rouge,reverse,reset);
             }
             else{
                 printf("    ");
             }
         }
         printf("\n");
    }
}



    

/* dir : Donnée (donne la direction voulu par le joueur)
   i,j : Données,indice de ligne et de colonne du pion qu'on veut déplacer
   d: D/R
*/

void dep(int i,int j,int dir,damier *d){
  int temp;
  i=N-i;
  j=j-1;
  
  if (dir==1){
    while ((i>=1) && ((d->tab[i-1][j])==empty)){
      temp=d->tab[i][j];
      (d->tab[i][j])=(d->tab[i-1][j]);
      (d->tab[i-1][j])=temp;
      i=i-1;
    }
    
  }
  
  else if (dir==5){
    while ((i<=3) && ((d->tab[i+1][j])==empty)){
      temp=d->tab[i][j];
      (d->tab[i][j])=(d->tab[i+1][j]);
      (d->tab[i+1][j])=temp;
      i=i+1;
    }
  }
  

  
  else if (dir==2){
    while ((i>=1) && (j<=3) && ((d->tab[i-1][j+1])==empty)){
      temp=d->tab[i][j];
      (d->tab[i][j])=(d->tab[i-1][j+1]);
      (d->tab[i-1][j+1])=temp;
      i=i-1;
      j=j+1;
    }
  }
  
  else if (dir==6){
    while ((j>=1) && (i<=3) && ((d->tab[i+1][j-1])==empty)){
      temp=d->tab[i][j];
      (d->tab[i][j])=(d->tab[i+1][j-1]);
      (d->tab[i+1][j-1])=temp;
      i=i+1;
      j=j-1;
    }
  }
  
  else if (dir==8){
    while ((j>=1) && (i>=1) && ((d->tab[i-1][j-1])==empty)){
      temp=d->tab[i][j];
      (d->tab[i][j])=(d->tab[i-1][j-1]);
      (d->tab[i-1][j-1])=temp;
      i=i-1;
      j=j-1;
    }
  }  

    
  else if (dir==4){
    while ((j<=3) && (i<=3) && ((d->tab[i+1][j+1])==empty)){
      temp=d->tab[i][j];
      (d->tab[i][j])=(d->tab[i+1][j+1]);
      (d->tab[i+1][j+1])=temp;
      i=i+1;
      j=j+1;
    }
  }  

  else if (dir==7){
    while ((j>=1) && ((d->tab[i][j-1])==empty)){
      temp=d->tab[i][j];
      (d->tab[i][j])=(d->tab[i][j-1]);
      (d->tab[i][j-1])=temp;
      j=j-1;
    }
  }
  
  else if (dir==3){
    while ((j<=3) && ((d->tab[i][j+1])==empty)){
      temp=d->tab[i][j];
      (d->tab[i][j])=(d->tab[i][j+1]);
      (d->tab[i][j+1])=temp;
      j=j+1;
    }
  }
   else { printf("Déplacement inéxistant\n"); }
       
}

// Fonction qui renvoie 0 si le déplacement n'est pas valide et 1 sinon  
int valide(int i,int j,int dir,damier d){
     int valide;
     i=N-i;
     j=j-1;
  
    
    valide=1;
    
    if(dir==8 && (i==0 || j==0 || (d.tab[i-1][j-1]!=empty)) ){
        valide=0;}
    else if(dir==1 && (i==0 || d.tab[i-1][j]!=empty)){ 
        valide=0;}
    else if(dir==2 && (j==4 || i==0 || d.tab[i-1][j+1]!=empty)){ 
        valide=0;}
    else if(dir==3 && (j==4 || d.tab[i][j+1]!=empty) ){ 
        valide=0;}
    else if(dir==4 && (i==4 || j==4 || d.tab[i+1][j+1]!=empty)){ 
        valide=0;}
    else if(dir==5 && (i==4 || d.tab[i+1][j]!=empty)){ 
        valide=0;}
    else if(dir==6 && (i==4 || j==0 || d.tab[i+1][j-1]!=empty)){ 
        valide=0;}
    else if(dir==7 && (j==0 || d.tab[i][j-1]!=empty)){ 
        valide=0;}
    /*else if (1<=dir || dir>=8){
        valide=0;}*/
    return valide==1;
}

// 1 si joueur est bleu et 2 si le joueur est rouge
//renvoie 0 si perd et 1 si gagne
int perd(int joueur,damier d){
     int i=d.indl;
     int j=d.indc;
     int c=1;
     int perd=0;
     
   
     
     //Test si les pions du joueur bleu peuvent se déplacer
     if(joueur==blue){
         for(i=0;i<N;i++){
             for(j=0;j<N;j++){
                 if(d.tab[i][j]==blue){
                        while(c<=8 && valide(i,j,c,d)==0){
                            c++;}
     
                        if(c==9){
                            perd=1;}
                        else { perd=0;}
                    
                 }
             }
         }
         if(d.indl==0) {
             perd=1;
         }
     }
     
     //Test si les pions du joueur rouge peuvent se déplacer
     else if(joueur==red){
         for(i=0;i<N;i++){
             for(j=0;j<N;j++){
                 if(d.tab[i][j]==red){
                        while(c<=8 && valide(i,j,c,d)==0){
                            c++;}
     
                        if(c==9){
                            perd=1;}
                        else { perd=0;}
                 }
             }
         }
         if(d.indl==4) {
             perd=1;
         }
     }
                
    
    //TEST SI LE NEUTRON PEUT SE DÉPLACER
    c=1;
    while(c<=8 && valide(i,j,c,d)==0){
         c++;}
     
    if(c==9){
         perd=1;}   
    
    return perd;
    
    
}
         


    
//Défini un coup joué

void tour(int joueur,damier *d){
    int ind=d->indl;
    int col=d->indc;
    int dir;
    int v;
    int i,j;
    
    do{
      printf("saisir un déplacement valide TOUR1\n");
      scanf("%d",&dir);
      v=valide(ind,col,dir,*d);
      
    }while(v==0);
    dep(ind,col,dir,d);
   
    do{
      printf("saisir un déplacement valide TOUR2\n");
      scanf("%d",&dir);
      v=valide(i,j,dir,*d);
      
    }while(v==0);
    
    printf("Saisir l'indice de ligne et de colonne du pion\n");
    scanf("%d,%d",&i,&j);
    
    
    dep(i,j,dir,d);
    affichage(*d);
}
    
    

int main(){
    int i; //indice de ligne
    int j; //indice de colonne
    int dir;//indice de déplacement
    int v;
   
    
    damier d;
    d=init();
    affichage(d);
    printf("\n\n");
    
    
    printf("Indice de ligne et de colonne du pion\n");
    scanf("%d,%d",&i,&j);
    do{
      printf("saisir un déplacement valide MAIN\n");
      scanf("%d",&dir);
      v=valide(i,j,dir,d);
      
    }while(v==0);
    
    dep(i, j, dir, &d);
    affichage(d);
    
   
    while (perd(blue,d)==1 && perd(red,d)==1){
        tour(red,&d);
        affichage(d);
        printf("\n\n");
        tour(blue,&d);
        affichage(d);
    }
    
    if (perd(blue,d)==0){
        printf("Joueur Bleu gagne\n");
    }
    
    else if (perd(red,d)==0){
        printf("Joueur Rouge gagne\n");
    }

  return 0;
}