diff --git a/src/TerrainsXML.c b/src/TerrainsXML.c
index f93affde8d44a2780339e6998590af6b3f394f81..aeef591197fc284f2e40abcfd95355368ffe6e86 100644
--- a/src/TerrainsXML.c
+++ b/src/TerrainsXML.c
@@ -43,7 +43,7 @@ Terrain* Remplir_Terrains(FILE* Terrains_XML_log, char *filename)
         exit(EXIT_FAILURE);
     }
     fprintf(Terrains_XML_log,"1) Memoire allouee avec succes \n");
-    fprintf(Terrains_XML_log,"La memoire allouee fait %lu octets\n",nb_terrains * sizeof(Terrain));
+    fprintf(Terrains_XML_log,"La memoire allouee fait %u octets\n",nb_terrains * sizeof(Terrain));
 
     /*--------------------------------------------------------------------------------------------------*/
 
@@ -83,14 +83,14 @@ Terrain* Remplir_Terrains(FILE* Terrains_XML_log, char *filename)
         /* Remplissage des caractéristiques de la classe en cours */
         switch(FR_int){
         case 0 :
-            Terrain_en_cours.franchissable=0;
+            Terrain_en_cours.franchissable=faux;
             break;
         case 1 :
-            Terrain_en_cours.franchissable=1;
+            Terrain_en_cours.franchissable=vrai;
             break;
         default :
             fprintf(Terrains_XML_log,"ERREUR : FR doit prendre la valeur 0 ou 1 !\n");
-            Terrain_en_cours.franchissable=0;
+            Terrain_en_cours.franchissable=faux;
         }
 
         switch(FRS_int){
diff --git a/src/affichage.c b/src/affichage.c
index b5e5ccfffed425bbafc11dc07a70ec46088b32ec..d2cd413129283cf347d60bd407813ec6a92318af 100644
--- a/src/affichage.c
+++ b/src/affichage.c
@@ -849,7 +849,7 @@ int affichage_carte()
             }
             if(event.button.x<LARGEUR_CARTE*LARGEUR_CASE)
             {
-                deplacement_personnage(event.button.x,event.button.y);
+                deplacement_personnage(perso_actuel,event.button.x,event.button.y);
             }
             break;
         case SDL_MOUSEMOTION:
diff --git a/src/controleur.c b/src/controleur.c
index bf16f048d67ea690a20abf4818475f27102139a2..e8d8215d564bf95ec518a251798c46a3c2f43d83 100644
--- a/src/controleur.c
+++ b/src/controleur.c
@@ -16,6 +16,7 @@
 #include "classe.h"
 #include "gamePackage.h"
 #include "roxml.h"
+#include "deplacements.h"
 
 Partie * partieGlobale;
 Game_Package packGlobal;
@@ -295,6 +296,8 @@ int ajouterPersonnage(char * nomClasse, int numTab, int numJoueur){
  */
 int selectionnerCarte(char * nomCarte){
     int i;
+    Game_Package copiePack = packGlobal;
+    Carte_Jeu copieCarte = *getCarte(partieGlobale);
     i=0;
     //Recherche de la Carte dans le Package
     while((strcmp(nomCarte,packGlobal.Cartes_Package[i].nom)!=0)&&(i<nbCartes())){
@@ -305,9 +308,12 @@ int selectionnerCarte(char * nomCarte){
         return 0;
     }
     //Initialisation de la Carte_Jeu
-    if(initCarte(&packGlobal.Cartes_Package[i],getCarte(partieGlobale),&packGlobal)==0){
+    if(initCarte(&(copiePack.Cartes_Package[i]),&copieCarte,&copiePack)==0){
+        printf("erreur : la carte ne peut etre initialisee");
         return 0;
     }
+    packGlobal=copiePack;
+    partieGlobale->c=&copieCarte;
     return 1;
 }
 
@@ -516,10 +522,10 @@ 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);
     if(numPerso<=NB_PERSO){
-        deplacement_unitaire(getCurrentJoueur(getListJoueur(partieGlobale))->groupe[numPerso-1]);
+        deplacement_unitaire(getCurrentJoueur(getListJoueur(partieGlobale))->groupe[numPerso-1],trouverCase(getCarte(partieGlobale),x,y));
     }
     else{
-        deplacement_unitaire(getCurrentJoueur(getListJoueur(partieGlobale))->groupe[numPerso-1-NB_PERSO]);
+        deplacement_unitaire(getCurrentJoueur(getListJoueur(partieGlobale))->groupe[numPerso-1-NB_PERSO],trouverCase(getCarte(partieGlobale),x,y));
     }
 }
 
diff --git a/src/controleur.h b/src/controleur.h
index faa33806000cc8322e256c150da8fb9679b805e6..9ffa57a4976e8f6e21cf5946a35f8ecc9048e184 100644
--- a/src/controleur.h
+++ b/src/controleur.h
@@ -42,6 +42,8 @@ void obtenirPositionPersonnage(int numero, int * x, int * y);
 
 Personnage * trouverPersonnage(Case * c);
 
+void deplacement_personnage(int numPerso,int x,int y);
+
 char * obtenirNomJoueurCourant();
 char * obtenirNomClassePersonnage(int numero);
 int obtenirPVPersonnage(int numero);
diff --git a/src/deplacements.c b/src/deplacements.c
index 7856374eca6647503754a6e35447008e3b6adcda..0ce46d6d159005544535b099e05a3a552f437637 100644
--- a/src/deplacements.c
+++ b/src/deplacements.c
@@ -41,7 +41,7 @@ int deplacement_unitaire(Personnage *perso,Case * destination){
         return 1;
     }
     if (case_franchissable(destination)==faux){
-        printf("déplacement impossible : case infranchissable");
+        printf("deplacement impossible : case infranchissable\n");
         return 1;
     }
     if (case_a_cote(perso,destination)==vrai){