diff --git a/.gitignore b/.gitignore
index 4d37d303942b9350be7fb5f2c7b101ad1152cc2a..5a1127b6cd7c8d7afa4d5e803f9816cb94073b53 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
 a.out
 obj/*
+test.c
+stackchess
diff --git a/obj/affichage.o b/obj/affichage.o
index 3985760b38e53f8f2a5586eabb8f5cc7d47e4510..d523223d8a0a3a5b549648e9929317a67b8c9409 100644
Binary files a/obj/affichage.o and b/obj/affichage.o differ
diff --git a/obj/main.o b/obj/main.o
index 9a3d11526c522ad45c8a55eb46a92e765dafeb15..982deb19e71fb45fd96ce0099a364ee379963600 100644
Binary files a/obj/main.o and b/obj/main.o differ
diff --git a/obj/tableau.o b/obj/tableau.o
index 5c5044a14e8f3a001d27defb681abd88e8f6ab97..6656502d35d47551951fdca5d99e6a56502da20d 100644
Binary files a/obj/tableau.o and b/obj/tableau.o differ
diff --git a/src/action.c b/src/action.c
index 42ab26c60ddd34a70547baf0d9bd14d478c3ef2a..0c1d6a152728f767e32299fcdc6ca70032ddcbc9 100644
--- a/src/action.c
+++ b/src/action.c
@@ -8,31 +8,28 @@
 
 
 
-void realiser(char action,pile **tableau,int N,char *cases)
+void realiser(char action,pile **tableau,int N,char *cases,int *tour)
 {
   char sel[4]="\0\0\0\0";
   switch (action){
     case 'c' :
-      affichecouleur(tableau,N);
-      affichepile(cases,tableau,N);
-      printf("\nEntrez les coordonnées de la case à selectionner >");
+      affichage(tableau,N,cases,*tour,"Entrez les coordonnées de la case à selectionner >");
       scanf("%3s",sel);
       if (sel[1] != '\0'){
         strcpy(cases,sel);
       }
       break;
     case 'd' :
-      printf("d");
-      char couleur='N';
-      deplacement(tableau,N,cases,couleur);
+      deplacement(tableau,N,cases,tour);
       break;
     case 'a' : 
-      printf("\n Voulez vous quitter le jeu (y|n)? \n");
+      affichage(tableau,N,cases,*tour,"\n Voulez vous quitter le jeu (y|n)? \n");
       char c;
       scanf("%1s",&c);
       if (c == 'y'){
-        nettoyer(tableau,N);
+        affichecouleur(tableau,N);
         printf("\n Vous allez quitter le jeu");
+        nettoyer(tableau,N);
         exit(0);
       }
       break;
diff --git a/src/action.h b/src/action.h
index cc1c9b517a3a3715cfd09a216f48d9896d54a509..d681cb598121b04464596ca577795d040d3baf08 100644
--- a/src/action.h
+++ b/src/action.h
@@ -4,4 +4,4 @@
  * @assign
  * @ensure fait entrer dans le bon mode (abandon, selection ou déplacement)
  */
-void realiser(char action,pile **tableau,int N,char *cases);
+void realiser(char action,pile **tableau,int N,char *cases,int *tour);
diff --git a/src/affichage.c b/src/affichage.c
index d3ebf40629ad32f169243b3e80e07e30bfba0438..4a4893a080aef26c3240be227cb9224f0eb1a126 100644
--- a/src/affichage.c
+++ b/src/affichage.c
@@ -74,16 +74,34 @@ void affichepion(char *pion,char *CASE)
 
 void affichepile(char *sel,pile **tableau,int N)
 { 
-  if (*sel == '\0' || strtol(sel+1,NULL,10)>N || strtol(sel+1,NULL,10)<1)
-    printf("Aucune case n'est sélectionnée.");
+  if (*sel == '\0') 
+    printf("Aucune case n'est sélectionnée");
   else {
-    printf("%s:\n",sel);
-    int i=N-strtol(sel+1,NULL,10),j=*sel-'A';
-    noeud* tmp=tableau[i][j].sommet; 
-    while (tmp != NULL){
-      affichepion(tmp->chaine,NOIR);
-      tmp=tmp->next;
-      printf("\n");
+    int i,j;
+    determiner_indices(sel,N,&i,&j);
+    //printf("(%d,%d)",i,j);
+    if (i>=N || i<0 || j<0 || j>=N)
+      printf("Aucune case n'est sélectionnée.");
+    else {
+      printf("%s:\n",sel);
+      noeud* tmp=tableau[i][j].sommet; 
+      while (tmp != NULL){
+        affichepion(tmp->chaine,NOIR);
+        tmp=tmp->next;
+        printf("\n");
+      }
     }
   }
 }
+
+void affichage(pile **tableau,int N, char *sel,int tour,char *message)
+{
+  affichecouleur(tableau,N);
+  affichepile(sel,tableau,N);
+  if (tour%2 == 0)
+    printf("\n C'est au tour des Verts.");
+  else
+    printf("\n C'est au tour des Rouges.");
+  printf("\n%s",message);
+}
+
diff --git a/src/affichage.h b/src/affichage.h
index 71ddfc771be15f95610bc698c76cb2d2b25b9605..088fe0f9e60fbd2a5b417b561ccf92ad0b575bd4 100644
--- a/src/affichage.h
+++ b/src/affichage.h
@@ -32,4 +32,10 @@ void affichepion(char *pion,char* CASE);
  */
 void affichepile(char* sel, pile **tableau, int N);
 
+/*
+ * @require
+ * @assign
+ * @ensure combine affichecouleur() et affichepile()
+ */
+void affichage(pile **tableau,int N,char *sel,int tour,char *message);
 #endif
diff --git a/src/deplacement.c b/src/deplacement.c
index c3aab91ecef8021481323fc1e8c1278593662213..0f0c62966207971edc3560a6a0e96aaf973cded6 100644
--- a/src/deplacement.c
+++ b/src/deplacement.c
@@ -1,14 +1,131 @@
+#include<unistd.h>
 #include"tableau.h"
-
+#include"affichage.h"
+#include"deplacement.h"
 /*deplacement.c*/
 
-void deplacement(pile **tableau, int N, char *sel, char couleur)
+void deplacement(pile **tableau, int N, char *sel, int *tour)
+{
+  if (*sel != '\0'){
+    int i,j;
+    determiner_indices(sel,N,&i,&j);
+    if (i>=N || i<0 || j>=N || j<0)
+      printf("\nCase sélectionnée hors du tableau.");
+    else if (sommet(tableau[i][j])[1] == "BN"[*tour%2]){
+      affichage(tableau,N,sel,*tour,"Combien de pions à déplacer >");
+      int nb=nb_a_selectionner(tableau,i,j,tour);
+      if (nb>0){
+        int i_dest,j_dest; 
+        affichage(tableau,N,sel,*tour,"Entrez les coordonnées de la case de destination>");
+        case_destination(tableau,N,i,j,&i_dest,&j_dest,nb,tour);
+      }
+    } else 
+      printf("\nDéplacement non autorisé");
+    char c;
+    printf("\n");
+    //scanf("%1s",&c);
+    read(0,&c,1);//attend la touche entrer
+  }
+}
+
+
+int nb_a_selectionner(pile **tableau,int i,int j,int *tour)
 {
-  int i=N-strtol(sel+1,NULL,10),j=*sel-'A';
-  if (*sel == '\0' || strtol(sel+1,NULL,10)>N || strtol(sel+1,NULL,10)<1)
-    printf("Aucune case n'est sélectionnée.");
-  else {
+  int nb;
+  scanf("%d",&nb);
+  if (nb<=nb_de_pion(tableau[i][j],"BN"[*tour%2]) && nb>0)
+    return nb;
+  else
+    printf("\nVous n'avez pas rentré un nombre valide.");
+  return 0;
+}
 
+void case_destination(pile **tableau,int N,int i_src,int j_src, int *i_dest,int *j_dest,int nb,int *tour)
+{
+  char dest[4]="\0\0\0\0";
+  scanf("%3s",dest);
+  if (dest[1] != '\0'){
+    determiner_indices(dest,N,i_dest,j_dest);
+    if (*i_dest>=0 && *i_dest<N && *j_dest>=0 && *j_dest<N){
+      noeud* tmp=tableau[i_src][j_src].sommet;
+      int valide,i;
+      for (i=0 ; i<nb ; i++){
+        switch (tmp->chaine[0]){
+          case 'P' :
+            valide=pions(i_src,j_src,*i_dest,*j_dest);
+            break;
+          case 'R' :
+            valide=roi(i_src,j_src,*i_dest,*j_dest);
+            break;
+          case 'D' :
+            valide=dames(i_src,j_src,*i_dest,*j_dest);
+            break;
+          case 'T' :
+            valide=tours(i_src,j_src,*i_dest,*j_dest);
+          case 'F' :
+            valide=fous(i_src,j_src,*i_dest,*j_dest);
+          case 'C' :
+            valide=cavaliers(i_src,j_src,*i_dest,*j_dest);
+          default :
+            valide=0;
+        }
+        if (! valide)
+          break;
+        tmp=tmp->next;
+      }
+      if (valide){
+        effectuer(tableau,i_src,j_src,*i_dest,*j_dest,nb);
+        *tour=*tour+1;
+      } else {
+        printf("Déplacement illégal pour au moins un pion de la pile");
+      }
+    }
   }
 }
 
+int pions(int i_src,int j_src,int i_dest,int j_dest)
+{
+  return 0;
+}
+
+int dames(int i_src,int j_src,int i_dest,int j_dest)
+{
+  return 0;
+}
+
+int roi(int i_src,int j_src,int i_dest,int j_dest)
+{
+  if (i_dest==i_src)
+    if (j_dest==j_src-1 || j_dest==j_src+1)
+      return 1;
+  if (i_dest==i_src+1 || i_dest==i_src-1)
+    if (j_dest==j_src+1 || j_dest==j_src || j_dest==j_src-1)
+      return 1;
+  return 0;
+}
+int tours(int i_src,int j_src,int i_dest,int j_dest)
+{
+  return 0;
+}
+
+int fous(int i_src,int j_src,int i_dest, int j_dest)
+{
+  return 0;
+}
+
+int cavaliers(int i_src,int j_src,int i_dest,int j_dest)
+{
+  return 0;
+}
+
+void effectuer(pile **tableau,int i_src,int j_src, int i_dest,int j_dest,int nb)
+{
+  pile p;
+  int i;
+  for (i=0 ; i<nb ; i++){
+    empiler(&p,depiler(tableau[i_src]+j_src));
+  }
+  for (i=0 ; i<nb ; i++){
+    empiler(tableau[i_dest]+j_dest,depiler(&p));
+  }
+}
diff --git a/src/deplacement.h b/src/deplacement.h
index 0b45be1747bcb2791dc3941191903862b2ce263e..1d8032cf5c71fed9ab664fe727fe03d099f98e8e 100644
--- a/src/deplacement.h
+++ b/src/deplacement.h
@@ -8,8 +8,68 @@
 /*
  * @require
  * @assign
- * @ensure détermine si le déplacement est légal ou pas 
+ * @ensure détermine si le déplacement est légal ou pas et l'effectue si c'est le cas
  */
-void deplacement(pile **tableau,int N, char *cases, char couleur);
+void deplacement(pile **tableau,int N, char *sel, int *tour);
 
+/*
+ * @require
+ * @assign
+ * @ensure verifie si le nombre de pièce à deplacer de la case selectionnées est valide 
+ */
+int nb_a_selectionner(pile **tableau,int i,int j,int *tour);
+
+/*@require
+ * @assign
+ * @ensure : verifie si les coordonnées de la case destination est valide pour toutes les pièces à déplacer
+ */
+void case_destination(pile **tableau,int N,int i_src,int j_src,int *i_dest,int *j_dest,int nb,int *tour); 
+
+/*
+ * @require
+ * @assign
+ * @ensure : verifie que le déplacement est valide pour un pion
+ */
+int pions(int i_src,int j_src,int i_dest,int j_dest);
+
+/*
+ * @require
+ * @assign
+ * @ensure : verifie que le déplacement est valide pour un roi
+ */
+int roi(int i_src,int j_src,int i_dest,int j_dest);
+
+/*
+ * @require
+ * @assign
+ * @ensure : verifie que le déplacement est valide pour une dame
+ */
+int dames(int i_src,int j_src,int i_dest,int j_dest);
+
+/*
+ * @require
+ * @assign
+ * @ensure : verifie que le déplacement est valide pour une tour
+ */
+int tours(int i_src,int j_src,int i_dest,int j_dest);
+
+/*
+ * @require
+ * @assign
+ * @ensure : verifie que le déplacement est valide pour un fou
+ */
+int fous(int i_src,int j_src,int i_dest,int j_dest);
+
+/*
+ * @require
+ * @assign
+ * @ensure : verifie que le déplacement est valide pour un cavalier
+ */
+int cavaliers(int i_src,int j_src,int i_dest,int j_dest);
+/*
+ * @require
+ * @assign
+ * @ensure : effectue le déplacement d'une pile de pion d'une case vers une autre
+ */
+void effectuer(pile **tableau,int i_src, int j_src,int i_dest, int j_dest,int nb);
 #endif
diff --git a/src/main.c b/src/main.c
index d1186ecec125df029d887e49120d596cdb1f1053..248cf5218519fa0d3b1b4902f03ebf4e46b5fcc5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -13,13 +13,12 @@ int main(int argc, char **argv)
   pile **tableau=initialisation(N);
   debut_partie(tableau,N);
   char action;
+  int tour=0;
   char sel[4]="\0\0\0\0";
   while (1){ 
-    affichecouleur(tableau,N);
-    affichepile(sel,tableau,N);
-    printf("\n Entrez une action (c,d,a) >");
+    affichage(tableau,N,sel,tour,"Entrez une action (c,d,a) >");
     scanf("%c",&action);
-    realiser(action,tableau,N,sel);
+    realiser(action,tableau,N,sel,&tour);
   }
   nettoyer(tableau,N);
   return 0;
diff --git a/src/tableau.c b/src/tableau.c
index aea1a69f0679ca4cd77e92802120e1557b0530d4..a7eef0b870443b5c73f0595661a588d8315bf8c5 100644
--- a/src/tableau.c
+++ b/src/tableau.c
@@ -54,6 +54,7 @@ char *depiler(pile *p)
 void reset(pile *p)
 {
   while (p->sommet)
+    /*termine lorsque p n'a plus de sommet à dépiler (car p est de longueur finie)*/
     depiler(p);
 }
 
@@ -96,6 +97,26 @@ int longueur_pile(pile p)
   int i=0;
   noeud* tmp=p.sommet; 
   while (tmp != NULL){
+    /*termine quand on arrive au bout de la pile qui est de longueur finie*/
+    i++;
+    tmp=tmp->next;
+  }
+  return i;
+}
+
+
+void determiner_indices(char *sel,int N,int *i,int *j)
+{
+  *j=*sel-'A';
+  *i=N-strtol(sel+1,NULL,10);
+}
+
+int nb_de_pion(pile p,char couleur)
+{
+  int i=0;
+  noeud* tmp=p.sommet;
+  while (tmp != NULL && tmp->chaine[1] == couleur){
+    /*termine car la pile est de longueur finie*/
     i++;
     tmp=tmp->next;
   }
diff --git a/src/tableau.h b/src/tableau.h
index 94a849babb90255d8d4da03651241f390f612f2a..1a642d9e67beddd2c583194cb6fd01b29bf237ee 100644
--- a/src/tableau.h
+++ b/src/tableau.h
@@ -81,4 +81,18 @@ void debut_partie(pile **tableau,int N);
  */
 int longueur_pile(pile p);
 
+/*
+ * @require 
+ * @assign
+ * @ensure retourne une tuple contenant les indices de la case selectionnée à partir des coordonnées rentrées à la main
+ */
+void determiner_indices(char *sel,int N,int *i,int *j);
+
+/*
+ * @require
+ * @assign
+ * @ensure retourne le nombre de pion d'une couleur donnée placés sur le haut de la pile/case
+ */
+int nb_de_pion(pile p,char couleur);
 #endif 
+
diff --git a/stackchess b/stackchess
index 0558c9da4e095c2bca2164b4e393676d85322182..5eb5f7af7d3eff31cbd80af2700864647edf4edd 100755
Binary files a/stackchess and b/stackchess differ