resolution problème de tuiles

This commit is contained in:
Lenny FOULOU
2024-11-19 21:50:14 +01:00
parent e7f3da2d68
commit 42c52e011c
4 changed files with 59 additions and 46 deletions

View File

@@ -3,24 +3,30 @@ package model;
public class Tile { public class Tile {
private final Terrain terrain1; private final Terrain terrain1;
private final Terrain terrain2; private final Terrain terrain2;
private final int terrain1Sides; // Nombre de côtés attribués à terrain1 (1, 2 ou 3)
// Constructeur pour une tuile avec un ou deux terrains public Tile(Terrain terrain1, Terrain terrain2, int terrain1Sides) {
public Tile(Terrain terrain1, Terrain terrain2) {
this.terrain1 = terrain1; this.terrain1 = terrain1;
this.terrain2 = terrain2; this.terrain2 = terrain2;
this.terrain1Sides = terrain1Sides;
} }
// Getter pour terrain1
public Terrain getTerrain1() { public Terrain getTerrain1() {
return terrain1; return terrain1;
} }
// Getter pour terrain2
public Terrain getTerrain2() { public Terrain getTerrain2() {
return terrain2; return terrain2;
} }
// Vérifie si la tuile contient un seul terrain public int getTerrain1Sides() {
return terrain1Sides;
}
public int getTerrain2Sides() {
return 6 - terrain1Sides; // Le reste des côtés
}
public boolean hasSingleTerrain() { public boolean hasSingleTerrain() {
return terrain2 == null; return terrain2 == null;
} }

View File

@@ -9,14 +9,23 @@ public class TileGenerator {
this.random = new Random(seed); this.random = new Random(seed);
} }
// Générer une tuile avec un ou deux terrains
public Tile generateRandomTile() { public Tile generateRandomTile() {
// Générer un terrain aléatoire
Terrain terrain1 = Terrain.values()[random.nextInt(Terrain.values().length)]; Terrain terrain1 = Terrain.values()[random.nextInt(Terrain.values().length)];
if (random.nextBoolean()) { // 50% chance d'avoir un seul terrain
return new Tile(terrain1, null, 6); // Toutes les faces au même terrain
}
// Décider si la tuile a un seul terrain ou deux Terrain terrain2;
Terrain terrain2 = random.nextBoolean() ? Terrain.values()[random.nextInt(Terrain.values().length)] : null; do {
terrain2 = Terrain.values()[random.nextInt(Terrain.values().length)];
} while (terrain2 == terrain1); // Assurer deux terrains différents
return new Tile(terrain1, terrain2); int terrain1Sides = switch (random.nextInt(3)) { // 0, 1 ou 2 -> 1+5, 2+4, 3+3
case 0 -> 1;
case 1 -> 2;
default -> 3;
};
return new Tile(terrain1, terrain2, terrain1Sides);
} }
} }

View File

@@ -17,6 +17,7 @@ public class GameView extends JFrame {
private final int hexWidth = (int) (Math.sqrt(3) * hexRadius); // Largeur d'un hexagone private final int hexWidth = (int) (Math.sqrt(3) * hexRadius); // Largeur d'un hexagone
private final int hexHeight = 2 * hexRadius; // Hauteur d'un hexagone private final int hexHeight = 2 * hexRadius; // Hauteur d'un hexagone
public GameView(Board board, long seed) { public GameView(Board board, long seed) {
this.board = board; this.board = board;
this.tileGenerator = new TileGenerator(seed); // Initialisation avec la seed this.tileGenerator = new TileGenerator(seed); // Initialisation avec la seed
@@ -59,43 +60,40 @@ public class GameView extends JFrame {
int r = hexRadius; int r = hexRadius;
int h = (int) (Math.sqrt(3) / 2 * r); int h = (int) (Math.sqrt(3) / 2 * r);
// Coordonnées des sommets
int[] xPoints = {x + r, x + r / 2, x - r / 2, x - r, x - r / 2, x + r / 2}; int[] xPoints = {x + r, x + r / 2, x - r / 2, x - r, x - r / 2, x + r / 2};
int[] yPoints = {y, y + h, y + h, y, y - h, y - h}; int[] yPoints = {y, y + h, y + h, y, y - h, y - h};
if (tile.hasSingleTerrain()) { if (tile.hasSingleTerrain()) {
// Une seule couleur : remplir tout l'hexagone
g.setColor(getColorForTerrain(tile.getTerrain1())); g.setColor(getColorForTerrain(tile.getTerrain1()));
g.fillPolygon(xPoints, yPoints, 6); g.fillPolygon(xPoints, yPoints, 6);
} else { } else {
// Deux terrains : Diviser l'hexagone en deux moitiés // Deux terrains : appliquer la répartition spécifique
int terrain1Sides = tile.getTerrain1Sides();
Color color1 = getColorForTerrain(tile.getTerrain1()); Color color1 = getColorForTerrain(tile.getTerrain1());
Color color2 = getColorForTerrain(tile.getTerrain2()); Color color2 = getColorForTerrain(tile.getTerrain2());
// Premier terrain (moitié supérieure) for (int i = 0; i < 6; i++) {
g.setColor(color1); int next = (i + 1) % 6; // Prochain point
g.fillPolygon(
new int[]{xPoints[0], xPoints[1], xPoints[2], xPoints[3]},
new int[]{yPoints[0], yPoints[1], yPoints[2], yPoints[3]},
4
);
// Deuxième terrain (moitié inférieure) if (i < terrain1Sides) {
g.setColor(color1);
} else {
g.setColor(color2); g.setColor(color2);
g.fillPolygon(
new int[]{xPoints[3], xPoints[4], xPoints[5], xPoints[0]},
new int[]{yPoints[3], yPoints[4], yPoints[5], yPoints[0]},
4
);
} }
// Contour de l'hexagone g.fillPolygon(
new int[]{x, xPoints[i], xPoints[next]},
new int[]{y, yPoints[i], yPoints[next]},
3
);
}
}
g.setColor(Color.BLACK); g.setColor(Color.BLACK);
g.drawPolygon(xPoints, yPoints, 6); g.drawPolygon(xPoints, yPoints, 6);
} }
// Dans la classe GameView.java // Dans la classe GameView.java
private Color getColorForTerrain(Terrain terrain) { private Color getColorForTerrain(Terrain terrain) {
if (terrain == null) { if (terrain == null) {

Binary file not shown.