diff --git a/src/controleur.c b/src/controleur.c
index 7a7d4fbd72ef7a93efc6dda89da4d267feb45842..8641be1bde2e669af93a6b98dabb76e0fece9ddc 100644
--- a/src/controleur.c
+++ b/src/controleur.c
@@ -470,7 +470,7 @@ void obtenirPositionPersonnage(int numero, int * x, int * y){
 
   /*!
  * \fn Personnage * trouverPersonnage(Case * c)
- * \brief La fonction renvoie un pointeur vers le personnage présent sur la case en parrammetre.
+ * \brief La fonction renvoie un pointeur vers le personnage présent sur la case en parametre.
  *
  * \param Les coordonnées de la Case à tester
  * \return Un pointeur vers un personnage, NULL, s'il n'y a pas de personnage sur la case.
@@ -504,18 +504,13 @@ Personnage * trouverPersonnage(Case * c){
     return NULL;
 }
 
-  /*!
- * \fn char * obtenirNomJoueurCourant()
- * \brief La fonction renvoie le nom du Joueur dont c'est le tour.
+
+/*!
+ * \fn void deplacement_personnage(int numPerso, int x_pixel, int y_pixel)
+ * \brief La fonction permet de deplacer un personnage
  *
- * \return Un char * vers le nom du joueur dont c'est le tour.
+ * \param Le numero du personnage a deplacer, les coordonnees ou l'utilisateur a clique
  */
-char * obtenirNomJoueurCourant(){
-    return getNomJoueur(getCurrentJoueur(getListJoueur(partieGlobale)));
-}
-
-
-
 void deplacement_personnage(int numPerso, int x_pixel, int y_pixel){
     int x=x_case_cliquee(x_pixel, y_pixel);
     int y=y_case_cliquee(x_pixel, y_pixel);
@@ -528,6 +523,15 @@ void deplacement_personnage(int numPerso, int x_pixel, int y_pixel){
 }
 
 
+  /*!
+ * \fn char * obtenirNomJoueurCourant()
+ * \brief La fonction renvoie le nom du Joueur dont c'est le tour.
+ *
+ * \return Un char * vers le nom du joueur dont c'est le tour.
+ */
+char * obtenirNomJoueurCourant(){
+    return getNomJoueur(getCurrentJoueur(getListJoueur(partieGlobale)));
+}
 
   /*!
  * \fn char * obtenirNomClassePersonnage(int numero)
diff --git a/src/deplacements.c b/src/deplacements.c
index b3e330da3aea1bf2b7384ceea2c6accbb8485043..a7a9580fe0fc0755a7e666770da05d20b5eabb55 100644
--- a/src/deplacements.c
+++ b/src/deplacements.c
@@ -37,7 +37,7 @@ boolean case_a_cote(Personnage * perso, Case * destination){
  * \brief déplace un personnage sur une case située à côté de la sienne, si cela est possible
  *
  * \param Un personnage, une case
- * \return Un entier.
+ * \return 0 si le deplacement est possible et a ete effectue, 1 si il n'est pas possible ou n'a pas fonctionne
  */
 int deplacement_unitaire(Personnage *perso,Case * destination){
     if (est_occupee(destination)==vrai){
@@ -62,21 +62,85 @@ int deplacement_unitaire(Personnage *perso,Case * destination){
     return 1;
 }
 
-
-
-/* Cette fonction devrait plutot renvoyer un tableau ou une liste de cases ou le
-deplacement est possible, pour la surbrillance on verra ca plus tard avec une
-fonction d'affichage specifique. */
-int affichage_deplacements_possibles(Personnage *perso, Carte *c){ /* Met en surbrillance les cases disponibles pour un déplacement */
+/*!
+ * \fn boolean case_a_cote_case(Case * depart, Case * destination)
+ * \brief verifie si deux cases sont cote-a-cote
+ *
+ * \param la case de depart, la case d'arrivee
+ * \return vrai ou faux
+ */
+boolean case_a_cote_case(Case * depart, Case * destination){
     int i;
-    int pd_max_x = get_PD(perso);
-//    int pd_max_y = get_PD(perso);
+    if (get_x(depart)>get_x(destination)+1||get_x(depart)<get_x(destination)-1||get_y(depart)>get_y(destination)+1||get_y(depart)<get_y(destination)-1){
+        return faux;
+    }
+    for(i=0;i<LARG_MAX_CARTE;i+=2){
+        if (get_y(depart)==get_y(destination)+1&&get_x(depart)!=get_x(destination)&&get_x(depart)==i+1)
+            return faux;
+        if (get_y(depart)==get_y(destination)-1&&get_x(depart)!=get_x(destination)&&get_x(depart)==i)
+            return faux;
+    }
+    return vrai;
+}
+
+/*!
+ * \fn boolean deplacement_unitaire_possible(Case* depart,Case* destination)
+ * \brief verifie si on peut de deplacer d'une cas e a une autre
+ *
+ * \param la case de depart, la case d'arrivee
+ * \return vrai si le deplacement est possible, faux si il n'est pas possible
+ */
+boolean deplacement_unitaire_possible(Case* depart,Case* destination){
+    if (est_occupee(destination)==vrai){
+        return faux;
+    }
+    if (case_franchissable(destination)==faux){
+        return faux;
+    }
+    if (case_a_cote_case(depart,destination)==vrai){
+        return vrai;
+       }
+    return faux;
+}
 
-    for(i=0;i<pd_max_x;i++){
-        if(1!=0){
-            /* ??? */
+/*!
+ * \fn boolean deplacement_possible(Personnage* perso, Case* c, Carte_Jeu* carte)
+ * \brief verifie si un personnage peut se rendre sur une case distante en fonction de ses points de mouvement
+ *
+ * \param le personnage, la case d'arrivee, la carte
+ * \return vrai si le deplacement est possible, faux si il n'est pas possible
+ */
+boolean deplacement_possible(Personnage* perso, Case* c, Carte_Jeu* carte){
+    int pts_mvt = perso->points_deplacement;
+    Case* depart=perso->position;
+    int x,y;
+    for(x=0;x<LARG_MAX_CARTE;x++){
+        for(y=0;y<HAUT_MAX_CARTE;y++){
+            if(deplacement_unitaire_possible(depart,&carte->Tab_Cases[x][y])==vrai){
+                return deplacement_possible_recursif(&carte->Tab_Cases[x][y],c, carte,pts_mvt-carte->Tab_Cases[x][y].terrain->PD_requis);
+            }
         }
     }
-    return 0;
+    return faux;
 }
 
+/*!
+ * \fn boolean deplacement_possible_recursif(Case* dep, Case* dest, Carte_Jeu* carte, int pts_restants)
+ * \brief fonction recursive appellee par deplacement_possible, elle a le meme role
+ *
+ * \param une case depart, une case arrivee, la carte, les points de mouvement du personnage
+ * \return vrai si le deplacement est possible, faux si il n'est pas possible
+ */
+boolean deplacement_possible_recursif(Case* dep, Case* dest, Carte_Jeu* carte, int pts_restants){
+    int x,y;
+    if(dep==dest) return vrai;
+    if(pts_restants<1) return faux;
+    for(x=0;x<LARG_MAX_CARTE;x++){
+            for(y=0;y<HAUT_MAX_CARTE;y++){
+                if(deplacement_unitaire_possible(dep,&carte->Tab_Cases[x][y])==vrai){
+                    return deplacement_possible_recursif(&carte->Tab_Cases[x][y],dest, carte,pts_restants-1);
+                }
+            }
+    }
+    return faux;
+}
diff --git a/src/deplacements.h b/src/deplacements.h
index 5375a5a983b0c58a492abb779f5713a4e4808189..c128333697b1746d9d2ba51f9b535c217ce9eabc 100644
--- a/src/deplacements.h
+++ b/src/deplacements.h
@@ -10,5 +10,13 @@ boolean case_a_cote(Personnage *perso,Case *destination);
 
 int deplacement_unitaire(Personnage *perso,Case * destination);
 
+boolean case_a_cote_case(Case * depart, Case * destination);
+
+boolean deplacement_unitaire_possible(Case* depart,Case * destination);
+
+boolean deplacement_possible(Personnage* perso, Case* c, Carte_Jeu* carte);
+
+boolean deplacement_possible_recursif(Case* dep, Case* dest, Carte_Jeu* carte, int pts_restants);
+
 
 #endif