diff --git a/player.c b/player.c
index 4745b78a81a5157c5a1f8aca01d449f49313e260..61bc2926c62ec0065c70a3b82ca1f2bbac8df074 100644
--- a/player.c
+++ b/player.c
@@ -1,3 +1,5 @@
+#include <stdio.h>
+#include <stdlib.h>
 #include "player.h"
 #include "grid.h"
 
@@ -17,11 +19,29 @@ void move_player(grid* G, enum Direction D) {
             target_column++;
     }
     enum CaseType target = G->game_grid[target_row][target_column];
-    if (target == WALL || target == BOX || target == GOAL) {
+    enum CaseType player = G->game_grid[G->player.y][G->player.x];
+    if (target == WALL || target == BOX) {
         return;
+    } else if (target == GOAL) {
+        if (player == PLAYER) {
+            G->game_grid[target_row][target_column] = PLAYER_GOAL;
+            G->game_grid[G->player.y][G->player.x] = NONE;
+        } else if (player == PLAYER_GOAL) {
+            G->game_grid[target_row][target_column] = PLAYER_GOAL;
+            G->game_grid[G->player.y][G->player.x] = GOAL;
+        }
+    } else if (target == NONE) {
+        if (player == PLAYER) {
+            G->game_grid[target_row][target_column] = PLAYER;
+            G->game_grid[G->player.y][G->player.x] = NONE;
+        } else if (player == PLAYER_GOAL) {
+            G->game_grid[target_row][target_column] = PLAYER;
+            G->game_grid[G->player.y][G->player.x] = GOAL;
+        }
+    } else {
+        fprintf(stderr, "Error this level map has features unmanaged by the game\n");
+        exit(-1);
     }
-    G->game_grid[target_row][target_column] = G->game_grid[G->player.y][G->player.x];
-    G->game_grid[G->player.y][G->player.x] = target;
     G->player.x = target_column;
     G->player.y = target_row;
 }
diff --git a/test.c b/test.c
index b07450841e9073e6e3072e5a1e6701696e9d152b..7db07354d87487c05da585f34c18534f8ad31f19 100644
--- a/test.c
+++ b/test.c
@@ -56,7 +56,9 @@ int main() {
         display(level);
         printf("Votre choix : ");
         scanf(" %c", &quitCar);
-        move_player(level, quitCar);
+        if (quitCar == 'h' || quitCar == 'j' || quitCar == 'k' || quitCar == 'l') {
+            move_player(level, quitCar);
+        }
     }
     free_level(level);
     return 0;