Sauvegarde du score

This commit is contained in:
2024-11-23 23:27:44 +01:00
parent 3d7fe42bd4
commit 5f2b24da27
5 changed files with 177 additions and 91 deletions

View File

@@ -0,0 +1,29 @@
package fr.monkhanny.dorfromantik.game;
import java.util.ArrayList;
import java.util.List;
public class BiomeGroup {
private List<Pocket> pockets;
public BiomeGroup() {
pockets = new ArrayList<>();
}
public void addPocket(Pocket pocket) {
pockets.add(pocket);
}
public List<Pocket> getPockets() {
return pockets;
}
public int calculateTotalScore() {
int totalScore = 0;
for (Pocket pocket : pockets) {
totalScore += pocket.calculateScore();
}
return totalScore;
}
}

View File

@@ -7,6 +7,8 @@ import fr.monkhanny.dorfromantik.listeners.GameSpaceKeyListener;
import fr.monkhanny.dorfromantik.listeners.GameMouseClickListener; import fr.monkhanny.dorfromantik.listeners.GameMouseClickListener;
import fr.monkhanny.dorfromantik.listeners.GameMouseWheelListener; import fr.monkhanny.dorfromantik.listeners.GameMouseWheelListener;
import fr.monkhanny.dorfromantik.Options; import fr.monkhanny.dorfromantik.Options;
import fr.monkhanny.dorfromantik.enums.Biome;
import fr.monkhanny.dorfromantik.enums.TileOrientation;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -21,6 +23,9 @@ import java.awt.Graphics2D;
// TEMPORAIRE : // TEMPORAIRE :
import java.awt.event.MouseMotionAdapter; // Import pour MouseMotionAdapter import java.awt.event.MouseMotionAdapter; // Import pour MouseMotionAdapter
import java.awt.AlphaComposite; 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 offsetX = 0; // Décalage horizontal du plateau
private int offsetY = 0; // Décalage vertical du plateau private int offsetY = 0; // Décalage vertical du plateau
private Tile nextTile; private Tile nextTile;
private Point mousePosition = null; private Map<Biome, BiomeGroup> biomeGroups;
private Point mousePosition;
// Constructeur avec seed // Constructeur avec seed
public Board(JFrame gameFrame, long seed) { public Board(JFrame gameFrame, long seed) {
this.gameFrame = gameFrame; this.gameFrame = gameFrame;
this.tiles = new ArrayList<>(); this.tiles = new ArrayList<>();
this.biomeGroups = new HashMap<>();
this.availablePositions = new ArrayList<>(); this.availablePositions = new ArrayList<>();
this.random = new Random(seed); this.random = new Random(seed);
this.game = new Game(seed); this.game = new Game(seed);
for (Biome biome : Biome.values()) {
biomeGroups.put(biome, new BiomeGroup());
}
// Placer une tuile centrale au démarrage // Placer une tuile centrale au démarrage
initializeCentralTile(); initializeCentralTile();
@@ -188,7 +199,68 @@ public class Board extends JPanel{
centralTile.setPosition(centerX, centerY); 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; } public Random getRandom() { return random; }

View File

@@ -9,9 +9,9 @@ import javax.swing.*;
*/ */
public class Cell extends JComponent { public class Cell extends JComponent {
private Board board; // Le plateau de jeu auquel cette cellule appartient private Board board; // Le plateau de jeu auquel cette cellule appartient
private int x; // Coordonnée x du centre de la cellule public int x; // Coordonnée x du centre de la cellule
private int y; // Coordonnée y du centre de la cellule public 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 radius; // Rayon de la cellule (si on parle d'un hexagone, c'est le rayon de l'hexagone)
/** /**
* Constructeur de la classe Cell. * Constructeur de la classe Cell.

View File

@@ -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<Tile> 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<Tile> getTiles() {
return new ArrayList<>(tiles);
}
}

View File

@@ -18,15 +18,7 @@ public class Tile extends Cell {
private HashMap<TileOrientation, Biome> sideBiomes = new HashMap<>(); private HashMap<TileOrientation, Biome> 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) { public Tile(Board board, int x, int y, int radius, Biome... biomes) {
super(board, x, y, radius); super(board, x, y, radius);
TileOrientation[] sides = TileOrientation.values(); 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) { public Tile(Board board, int x, int y, int radius) {
super(board, x, y, radius); super(board, x, y, radius);
this.assignRandomBiomes(); 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) { public Tile(Board board, Point center, int radius, Biome... biomes) {
this(board, center.x, center.y, radius, 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) { public Tile(Board board, Point center, int radius) {
this(board, center.x, center.y, 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) { public void setBiomes(Biome... biomes) {
TileOrientation[] sides = TileOrientation.values(); TileOrientation[] sides = TileOrientation.values();
for (int i = 0; i < sides.length; i++) { 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() { public void assignRandomBiomes() {
Game game = this.getBoard().getGame(); Game game = this.getBoard().getGame();
Biome[] biomes = Biome.values(); 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) { public Biome getBiome(TileOrientation side) {
return this.sideBiomes.get(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() { private Biome getDominantBiome() {
TileOrientation[] sides = TileOrientation.values(); TileOrientation[] sides = TileOrientation.values();
@@ -150,11 +105,7 @@ public class Tile extends Cell {
return null; 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() { public Biome[] getBiomes() {
Biome[] biomes = new Biome[TileOrientation.values().length]; Biome[] biomes = new Biome[TileOrientation.values().length];
for (TileOrientation side : TileOrientation.values()) { for (TileOrientation side : TileOrientation.values()) {
@@ -163,11 +114,7 @@ public class Tile extends Cell {
return biomes; 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) { public void rotate(boolean clockwise) {
TileOrientation[] sides = TileOrientation.values(); TileOrientation[] sides = TileOrientation.values();
HashMap<TileOrientation, Biome> newBiomesMap = new HashMap<>(); HashMap<TileOrientation, Biome> newBiomesMap = new HashMap<>();
@@ -182,12 +129,7 @@ public class Tile extends Cell {
this.repaint(); 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) { public boolean containsBiome(Biome biome) {
for (TileOrientation side : TileOrientation.values()) { for (TileOrientation side : TileOrientation.values()) {
if (this.getBiome(side) == biome) { if (this.getBiome(side) == biome) {
@@ -197,13 +139,23 @@ public class Tile extends Cell {
return false; return false;
} }
/** public boolean isAdjacentTo(Tile otherTile) {
* Récupère le côté de la tuile en fonction de la position (x, y) relative. // Get the radius of the tiles
* int tileRadius = this.getRadius();
* @param x La position x
* @param y La position y // Compute the distance between the center of this tile and the other tile
* @return Le côté de la tuile correspondant 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) { private TileOrientation determineSide(int x, int y) {
int radius = this.getRadius(); int radius = this.getRadius();
TileOrientation[] sides = TileOrientation.values(); TileOrientation[] sides = TileOrientation.values();
@@ -230,15 +182,7 @@ public class Tile extends Cell {
return floorBiome.equals(dominantBiome) ? sides[ceilSide] : sides[floorSide]; 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) { private void drawHexagonRow(Graphics2D g2d, double rowX, double rowY, double radius, int rowLength) {
int gRadius = this.getRadius(); 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 // Appel de la méthode de dessin de la tuile à la nouvelle position
paintTile(g2d, scale); paintTile(g2d, scale);
// Restauration de l'état graphique (annule le déplacement)
g2d.dispose(); g2d.dispose();
} }