From 5f2b24da2710fd28d38f10452de78bf7389365fc Mon Sep 17 00:00:00 2001 From: Moncef STITI Date: Sat, 23 Nov 2024 23:27:44 +0100 Subject: [PATCH] Sauvegarde du score --- .../dorfromantik/game/BiomeGroup.java | 29 +++++ .../fr/monkhanny/dorfromantik/game/Board.java | 76 +++++++++++- .../fr/monkhanny/dorfromantik/game/Cell.java | 6 +- .../monkhanny/dorfromantik/game/Pocket.java | 43 +++++++ .../fr/monkhanny/dorfromantik/game/Tile.java | 114 +++++------------- 5 files changed, 177 insertions(+), 91 deletions(-) create mode 100644 TestV2/src/fr/monkhanny/dorfromantik/game/BiomeGroup.java create mode 100644 TestV2/src/fr/monkhanny/dorfromantik/game/Pocket.java diff --git a/TestV2/src/fr/monkhanny/dorfromantik/game/BiomeGroup.java b/TestV2/src/fr/monkhanny/dorfromantik/game/BiomeGroup.java new file mode 100644 index 0000000..f381031 --- /dev/null +++ b/TestV2/src/fr/monkhanny/dorfromantik/game/BiomeGroup.java @@ -0,0 +1,29 @@ +package fr.monkhanny.dorfromantik.game; + +import java.util.ArrayList; +import java.util.List; + +public class BiomeGroup { + private List pockets; + + public BiomeGroup() { + pockets = new ArrayList<>(); + } + + public void addPocket(Pocket pocket) { + pockets.add(pocket); + } + + public List getPockets() { + return pockets; + } + + public int calculateTotalScore() { + int totalScore = 0; + for (Pocket pocket : pockets) { + totalScore += pocket.calculateScore(); + } + return totalScore; + } +} + diff --git a/TestV2/src/fr/monkhanny/dorfromantik/game/Board.java b/TestV2/src/fr/monkhanny/dorfromantik/game/Board.java index bd148d3..ddc0a8b 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/game/Board.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/game/Board.java @@ -7,6 +7,8 @@ import fr.monkhanny.dorfromantik.listeners.GameSpaceKeyListener; import fr.monkhanny.dorfromantik.listeners.GameMouseClickListener; import fr.monkhanny.dorfromantik.listeners.GameMouseWheelListener; import fr.monkhanny.dorfromantik.Options; +import fr.monkhanny.dorfromantik.enums.Biome; +import fr.monkhanny.dorfromantik.enums.TileOrientation; import java.util.ArrayList; import java.util.List; @@ -21,6 +23,9 @@ import java.awt.Graphics2D; // TEMPORAIRE : import java.awt.event.MouseMotionAdapter; // Import pour MouseMotionAdapter import java.awt.AlphaComposite; +import java.util.HashMap; +import java.util.Map; +import java.awt.Point; /** @@ -37,16 +42,22 @@ public class Board extends JPanel{ private int offsetX = 0; // Décalage horizontal du plateau private int offsetY = 0; // Décalage vertical du plateau private Tile nextTile; - private Point mousePosition = null; + private Map biomeGroups; + private Point mousePosition; // Constructeur avec seed public Board(JFrame gameFrame, long seed) { this.gameFrame = gameFrame; this.tiles = new ArrayList<>(); + this.biomeGroups = new HashMap<>(); this.availablePositions = new ArrayList<>(); this.random = new Random(seed); this.game = new Game(seed); + for (Biome biome : Biome.values()) { + biomeGroups.put(biome, new BiomeGroup()); + } + // Placer une tuile centrale au démarrage initializeCentralTile(); @@ -188,7 +199,68 @@ public class Board extends JPanel{ centralTile.setPosition(centerX, centerY); } - public void addTile(Tile tile) { tiles.add(tile);} + public void addTile(Tile tile) { + tiles.add(tile); + updatePockets(tile); + displayCurrentScore(); + } + + private void updatePockets(Tile newTile) { + for (TileOrientation orientation : TileOrientation.values()) { + Biome biome = newTile.getBiome(orientation); + BiomeGroup biomeGroup = biomeGroups.get(biome); + + // Vérifier si la nouvelle tuile peut être connectée à une poche existante + Pocket connectedPocket = null; + for (Pocket pocket : biomeGroup.getPockets()) { + if (isConnectedToPocket(newTile, pocket)) { + connectedPocket = pocket; + break; + } + } + + if (connectedPocket != null) { + // Connecte la tuile à une poche existante + connectedPocket.addTile(newTile); + } else { + // Crée une nouvelle poche pour ce biome + Pocket newPocket = new Pocket(biome); + newPocket.addTile(newTile); + biomeGroup.addPocket(newPocket); + } + } + } + + // Méthode pour vérifier si une tuile est connectée à une poche existante + private boolean isConnectedToPocket(Tile tile, Pocket pocket) { + for (Tile connectedTile : pocket.getTiles()) { + if (areTilesConnected(tile, connectedTile)) { + return true; + } + } + return false; + } + + // Vérifie si deux tuiles sont connectées par un même biome + private boolean areTilesConnected(Tile tile1, Tile tile2) { + for (TileOrientation orientation : TileOrientation.values()) { + if (tile1.getBiome(orientation).equals(tile2.getBiome(orientation))) { + // Vérifier si les tuiles sont adjacentes (logique à adapter selon vos besoins) + // Exemple : si elles partagent un côté commun + return tile1.isAdjacentTo(tile2); + } + } + return false; + } + + // Affiche le score actuel + private void displayCurrentScore() { + int totalScore = 0; + for (BiomeGroup group : biomeGroups.values()) { + totalScore += group.calculateTotalScore(); + } + System.out.println("Score actuel : " + totalScore); + } public Random getRandom() { return random; } diff --git a/TestV2/src/fr/monkhanny/dorfromantik/game/Cell.java b/TestV2/src/fr/monkhanny/dorfromantik/game/Cell.java index 1aa4021..51a6045 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/game/Cell.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/game/Cell.java @@ -9,9 +9,9 @@ import javax.swing.*; */ public class Cell extends JComponent { private Board board; // Le plateau de jeu auquel cette cellule appartient - private int x; // Coordonnée x du centre de la cellule - private int y; // Coordonnée y du centre de la cellule - private int radius; // Rayon de la cellule (si on parle d'un hexagone, c'est le rayon de l'hexagone) + public int x; // Coordonnée x du centre de la cellule + public int y; // Coordonnée y du centre de la cellule + public int radius; // Rayon de la cellule (si on parle d'un hexagone, c'est le rayon de l'hexagone) /** * Constructeur de la classe Cell. diff --git a/TestV2/src/fr/monkhanny/dorfromantik/game/Pocket.java b/TestV2/src/fr/monkhanny/dorfromantik/game/Pocket.java new file mode 100644 index 0000000..114bd3f --- /dev/null +++ b/TestV2/src/fr/monkhanny/dorfromantik/game/Pocket.java @@ -0,0 +1,43 @@ +package fr.monkhanny.dorfromantik.game; + +import fr.monkhanny.dorfromantik.enums.Biome; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Pocket { + private Biome biome; + private Set tiles; // Ensemble des tuiles de la poche + + public Pocket(Biome biome) { + this.biome = biome; + this.tiles = new HashSet<>(); + } + + public void addTile(Tile tile) { + tiles.add(tile); + } + + public boolean containsTile(Tile tile) { + return tiles.contains(tile); + } + + public Biome getBiome() { + return biome; + } + + public int getSize() { + return tiles.size(); + } + + public int calculateScore() { + // Calcul du score basé sur la taille de la poche + return getSize() * getSize(); + } + + public List getTiles() { + return new ArrayList<>(tiles); + } +} \ No newline at end of file diff --git a/TestV2/src/fr/monkhanny/dorfromantik/game/Tile.java b/TestV2/src/fr/monkhanny/dorfromantik/game/Tile.java index e11679a..94602d8 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/game/Tile.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/game/Tile.java @@ -18,15 +18,7 @@ public class Tile extends Cell { private HashMap sideBiomes = new HashMap<>(); - /** - * Constructeur d'une tuile avec des biomes spécifiques pour chaque côté. - * - * @param board Le plateau de jeu - * @param x La position x du centre de la tuile - * @param y La position y du centre de la tuile - * @param radius Le rayon de la tuile - * @param biomes Biomes associés aux côtés de la tuile - */ + public Tile(Board board, int x, int y, int radius, Biome... biomes) { super(board, x, y, radius); TileOrientation[] sides = TileOrientation.values(); @@ -35,48 +27,23 @@ public class Tile extends Cell { } } - /** - * Constructeur d'une tuile avec des biomes aléatoires. - * - * @param board Le plateau de jeu - * @param x La position x du centre de la tuile - * @param y La position y du centre de la tuile - * @param radius Le rayon de la tuile - */ + public Tile(Board board, int x, int y, int radius) { super(board, x, y, radius); this.assignRandomBiomes(); } - /** - * Constructeur d'une tuile avec des biomes spécifiques pour chaque côté - * à partir d'un centre donné. - * - * @param board Le plateau de jeu - * @param center Le centre de la tuile - * @param radius Le rayon de la tuile - * @param biomes Biomes associés aux côtés de la tuile - */ + public Tile(Board board, Point center, int radius, Biome... biomes) { this(board, center.x, center.y, radius, biomes); } - /** - * Constructeur d'une tuile avec des biomes aléatoires à partir d'un centre donné. - * - * @param board Le plateau de jeu - * @param center Le centre de la tuile - * @param radius Le rayon de la tuile - */ + public Tile(Board board, Point center, int radius) { this(board, center.x, center.y, radius); } - /** - * Définit les biomes pour cette tuile. - * - * @param biomes Biomes associés aux côtés - */ + public void setBiomes(Biome... biomes) { TileOrientation[] sides = TileOrientation.values(); for (int i = 0; i < sides.length; i++) { @@ -84,9 +51,7 @@ public class Tile extends Cell { } } - /** - * Assigne des biomes aléatoires aux côtés de la tuile. - */ + public void assignRandomBiomes() { Game game = this.getBoard().getGame(); Biome[] biomes = Biome.values(); @@ -108,21 +73,11 @@ public class Tile extends Cell { } } - /** - * Récupère le biome associé à un côté donné. - * - * @param side Le côté de la tuile - * @return Le biome associé au côté - */ public Biome getBiome(TileOrientation side) { return this.sideBiomes.get(side); } - /** - * Récupère le biome dominant de la tuile, basé sur la majorité des côtés. - * - * @return Le biome dominant - */ + private Biome getDominantBiome() { TileOrientation[] sides = TileOrientation.values(); @@ -150,11 +105,7 @@ public class Tile extends Cell { return null; } - /** - * Récupère les biomes associés à chaque côté de la tuile. - * - * @return Tableau des biomes de la tuile - */ + public Biome[] getBiomes() { Biome[] biomes = new Biome[TileOrientation.values().length]; for (TileOrientation side : TileOrientation.values()) { @@ -163,11 +114,7 @@ public class Tile extends Cell { return biomes; } - /** - * Effectue une rotation de la tuile dans le sens horaire ou antihoraire. - * - * @param clockwise Si true, rotation horaire; sinon antihoraire - */ + public void rotate(boolean clockwise) { TileOrientation[] sides = TileOrientation.values(); HashMap newBiomesMap = new HashMap<>(); @@ -182,12 +129,7 @@ public class Tile extends Cell { this.repaint(); } - /** - * Vérifie si un biome spécifique existe sur la tuile. - * - * @param biome Le biome à vérifier - * @return true si le biome est présent, false sinon - */ + public boolean containsBiome(Biome biome) { for (TileOrientation side : TileOrientation.values()) { if (this.getBiome(side) == biome) { @@ -197,13 +139,23 @@ public class Tile extends Cell { return false; } - /** - * Récupère le côté de la tuile en fonction de la position (x, y) relative. - * - * @param x La position x - * @param y La position y - * @return Le côté de la tuile correspondant - */ + public boolean isAdjacentTo(Tile otherTile) { + // Get the radius of the tiles + int tileRadius = this.getRadius(); + + // Compute the distance between the center of this tile and the other tile + int deltaX = this.getX() - otherTile.getX(); + int deltaY = this.getY() - otherTile.getY(); + + // Calculate the Euclidean distance between the two tiles + double distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); + + // In a hexagonal grid, two tiles are adjacent if their distance is equal to the diameter (2 * radius) + return distance <= (2 * tileRadius); +} + + + private TileOrientation determineSide(int x, int y) { int radius = this.getRadius(); TileOrientation[] sides = TileOrientation.values(); @@ -230,15 +182,7 @@ public class Tile extends Cell { return floorBiome.equals(dominantBiome) ? sides[ceilSide] : sides[floorSide]; } - /** - * Dessine une rangée d'hexagones sur la tuile. - * - * @param g2d Le contexte graphique - * @param rowX Position X de la rangée - * @param rowY Position Y de la rangée - * @param radius Rayon des hexagones - * @param rowLength Nombre d'hexagones dans la rangée - */ + private void drawHexagonRow(Graphics2D g2d, double rowX, double rowY, double radius, int rowLength) { int gRadius = this.getRadius(); @@ -268,8 +212,6 @@ public class Tile extends Cell { // Appel de la méthode de dessin de la tuile à la nouvelle position paintTile(g2d, scale); - - // Restauration de l'état graphique (annule le déplacement) g2d.dispose(); }