neutron.c 4.51 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 indi; //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.indi=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){
     i=N-i;
     j=j-1;
  
    int valide;
    valide=1;
    
    if(dir==8 && (d.tab[i-1][j-1]!=empty) && i==0 && j==0){
        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;}
    return valide;
}
    
    

int main(){
    int i; //indice de ligne
    int j; //indice de colonne
    int dir; //indice de déplacement
    damier d;
    d=init();
    affichage(d);
    printf("\n\n");
    
    printf("Saisir l'indice de ligne et de colonne\n");
    scanf("%d%d",&i,&j);
    
    printf("Saisir le déplacement souhaité\n");
    scanf("%d",&dir);
    printf("%d",dir);
    
    //On redemande une autre direction tant que la direction ne peut pas être faite
    while (valide(i,j,dir,d)==0){
      printf("saisir un autre déplacement valide\n");
      scanf("%d",&dir);
      printf("%d",dir);
    }
    
    dep(i, j, dir, &d);
  
    affichage(d);

  return 0;
}