diff --git a/src/main/Makefile b/src/main/Makefile
new file mode 100644
index 0000000..595a04a
--- /dev/null
+++ b/src/main/Makefile
@@ -0,0 +1,98 @@
+### VARIABLES ###
+
+JC = javac
+JCFLAGS = -encoding UTF-8 -implicit:none -d classes
+
+JVM = java
+JVMFLAGS = 
+
+### RÈGLES ESSENTIELLES ###
+
+Main.class: Main.java java/controller/MenuController.class java/view/MenuView.class java/controller/GameController.class
+	$(JC) $(JCFLAGS) Main.java
+
+java/controller/MenuController.class: java/controller/MenuController.java java/model/MenuModel.class java/view/MenuView.class java/controller/NewListener.class java/controller/QuiListener.class java/controller/ResListener.class
+	$(JC) $(JCFLAGS) java/controller/MenuController.java
+
+java/controller/NewListener.class: java/controller/NewListener.java
+	$(JC) $(JCFLAGS) java/controller/NewListener.java
+
+java/controller/QuiListener.class: java/controller/QuiListener.java
+	$(JC) $(JCFLAGS) java/controller/QuiListener.java
+
+java/controller/ResListener.class: java/controller/ResListener.java java/view/GameView.class
+	$(JC) $(JCFLAGS) java/controller/ResListener.java
+
+java/view/GameView.class: java/view/GameView.java java/controller/MouseWheelController.class java/controller/GameController.class java/view/HexagonTile.class
+	$(JC) $(JCFLAGS) java/view/GameView.java
+
+java/controller/MouseWheelController.class: java/controller/MouseWheelController.java java/view/HexagonTile.class java/controller/GameController.class
+	$(JC) $(JCFLAGS) java/controller/MouseWheelController.java
+
+java/controller/HexagonMouseListener.class: java/controller/HexagonMouseListener.java java/view/HexagonTile.class java/controller/TilePlacer.class
+	$(JC) $(JCFLAGS) java/controller/HexagonMouseListener.java
+
+java/controller/GameController.class: java/controller/GameController.java java/controller/TilePlacer.class java/model/Tile.class java/controller/CameraController.class java/controller/HexagonMouseListener.class
+	$(JC) $(JCFLAGS) java/controller/GameController.java
+
+java/controller/CameraController.class: java/controller/CameraController.java java/controller/GameContext.class java/controller/MousePressHandler.class java/controller/MouseDragHandler.class
+	$(JC) $(JCFLAGS) java/controller/CameraController.java
+
+java/controller/GameContext.class: java/controller/GameContext.java java/view/HexagonTile.class
+	$(JC) $(JCFLAGS) java/controller/GameContext.java
+
+java/view/HexagonTile.class: java/view/HexagonTile.java java/model/Tile.class java/model/TerrainType.class
+	$(JC) $(JCFLAGS) java/view/HexagonTile.java
+
+java/model/MenuModel.class: java/model/MenuModel.java
+	$(JC) $(JCFLAGS) java/model/MenuModel.java
+
+java/view/MenuView.class: java/view/MenuView.java java/view/BtnPerso.class java/view/ButtonHoverListener.class
+	$(JC) $(JCFLAGS) java/view/MenuView.java
+
+java/model/Tile.class: java/model/Tile.java java/model/TerrainType.class
+	$(JC) $(JCFLAGS) java/model/Tile.java
+
+java/model/TerrainType.class: java/model/TerrainType.java
+	$(JC) $(JCFLAGS) java/model/TerrainType.java
+
+java/view/ButtonHoverListener.class: java/view/ButtonHoverListener.java
+	$(JC) $(JCFLAGS) java/view/ButtonHoverListener.java
+
+java/view/BtnPerso.class: java/view/BtnPerso.java
+	$(JC) $(JCFLAGS) java/view/BtnPerso.java
+
+java/controller/MousePressHandler.class: java/controller/MousePressHandler.java java/controller/CameraControllerListener.class
+	$(JC) $(JCFLAGS) java/controller/MousePressHandler.java
+
+java/controller/MouseDragHandler.class: java/controller/MouseDragHandler.java java/controller/CameraControllerListener.class
+	$(JC) $(JCFLAGS) java/controller/MouseDragHandler.java
+
+java/controller/CameraControllerListener.class: java/controller/CameraControllerListener.java
+	$(JC) $(JCFLAGS) java/controller/CameraControllerListener.java
+
+java/controller/TilePlacer.class: java/controller/TilePlacer.java
+	$(JC) $(JCFLAGS) java/controller/TilePlacer.java
+
+### RÈGLE POUR COPIER LES IMAGES ###
+
+copy-images:
+	mkdir -p classes/java/view/img
+	if [ -d java/view/img ]; then cp -r java/view/img/* classes/java/view/img/; else echo "Le répertoire java/view/img n'existe pas."; fi
+
+### RÈGLES OPTIONNELLES ###
+
+run: Main.class copy-images
+	$(JVM) $(JVMFLAGS) -cp classes main.Main
+
+clean:
+	-rm -f classes/**/*.class
+
+mrproper: clean
+	-rm -rf classes/java/view/img
+
+### BUTS FACTICES ###
+
+.PHONY: run clean mrproper copy-images
+
+### FIN ###
diff --git a/src/main/classes/java/view/img/D.png b/src/main/classes/java/view/img/D.png
new file mode 100644
index 0000000..7dc4b96
Binary files /dev/null and b/src/main/classes/java/view/img/D.png differ
diff --git a/src/main/classes/java/view/img/bg.png b/src/main/classes/java/view/img/bg.png
new file mode 100644
index 0000000..e3621e8
Binary files /dev/null and b/src/main/classes/java/view/img/bg.png differ
diff --git a/src/main/classes/java/view/img/quit.png b/src/main/classes/java/view/img/quit.png
new file mode 100644
index 0000000..aa7b154
Binary files /dev/null and b/src/main/classes/java/view/img/quit.png differ
diff --git a/src/main/java/controller/CameraController.java b/src/main/java/controller/CameraController.java
index a1950c6..e40c0a2 100644
--- a/src/main/java/controller/CameraController.java
+++ b/src/main/java/controller/CameraController.java
@@ -3,8 +3,7 @@ package controller;
 import javax.swing.JPanel;
 import java.awt.Point;
 
-
-public class CameraController {
+public class CameraController implements CameraControllerListener {
 
     private Point mouseDragStart = null;
     private GameContext context;
@@ -16,6 +15,7 @@ public class CameraController {
         setupMouseDragToMove(gridPanel); // Initialise les écouteurs pour gérer le déplacement
     }
 
+    @Override
     public void updateViewOffset(int deltaX, int deltaY) {
         // Met à jour uniquement l'offset dans GameContext
         context.updateOffset(deltaX, deltaY);
@@ -27,18 +27,21 @@ public class CameraController {
     }
 
     private void setupMouseDragToMove(JPanel gridPanel) {
-        gridPanel.addMouseListener(new MousePressHandler(this, context));
-        gridPanel.addMouseMotionListener(new MouseDragHandler(this, context));
+        gridPanel.addMouseListener(new MousePressHandler(this));
+        gridPanel.addMouseMotionListener(new MouseDragHandler(this));
     }
 
+    @Override
     public void setMouseDragStart(Point point) {
         this.mouseDragStart = point;
     }
 
+    @Override
     public Point getMouseDragStart() {
         return mouseDragStart;
     }
 
+    @Override
     public void resetMouseDragStart() {
         this.mouseDragStart = null;
     }
diff --git a/src/main/java/controller/CameraControllerListener.java b/src/main/java/controller/CameraControllerListener.java
new file mode 100644
index 0000000..514b9b0
--- /dev/null
+++ b/src/main/java/controller/CameraControllerListener.java
@@ -0,0 +1,10 @@
+package controller;
+
+import java.awt.Point;
+
+public interface CameraControllerListener {
+    void updateViewOffset(int deltaX, int deltaY);
+    void setMouseDragStart(Point point);
+    Point getMouseDragStart();
+    void resetMouseDragStart();
+}
diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java
index 01fbb78..a9ba2e4 100644
--- a/src/main/java/controller/GameController.java
+++ b/src/main/java/controller/GameController.java
@@ -8,7 +8,7 @@ import java.awt.Point;
 import java.util.Map;
 import java.util.Set;
 
-public class GameController {
+public class GameController implements TilePlacer {
     private Map<Point, HexagonTile> hexagonMap;
     private Set<Point> availablePositions;
     private JPanel gridPanel;
@@ -28,8 +28,8 @@ public class GameController {
         updatePreview();
     }
 
+    @Override
     public void placeTile(Point position) {
-        // Vérifier si la position est disponible
         if (availablePositions.contains(position)) {
             HexagonTile hexTile = hexagonMap.get(position);
             if (hexTile == null) {
@@ -37,27 +37,21 @@ public class GameController {
                 return;
             }
 
-            // Assigner la tuile actuelle
             hexTile.setTile(nextTile);
             gridPanel.revalidate();
             gridPanel.repaint();
 
-            // Retirer la position des positions disponibles
             availablePositions.remove(position);
 
-            // Mettre à jour les positions adjacentes
             Point[] adjacentPositions = getAdjacentPositions(position);
             for (Point adj : adjacentPositions) {
                 if (!hexagonMap.containsKey(adj)) {
                     availablePositions.add(adj);
-                    addHexagonTile(adj, gridPanel, 50, null, null);  // Ajouter des placeholders
+                    addHexagonTile(adj, gridPanel, 50, null, null);
                 }
             }
 
-            // Repeindre la grille
             gameContext.repaintGrid(gridPanel);
-
-            // Générer une nouvelle tuile pour la prochaine preview
             generateNextTile();
         }
     }
@@ -72,8 +66,6 @@ public class GameController {
         initialPosition.setLocation(centerX / 50, centerY / 50);
 
         placeInitialTile(initialPosition, cameraController, initialTile);
-
-        // Générer la première tuile pour la preview
         generateNextTile();
     }
 
@@ -126,7 +118,6 @@ public class GameController {
     }
 
     public void generateNextTile() {
-        // Génère une nouvelle tuile pour la prochaine pose
         nextTile = new Tile();
         updatePreview();
     }
diff --git a/src/main/java/controller/HexagonMouseListener.java b/src/main/java/controller/HexagonMouseListener.java
index c04194a..cd9b3ae 100644
--- a/src/main/java/controller/HexagonMouseListener.java
+++ b/src/main/java/controller/HexagonMouseListener.java
@@ -8,12 +8,12 @@ import java.util.Set;
 
 public class HexagonMouseListener extends MouseAdapter {
     private final HexagonTile hexTile;
-    private final GameController gameController;
+    private final TilePlacer tilePlacer;
     private final Set<Point> availablePositions;
 
-    public HexagonMouseListener(HexagonTile hexTile, GameController gameController, Set<Point> availablePositions) {
+    public HexagonMouseListener(HexagonTile hexTile, TilePlacer tilePlacer, Set<Point> availablePositions) {
         this.hexTile = hexTile;
-        this.gameController = gameController;
+        this.tilePlacer = tilePlacer;
         this.availablePositions = availablePositions;
     }
 
@@ -22,12 +22,7 @@ public class HexagonMouseListener extends MouseAdapter {
         Point position = hexTile.getPosition();
         if (availablePositions.contains(position)) {
             System.out.println("Hexagone cliqué à la position : " + position);
-
-            // Appeler le GameController pour placer une nouvelle tuile à cet emplacement
-            gameController.placeTile(position);
-
-            // Générer la prochaine tuile après avoir placé celle-ci
-            gameController.generateNextTile();
+            tilePlacer.placeTile(position);
         } else {
             System.out.println("Position non disponible pour le placement");
         }
diff --git a/src/main/java/controller/MouseDragHandler.java b/src/main/java/controller/MouseDragHandler.java
index f9db7f3..7c1315a 100644
--- a/src/main/java/controller/MouseDragHandler.java
+++ b/src/main/java/controller/MouseDragHandler.java
@@ -7,31 +7,31 @@ import javax.swing.SwingUtilities;
 
 public class MouseDragHandler extends MouseAdapter {
 
-    private CameraController controller;
+    private CameraControllerListener listener;
 
-    public MouseDragHandler(CameraController controller, GameContext context) {
-        this.controller = controller;
+    public MouseDragHandler(CameraControllerListener listener) {
+        this.listener = listener;
     }
 
     @Override
     public void mouseDragged(MouseEvent e) {
-        if (controller.getMouseDragStart() != null && SwingUtilities.isRightMouseButton(e)) {
+        if (listener.getMouseDragStart() != null && SwingUtilities.isRightMouseButton(e)) {
             Point current = e.getPoint();
-            int deltaX = current.x - controller.getMouseDragStart().x;
-            int deltaY = current.y - controller.getMouseDragStart().y;
+            int deltaX = current.x - listener.getMouseDragStart().x;
+            int deltaY = current.y - listener.getMouseDragStart().y;
 
             // Déplacement dans CameraController
-            controller.updateViewOffset(deltaX, deltaY);
+            listener.updateViewOffset(deltaX, deltaY);
 
             // Met à jour la position de départ
-            controller.setMouseDragStart(current);
+            listener.setMouseDragStart(current);
         }
     }
 
     @Override
     public void mouseReleased(MouseEvent e) {
         if (SwingUtilities.isRightMouseButton(e)) {
-            controller.resetMouseDragStart();
+            listener.resetMouseDragStart();
         }
     }
 }
diff --git a/src/main/java/controller/MousePressHandler.java b/src/main/java/controller/MousePressHandler.java
index ad329ae..9f12813 100644
--- a/src/main/java/controller/MousePressHandler.java
+++ b/src/main/java/controller/MousePressHandler.java
@@ -1,28 +1,28 @@
 package controller;
+
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import javax.swing.SwingUtilities;
 
 public class MousePressHandler extends MouseAdapter {
 
-    private CameraController controller;
+    private CameraControllerListener listener;
 
-    public MousePressHandler(CameraController controller, GameContext context) {
-        this.controller = controller;
+    public MousePressHandler(CameraControllerListener listener) {
+        this.listener = listener;
     }
-    
+
     @Override
     public void mousePressed(MouseEvent e) {
         if (SwingUtilities.isRightMouseButton(e)) {
-            System.out.println("Clic droit détecté");
-            controller.setMouseDragStart(e.getPoint());
+            listener.setMouseDragStart(e.getPoint());
         }
     }
 
     @Override
     public void mouseReleased(MouseEvent e) {
         if (SwingUtilities.isRightMouseButton(e)) {
-            controller.resetMouseDragStart();
+            listener.resetMouseDragStart();
         }
     }
 }
diff --git a/src/main/java/controller/TilePlacer.java b/src/main/java/controller/TilePlacer.java
new file mode 100644
index 0000000..055b31f
--- /dev/null
+++ b/src/main/java/controller/TilePlacer.java
@@ -0,0 +1,7 @@
+package controller;
+
+import java.awt.Point;
+
+public interface TilePlacer {
+    void placeTile(Point position);
+}
diff --git a/src/main/java/view/MenuView.java b/src/main/java/view/MenuView.java
index 0418fbe..2a28573 100644
--- a/src/main/java/view/MenuView.java
+++ b/src/main/java/view/MenuView.java
@@ -22,9 +22,9 @@ public class MenuView extends JComponent {
         panelCoté.setPreferredSize(new Dimension(300, 0));
 
         // Utilisation de getResource pour charger les images
-        backgroundImage = new ImageIcon(getClass().getResource("/view/img/bg.png")).getImage();
-        logo = new ImageIcon(getClass().getResource("/view/img/D.png"));
-        quit = new ImageIcon(getClass().getResource("/view/img/quit.png"));
+        backgroundImage = new ImageIcon(getClass().getResource("/java/view/img/bg.png")).getImage();
+        logo = new ImageIcon(getClass().getResource("/java/view/img/D.png"));
+        quit = new ImageIcon(getClass().getResource("/java/view/img/quit.png"));
 
         // Redimensionnement des images
         Image quit1 = quit.getImage();