diff --git a/src/main/Main.java b/src/main/Main.java new file mode 100644 index 0000000..06f6410 --- /dev/null +++ b/src/main/Main.java @@ -0,0 +1,10 @@ +package main; + +import javax.swing.SwingUtilities; +import view.GameView; + +public class Main { + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> new GameView()); + } +} diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java new file mode 100644 index 0000000..086b323 --- /dev/null +++ b/src/main/java/controller/GameController.java @@ -0,0 +1,98 @@ +package controller; + +import model.Tile; +import view.HexagonTile; +import view.GameView; + +import java.awt.*; +import java.util.Map; +import java.util.Set; +import javax.swing.JPanel; + +public class GameController { + private Map<Point, HexagonTile> hexagonMap; + private Set<Point> availablePositions; + private Tile nextTile; + private HexagonTile nextTilePreview; + private JPanel gridPanel; + + public GameController(Map<Point, HexagonTile> hexagonMap, Set<Point> availablePositions, JPanel gridPanel, Tile nextTile, HexagonTile nextTilePreview) { + this.hexagonMap = hexagonMap; + this.availablePositions = availablePositions; + this.gridPanel = gridPanel; + this.nextTile = nextTile; + this.nextTilePreview = nextTilePreview; + } + + public void placeInitialTile(Point position) { + addHexagonTile(position, gridPanel, 50); + availablePositions.remove(position); + + Point[] adjacentPositions = getAdjacentPositions(position); + for (Point adj : adjacentPositions) { + if (!hexagonMap.containsKey(adj)) { + availablePositions.add(adj); + addHexagonTile(adj, gridPanel, 50); + } + } + } + + public void placeTile(Point position) { + if (availablePositions.contains(position)) { + HexagonTile hexTile = hexagonMap.get(position); + if (hexTile != null && !hexTile.isFilled()) { + // Placer la tuile actuelle + hexTile.setTile(nextTile); + + // Générer une nouvelle tuile et mettre à jour la prévisualisation + nextTile = generateRandomTile(); + nextTilePreview.setTile(nextTile); + + updateAdjacentPositions(position); + } + } + } + + private void addHexagonTile(Point position, JPanel panel, int hexSize) { + int xOffset = position.x * (int) (hexSize * 3 / 2); // Décalage horizontal ajusté + int yOffset = position.y * (int) (Math.sqrt(3) * hexSize); // Décalage vertical ajusté + + if (position.x % 2 != 0) { + yOffset += (int) (Math.sqrt(3) * hexSize / 2); + } + + HexagonTile hexTile = new HexagonTile(position); + hexTile.setBounds(xOffset, yOffset, hexSize, hexSize); + hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions)); + + hexagonMap.put(position, hexTile); + panel.add(hexTile); + panel.revalidate(); + panel.repaint(); + } + + private void updateAdjacentPositions(Point position) { + Point[] adjacentPositions = getAdjacentPositions(position); + for (Point adj : adjacentPositions) { + if (!hexagonMap.containsKey(adj)) { + availablePositions.add(adj); + addHexagonTile(adj, gridPanel, 50); + } + } + } + + private Point[] getAdjacentPositions(Point position) { + return new Point[]{ + new Point(position.x + 1, position.y), + new Point(position.x - 1, position.y), + new Point(position.x, position.y + 1), + new Point(position.x, position.y - 1), + new Point(position.x + 1, position.y - 1), + new Point(position.x - 1, position.y + 1) + }; + } + + private Tile generateRandomTile() { + return new Tile(); + } +} diff --git a/src/main/java/controller/HexagonMouseListener.java b/src/main/java/controller/HexagonMouseListener.java index 254c1de..689da25 100644 --- a/src/main/java/controller/HexagonMouseListener.java +++ b/src/main/java/controller/HexagonMouseListener.java @@ -1,7 +1,6 @@ package controller; import view.HexagonTile; -import view.GameView; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.Point; @@ -10,12 +9,12 @@ import java.util.Set; public class HexagonMouseListener extends MouseAdapter { private final HexagonTile hexTile; - private final GameView gameView; + private final GameController gameController; // Utilise maintenant GameController private final Set<Point> availablePositions; - public HexagonMouseListener(HexagonTile hexTile, GameView gameView, Set<Point> availablePositions) { + public HexagonMouseListener(HexagonTile hexTile, GameController gameController, Set<Point> availablePositions) { this.hexTile = hexTile; - this.gameView = gameView; + this.gameController = gameController; this.availablePositions = availablePositions; } @@ -23,7 +22,7 @@ public class HexagonMouseListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { Point position = hexTile.getPosition(); if (availablePositions.contains(position)) { - gameView.placeTile(position); + gameController.placeTile(position); // Appelle la méthode placeTile du contrôleur } } } diff --git a/src/main/java/view/GameView.java b/src/main/java/view/GameView.java index 0db1374..7cc29ec 100644 --- a/src/main/java/view/GameView.java +++ b/src/main/java/view/GameView.java @@ -1,7 +1,7 @@ package view; +import controller.GameController; import model.Tile; -import controller.HexagonMouseListener; import javax.swing.*; import java.awt.*; @@ -18,6 +18,7 @@ public class GameView extends JFrame { private Tile nextTile; private HexagonTile nextTilePreview; // Tuile de prévisualisation à droite private int tileCount; + private GameController gameController; public GameView() { this.hexagonMap = new HashMap<>(); @@ -41,9 +42,12 @@ public class GameView extends JFrame { JPanel controlPanel = createControlPanel(); add(controlPanel, BorderLayout.EAST); + // Initialiser le contrôleur + gameController = new GameController(hexagonMap, availablePositions, gridPanel, nextTile, nextTilePreview); + // Placer la première tuile au centre Point initialPosition = new Point(0, 0); - placeInitialTile(initialPosition); + gameController.placeInitialTile(initialPosition); centerScrollOnPosition(initialPosition, scrollPane); pack(); @@ -51,83 +55,10 @@ public class GameView extends JFrame { setVisible(true); } - private void placeInitialTile(Point position) { - addHexagonTile(position, gridPanel, 50); - availablePositions.remove(position); - - Point[] adjacentPositions = getAdjacentPositions(position); - for (Point adj : adjacentPositions) { - if (!hexagonMap.containsKey(adj)) { - availablePositions.add(adj); - addHexagonTile(adj, gridPanel, 50); - } - } - } - private JPanel createHexagonGrid() { return new HexagonGridPanel(); } - // Ajouter un hexagone à une position donnée - private void addHexagonTile(Point position, JPanel panel, int hexSize) { - int xOffset = position.x * (int) (hexSize * 3 / 2); // Décalage horizontal ajusté - int yOffset = position.y * (int) (Math.sqrt(3) * hexSize); // Décalage vertical ajusté - - // Décaler les colonnes impaires verticalement - if (position.x % 2 != 0) { - yOffset += (int) (Math.sqrt(3) * hexSize / 2); - } - - HexagonTile hexTile = new HexagonTile(position); - hexTile.setBounds(xOffset, yOffset, hexSize, hexSize); - // Utiliser la classe HexagonMouseListener à la place de la classe anonyme - hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions)); - - hexagonMap.put(position, hexTile); - panel.add(hexTile); - panel.revalidate(); - panel.repaint(); - } - - // Placer une tuile à la position spécifiée - public void placeTile(Point position) { - if (availablePositions.contains(position)) { - HexagonTile hexTile = hexagonMap.get(position); - if (hexTile != null && !hexTile.isFilled()) { - // Placer la tuile actuelle - hexTile.setTile(nextTile); - tileCount++; - - // Générer une nouvelle tuile et mettre à jour la prévisualisation - nextTile = generateRandomTile(); - nextTilePreview.setTile(nextTile); - - updateAdjacentPositions(position); - } - } - } - - private void updateAdjacentPositions(Point position) { - Point[] adjacentPositions = getAdjacentPositions(position); - for (Point adj : adjacentPositions) { - if (!hexagonMap.containsKey(adj)) { - availablePositions.add(adj); - addHexagonTile(adj, gridPanel, 50); - } - } - } - - private Point[] getAdjacentPositions(Point position) { - return new Point[]{ - new Point(position.x + 1, position.y), - new Point(position.x - 1, position.y), - new Point(position.x, position.y + 1), - new Point(position.x, position.y - 1), - new Point(position.x + 1, position.y - 1), - new Point(position.x - 1, position.y + 1) - }; - } - private Tile generateRandomTile() { return new Tile(); } @@ -153,8 +84,4 @@ public class GameView extends JFrame { return panel; } - - public static void main(String[] args) { - SwingUtilities.invokeLater(() -> new GameView()); - } } diff --git a/src/main/java/view/HexagonTile.java b/src/main/java/view/HexagonTile.java index 044363f..58c3918 100644 --- a/src/main/java/view/HexagonTile.java +++ b/src/main/java/view/HexagonTile.java @@ -1,7 +1,7 @@ package view; import model.Tile; -import model.TerrainType; // Ajout de l'import pour TerrainType +import model.TerrainType; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/view/TileView.java b/src/main/java/view/TileView.java index dd10353..d7684c6 100644 --- a/src/main/java/view/TileView.java +++ b/src/main/java/view/TileView.java @@ -1,7 +1,7 @@ package view; import model.Tile; -import model.TerrainType; // Ajout de l'import pour TerrainType +import model.TerrainType; import javax.swing.*; import java.awt.*; @@ -13,7 +13,7 @@ public class TileView extends JPanel { public TileView(Tile tile) { this.tile = tile; - setPreferredSize(new Dimension(100, 100)); // Ajuste selon la taille de la tuile + setPreferredSize(new Dimension(100, 100)); } @Override