meilleure génération des tuiles

This commit is contained in:
Vincent TEISSIER 2024-10-25 00:59:58 +02:00
parent 5775b6555d
commit abc4da1bed
43 changed files with 85 additions and 47 deletions

BIN
bin/Main.class Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/main/Main.class Normal file

Binary file not shown.

BIN
bin/model/MenuModel.class Normal file

Binary file not shown.

Binary file not shown.

BIN
bin/view/BtnPerso.class Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/view/MenuView.class Normal file

Binary file not shown.

BIN
src/main/bin/Main.class Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -3,47 +3,62 @@ package model;
import java.util.Random;
public class Tile {
private TerrainType[] terrains; // 4 terrains pour chaque quart de la tuile
private TerrainType[] terrains; // 2 terrains maximum par tuile
private int segmentsForTerrain1; // Nombre de segments pour le premier terrain
private static final Random random = new Random();
public Tile() {
this.terrains = new TerrainType[4];
this.terrains = new TerrainType[2]; // Seulement deux terrains
generateTerrains();
assignSegments();
}
// Génère des terrains aléatoires pour les 4 parties
// Génère deux terrains aléatoires pour la tuile
private void generateTerrains() {
for (int i = 0; i < 4; i++) {
terrains[i] = generateRandomTerrain();
terrains[0] = generateRandomTerrain();
terrains[1] = generateRandomTerrain();
// Assure que les deux terrains sont différents
while (terrains[0] == terrains[1]) {
terrains[1] = generateRandomTerrain();
}
}
// Génère un terrain aléatoire selon certaines probabilités
private TerrainType generateRandomTerrain() {
int rand = random.nextInt(100); // Pourcentage pour chaque terrain
// Assigner le nombre de segments pour chaque terrain avec plus de diversité
private void assignSegments() {
// Terrain 1 occupe entre 1 et 5 segments, le reste pour le terrain 2
this.segmentsForTerrain1 = random.nextInt(5) + 1;
}
if (rand < 20) {
return TerrainType.MER; // 20% MER
} else if (rand < 40) {
return TerrainType.CHAMP; // 20% CHAMP
} else if (rand < 60) {
// Génère un terrain aléatoire avec plus de variété dans les probabilités
private TerrainType generateRandomTerrain() {
int rand = random.nextInt(100);
if (rand < 15) {
return TerrainType.MER; // 15% MER
} else if (rand < 30) {
return TerrainType.CHAMP; // 15% CHAMP
} else if (rand < 50) {
return TerrainType.PRE; // 20% PRE
} else if (rand < 80) {
return TerrainType.FORET; // 20% FORET
} else if (rand < 75) {
return TerrainType.FORET; // 25% FORET
} else {
return TerrainType.MONTAGNE; // 20% MONTAGNE
return TerrainType.MONTAGNE; // 25% MONTAGNE
}
}
public TerrainType getTerrain(int index) {
if (index >= 0 && index < 4) {
if (index >= 0 && index < 2) {
return terrains[index];
}
return null;
}
@Override
public String toString() {
return "Terrains : " + terrains[0] + ", " + terrains[1] + ", " + terrains[2] + ", " + terrains[3];
public int getSegmentsForTerrain(int index) {
if (index == 0) {
return segmentsForTerrain1; // Nombre de segments pour le premier terrain
} else {
return 6 - segmentsForTerrain1; // Le reste pour le second terrain
}
}
}

@ -1,6 +1,8 @@
package view;
import controller.GameController;
import controller.CameraController;
import controller.GameContext;
import model.Tile;
import javax.swing.*;
@ -16,14 +18,13 @@ public class GameView extends JFrame {
private Map<Point, HexagonTile> hexagonMap;
private Set<Point> availablePositions;
private Tile nextTile;
private HexagonTile nextTilePreview; // Tuile de prévisualisation à droite
private int tileCount;
private HexagonTile nextTilePreview;
private GameController gameController;
private CameraController cameraController;
public GameView() {
this.hexagonMap = new HashMap<>();
this.availablePositions = new HashSet<>();
this.tileCount = 0;
setTitle("Jeu de Tuiles");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@ -34,21 +35,29 @@ public class GameView extends JFrame {
// Créer la grille d'hexagones à gauche
gridPanel = createHexagonGrid();
JScrollPane scrollPane = new JScrollPane(gridPanel);
scrollPane.setPreferredSize(new Dimension(600, 600));
add(scrollPane, BorderLayout.CENTER);
gridPanel.setLayout(null); // Permet de placer les éléments sans layout manager
gridPanel.setPreferredSize(new Dimension(800, 800)); // Taille de la grille adaptée
// Ajout de la grille sans JScrollPane
add(gridPanel, BorderLayout.CENTER);
// Créer le panneau de contrôle à droite
JPanel controlPanel = createControlPanel();
controlPanel.setPreferredSize(new Dimension(200, 600)); // Taille fixe pour le panneau de contrôle
add(controlPanel, BorderLayout.EAST);
// Initialiser le contrôleur
// Initialiser GameContext
GameContext context = new GameContext(hexagonMap, gameController, availablePositions, cameraController);
// Initialiser le contrôleur du jeu avec le contexte
gameController = new GameController(hexagonMap, availablePositions, gridPanel, nextTile, nextTilePreview);
// Placer la première tuile au centre
// Initialiser le contrôleur de la souris pour le glissement de la grille avec le contexte
cameraController = new CameraController(gridPanel, context);
// Placer la première tuile au centre en passant CameraController
Point initialPosition = new Point(0, 0);
gameController.placeInitialTile(initialPosition);
centerScrollOnPosition(initialPosition, scrollPane);
gameController.placeInitialTile(initialPosition, cameraController);
pack();
setLocationRelativeTo(null);
@ -56,29 +65,31 @@ public class GameView extends JFrame {
}
private JPanel createHexagonGrid() {
return new HexagonGridPanel();
JPanel panel = new JPanel();
panel.setLayout(null); // Layout libre pour placer les hexagones
panel.setBackground(Color.WHITE); // S'assurer que le fond est blanc pour mieux voir les hexagones
panel.setPreferredSize(new Dimension(1000, 1000)); // Taille initiale suffisamment grande
return panel;
}
private Tile generateRandomTile() {
return new Tile();
}
private void centerScrollOnPosition(Point position, JScrollPane scrollPane) {
int xCenter = position.x * 50 * 3 / 2;
int yCenter = position.y * (int) (Math.sqrt(3) * 50);
scrollPane.getViewport().setViewPosition(new Point(xCenter - scrollPane.getViewport().getWidth() / 2,
yCenter - scrollPane.getViewport().getHeight() / 2));
}
private JPanel createControlPanel() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBackground(Color.LIGHT_GRAY); // Améliorer la visibilité du panneau de contrôle
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // Ajout d'espacement interne
panel.add(new JLabel("Prochaine tuile : "));
panel.add(Box.createRigidArea(new Dimension(0, 10)));
// Afficher la prévisualisation de la prochaine tuile
nextTilePreview = new HexagonTile(null);
nextTilePreview.setPreferredSize(new Dimension(100, 100));
nextTilePreview.setPreferredSize(new Dimension(150, 150)); // Augmenter la taille pour la prévisualisation
nextTilePreview.setBackground(Color.GRAY);
nextTilePreview.setOpaque(true); // Rendre le fond opaque pour une meilleure visibilité
nextTilePreview.setTile(nextTile);
panel.add(nextTilePreview);

@ -45,8 +45,8 @@ public class HexagonTile extends JPanel {
g2d.setClip(largeHexagon);
if (tile != null) {
// Dessiner les 4 quadrants de terrain
drawTerrainQuadrants(g2d, centerX, centerY, largeRadius);
// Dessiner les 6 segments de terrain en fonction des proportions
drawTerrainSegments(g2d, centerX, centerY, largeRadius);
} else {
g2d.setColor(Color.LIGHT_GRAY); // Couleur par défaut pour une case vide
g2d.fill(largeHexagon);
@ -59,11 +59,19 @@ public class HexagonTile extends JPanel {
g2d.draw(largeHexagon);
}
// Dessiner les 4 quadrants de terrain
private void drawTerrainQuadrants(Graphics2D g2d, int centerX, int centerY, int radius) {
for (int i = 0; i < 4; i++) {
g2d.setColor(getTerrainColor(tile.getTerrain(i)));
g2d.fillArc(centerX - radius, centerY - radius, 2 * radius, 2 * radius, 90 * i, 90);
// Dessiner les 6 segments de terrain avec une répartition variée
private void drawTerrainSegments(Graphics2D g2d, int centerX, int centerY, int radius) {
// Déterminer combien de segments sont attribués à chaque terrain
int segmentsTerrain1 = tile.getSegmentsForTerrain(0);
// Dessiner les segments adjacents pour chaque terrain
for (int i = 0; i < 6; i++) {
if (i < segmentsTerrain1) {
g2d.setColor(getTerrainColor(tile.getTerrain(0))); // Premier terrain
} else {
g2d.setColor(getTerrainColor(tile.getTerrain(1))); // Deuxième terrain
}
g2d.fillArc(centerX - radius, centerY - radius, 2 * radius, 2 * radius, 60 * i, 60);
}
}
@ -86,6 +94,10 @@ public class HexagonTile extends JPanel {
// Obtenir la couleur en fonction du type de terrain
private Color getTerrainColor(TerrainType terrain) {
if (terrain == null) {
return Color.WHITE; // Par défaut si le terrain est nul
}
switch (terrain) {
case MER:
return Color.BLUE;

@ -25,7 +25,7 @@ public class MenuView extends JComponent {
panelCoté.setBackground(new Color(243,171,115,150));
panelCoté.setPreferredSize(new Dimension(300,0));
backgroundImage = new ImageIcon("\\\\wsl.localhost\\Ubuntu-24.04\\home\\topb\\DEV\\SAE31_2024\\src\\main\\java\\view\\img\\bg.png").getImage();
backgroundImage = new ImageIcon("./view/img/bg.png").getImage();
logo = new ImageIcon("\\\\wsl.localhost\\Ubuntu-24.04\\home\\topb\\DEV\\SAE31_2024\\src\\main\\java\\view\\img\\D.png");
quit = new ImageIcon("\\\\wsl.localhost\\Ubuntu-24.04\\home\\topb\\DEV\\SAE31_2024\\src\\main\\java\\view\\img\\quit.png");
Image quit1 = quit.getImage();