diff --git a/.gradle/8.10.2/executionHistory/executionHistory.bin b/.gradle/8.10.2/executionHistory/executionHistory.bin index 258dac4ebb4688af1595b78935cac62b354c5f44..11bf550ba77e9f78efd401a6ec26338b1fac3249 100644 Binary files a/.gradle/8.10.2/executionHistory/executionHistory.bin and b/.gradle/8.10.2/executionHistory/executionHistory.bin differ diff --git a/.gradle/8.10.2/executionHistory/executionHistory.lock b/.gradle/8.10.2/executionHistory/executionHistory.lock index 4183dedaae5296d826df03e9deec85e1598a610b..dac92f57548c665f37e15c04f78feba376879cd2 100644 Binary files a/.gradle/8.10.2/executionHistory/executionHistory.lock and b/.gradle/8.10.2/executionHistory/executionHistory.lock differ diff --git a/.gradle/8.10.2/fileHashes/fileHashes.bin b/.gradle/8.10.2/fileHashes/fileHashes.bin index 85a7f8f9d153d181a070bf19d7ed561221db400e..e9fad2f6bcfd39c3b27f49abca2b0dcc20b0fac5 100644 Binary files a/.gradle/8.10.2/fileHashes/fileHashes.bin and b/.gradle/8.10.2/fileHashes/fileHashes.bin differ diff --git a/.gradle/8.10.2/fileHashes/fileHashes.lock b/.gradle/8.10.2/fileHashes/fileHashes.lock index 88ad37ae3bc8ad3ce89f4d66df6309eb6bd2583f..26e1d0321598155df152cbf5c7712a003606b051 100644 Binary files a/.gradle/8.10.2/fileHashes/fileHashes.lock and b/.gradle/8.10.2/fileHashes/fileHashes.lock differ diff --git a/.gradle/8.10.2/fileHashes/resourceHashesCache.bin b/.gradle/8.10.2/fileHashes/resourceHashesCache.bin index 42c05b4bab676628bd5ab004bcfbf2c0323d1145..7a4b916756e0e3aa6a61e0e514fc79c039d6db72 100644 Binary files a/.gradle/8.10.2/fileHashes/resourceHashesCache.bin and b/.gradle/8.10.2/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index faa428ff1d91794eee99a8fa0404b0c22b3d5d17..e5c2ce6b62b46b091c65457a8a7b7c6273c14acb 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/build/classes/java/main/model/BoardFireFighterBehavior.class b/build/classes/java/main/model/BoardFireFighterBehavior.class index cc5d3fe274ea94156143b99a0e3978ab018d05d0..3e74039d1db131823cc7bf55e8726d520926bf0a 100644 Binary files a/build/classes/java/main/model/BoardFireFighterBehavior.class and b/build/classes/java/main/model/BoardFireFighterBehavior.class differ diff --git a/build/classes/java/main/model/FirefighterBoard.class b/build/classes/java/main/model/FirefighterBoard.class index ebf0c3e8c4205ef081bcca66d853272df961b674..5668462328eb03a346c50effd0ac3994bc3a02a7 100644 Binary files a/build/classes/java/main/model/FirefighterBoard.class and b/build/classes/java/main/model/FirefighterBoard.class differ diff --git a/build/classes/java/main/view/ViewElement.class b/build/classes/java/main/view/ViewElement.class index 86a80df8170c6a9d79066186cd5255f7bbbbe0c8..1e8628999cc6101c22f3f65568027fa8214a343a 100644 Binary files a/build/classes/java/main/view/ViewElement.class and b/build/classes/java/main/view/ViewElement.class differ diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index e96d759e4acbb4033422ca03cceed662e81e8123..a6a40cfe8ade29066b0b07d44bd5acba8dc9c2fc 100644 Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/src/main/java/model/BoardFireFighterBehavior.java b/src/main/java/model/BoardFireFighterBehavior.java index 0cbbaf91b1f847f4c2e1e7cd5eabca5c5634c82c..f338a758a6aa99f869db2a9a8cf83c5649c6f1c9 100644 --- a/src/main/java/model/BoardFireFighterBehavior.java +++ b/src/main/java/model/BoardFireFighterBehavior.java @@ -18,6 +18,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{ static Movements fireFighterMovements; static Movements cloudMovements; static Movements motorizedMovements; + private ElementGenerator moutainGenerator; public BoardFireFighterBehavior(Map<Position, List<Position>> neighbors, ElementFactory<Fire> fireFactory ,ElementFactory<FireFighter> firefighterFactory, ElementFactory<Cloud> cloudFactory,ElementFactory<MotorizedFireFighter> motorizedFactory,ElementFactory<Rocky> rockyFactory) { @@ -28,6 +29,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{ fireFighterMovements=new FireFighterMovements(firefighterFactory); cloudMovements=new CloudMovements(cloudFactory); motorizedMovements=new MotorizedMovements(motorizedFactory); + moutainGenerator=new MountainGenerator(); } public void initializeElements(int rowCount, int columnCount) { @@ -43,7 +45,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{ rocky.add(rockyElement.getPosition()); } - generateMountainBlocks(rowCount, columnCount); + moutainGenerator.generateElement(rowCount,columnCount); generateRoads(rowCount,columnCount); } @@ -55,12 +57,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{ public static void extinguish(Position position) { fireMovements.getPositions().remove(position); - // Si la position est une montagne, elle cesse d'être une montagne - if (rocky.contains(position)) { - rocky.remove(position); - terrainMap.remove(position); // Optionnel, si vous utilisez terrainMap pour gérer les types de terrain - System.out.println("Une montagne a brûlé à la position : " + position); - } + } @@ -105,53 +102,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{ } - public Collection<Position> getCloudPositions() { - return cloudMovements.getPositions(); - } - - public List<Position> getMotorizedFighters() { - return (List<Position>) motorizedMovements.getPositions(); - } - private void generateMountainBlocks(int rowCount, int columnCount) { - Random random = new Random(); - int maxMountains = 5; // Par exemple, générer 5 blocs de montagnes - int blockSize = 4; // Taille du bloc de montagnes (4 cases) - - for (int i = 0; i < maxMountains; i++) { - // Générer un coin aléatoire pour chaque bloc de montagne (en s'assurant que les blocs ne dépassent pas la grille) - int startRow = random.nextInt(rowCount - 1); // -1 pour éviter le débordement - int startCol = random.nextInt(columnCount - 1); - - // Vérifier si les cases sont libres avant d'y placer une montagne - if (canPlaceMountainBlock(startRow, startCol)) { - // Placer les montagnes sur la grille - placeMountainBlock(startRow, startCol); - } - } - } - - private boolean canPlaceMountainBlock(int startRow, int startCol) { - // Vérifier si les 4 cases sont libres - for (int row = startRow; row < startRow + 2; row++) { - for (int col = startCol; col < startCol + 2; col++) { - Position pos = new Position(row, col); - if (terrainMap.containsKey(pos)) { - return false; // Une case est déjà occupée - } - } - } - return true; // Toutes les cases sont libres - } - private void placeMountainBlock(int startRow, int startCol) { - // Placer les 4 cases de montagne - for (int row = startRow; row < startRow + 2; row++) { - for (int col = startCol; col < startCol + 2; col++) { - Position pos = new Position(row, col); - terrainMap.put(pos, new Mountain(pos)); - } - } - } /** * Éteint les feux à proximité d'une position donnée. * @@ -170,7 +121,7 @@ public class BoardFireFighterBehavior implements BoardBehavior{ } } - public Map<Position, Terrain> getTerrainMap() { + public static Map<Position, Terrain> getTerrainMap() { return terrainMap; } public static boolean canMoveTo(Position position, Set<Position> firePositions, List<Position> firefighterPositions) { @@ -180,15 +131,10 @@ public class BoardFireFighterBehavior implements BoardBehavior{ } // Si la position est occupée par un feu et que le terrain n'est pas traversable par le feu - if (firePositions.contains(position)) { - return false; // Impossible de traverser une case contenant un feu - } - - // Si la position est occupée par un pompier et que le pompier ne peut pas franchir - if (firefighterPositions.contains(position)) { - return false; // Impossible de se déplacer sur la position d'un autre pompier + if(cloudMovements.getPositions().contains(position)) + { + return false; } - // Si la position est une montagne, aucun élément ne peut la franchir sauf les nuages if (terrainMap.get(position) != null && !cloudMovements.getPositions().contains(position)) { return false; // Impossible de franchir une montagne, sauf pour un nuage @@ -275,4 +221,13 @@ public class BoardFireFighterBehavior implements BoardBehavior{ public static Collection<Position> getFirefighterPositions() { return fireFighterMovements.getPositions(); } + + public Collection<Position> getCloudPositions() { + return cloudMovements.getPositions(); + } + + public List<Position> getMotorizedFighters() { + return (List<Position>) motorizedMovements.getPositions(); + } + } diff --git a/src/main/java/model/CloudMovements.java b/src/main/java/model/CloudMovements.java index 5e186aaebc89973da5229f2fa539cea959e6fa38..849db9f5b5ffcd840c23c83cde35088a6ae2c8c2 100644 --- a/src/main/java/model/CloudMovements.java +++ b/src/main/java/model/CloudMovements.java @@ -29,30 +29,39 @@ public class CloudMovements implements Movements{ List<Position> modifiedPositions = new ArrayList<>(); List<Position> newCloudPositions = new ArrayList<>(); + // Copier les positions actuelles des feux pour éviter les incohérences pendant l'itération + Set<Position> firePositions = new HashSet<>(fireMovements.getPositions()); + for (Position cloudPosition : cloudPositions) { - // Déplacement aléatoire + // Déplacement aléatoire parmi les voisins List<Position> possibleMoves = getNeighbors().get(cloudPosition); Position newCloudPosition = possibleMoves.get(new Random().nextInt(possibleMoves.size())); - // Vérification que le nuage ne se déplace pas vers une montagne - if (!canMoveTo(newCloudPosition, (Set<Position>) fireMovements.getPositions(), (List<Position>) fireFighterMovements.getPositions())) { - continue; // Si la position est invalide ou une montagne, le nuage reste sur place + // Vérification que le nuage ne se déplace pas vers une montagne ou une position invalide + if (!canMoveTo(newCloudPosition, firePositions, (List<Position>) getFirefighterPositions())) { + newCloudPositions.add(cloudPosition); // Le nuage reste sur place + continue; } + // Ajouter la nouvelle position du nuage newCloudPositions.add(newCloudPosition); - // Éteindre le feu à la position du nuage (le nuage mange le feu) - if (fireMovements.getPositions().contains(newCloudPosition)) { - extinguish(newCloudPosition); // Supprimer le feu - modifiedPositions.add(newCloudPosition); // Ajouter la position du feu éteint aux positions modifiées - System.out.println("Feu éteint par nuage à : " + newCloudPosition); + // Si la nouvelle position contient un feu, l'éteindre + if (firePositions.contains(newCloudPosition)) { + extinguish(newCloudPosition); // Extinction du feu + firePositions.remove(newCloudPosition); // Mise à jour locale des positions des feux + modifiedPositions.add(newCloudPosition); + System.out.println("Feu éteint par un nuage à : " + newCloudPosition); } - modifiedPositions.add(cloudPosition); // Ajouter l'ancienne position du nuage - modifiedPositions.add(newCloudPosition); // Ajouter la nouvelle position du nuage + // Ajouter les positions modifiées pour le nuage + modifiedPositions.add(cloudPosition); + modifiedPositions.add(newCloudPosition); } + // Mise à jour des positions des nuages cloudPositions = newCloudPositions; + return modifiedPositions; } diff --git a/src/main/java/model/MountainGenerator.java b/src/main/java/model/MountainGenerator.java index 789b177a3a553a3f2eb6b6ab2659c644a7f41ada..dd98994fd367290a380a1e7a0f1341eedf53bfd6 100644 --- a/src/main/java/model/MountainGenerator.java +++ b/src/main/java/model/MountainGenerator.java @@ -1,8 +1,51 @@ package model; +import util.Position; + +import java.util.Random; + +import static model.BoardFireFighterBehavior.getTerrainMap; + public class MountainGenerator implements ElementGenerator{ @Override public void generateElement(int rowCount, int columnCount) { + Random random = new Random(); + int maxMountains = 5; // Par exemple, générer 5 blocs de montagnes + int blockSize = 4; // Taille du bloc de montagnes (4 cases) + + for (int i = 0; i < maxMountains; i++) { + // Générer un coin aléatoire pour chaque bloc de montagne (en s'assurant que les blocs ne dépassent pas la grille) + int startRow = random.nextInt(rowCount - 1); // -1 pour éviter le débordement + int startCol = random.nextInt(columnCount - 1); + + // Vérifier si les cases sont libres avant d'y placer une montagne + if (canPlaceMountainBlock(startRow, startCol)) { + // Placer les montagnes sur la grille + placeMountainBlock(startRow, startCol); + } + } + + } + private boolean canPlaceMountainBlock(int startRow, int startCol) { + // Vérifier si les 4 cases sont libres + for (int row = startRow; row < startRow + 2; row++) { + for (int col = startCol; col < startCol + 2; col++) { + Position pos = new Position(row, col); + if (getTerrainMap().containsKey(pos)) { + return false; // Une case est déjà occupée + } + } + } + return true; // Toutes les cases sont libres + } + private void placeMountainBlock(int startRow, int startCol) { + // Placer les 4 cases de montagne + for (int row = startRow; row < startRow + 2; row++) { + for (int col = startCol; col < startCol + 2; col++) { + Position pos = new Position(row, col); + getTerrainMap().put(pos, new Mountain(pos)); + } + } } } diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java index 642af23a3bfdcd08623f9ed95283535c8c342880..2b61e3d5df546fee4a091256bc1b6e37005b88df 100644 --- a/src/main/java/view/ViewElement.java +++ b/src/main/java/view/ViewElement.java @@ -3,7 +3,7 @@ package view; import javafx.scene.paint.Color; public enum ViewElement { - FIREFIGHTER(Color.AQUA), FIRE(Color.RED), EMPTY(Color.WHITE) , CLOUD(Color.GRAY),MOTORIZED(Color.DARKBLUE) , MOUNTAIN(Color.DARKGRAY), ROCKY(Color.GREEN), + FIREFIGHTER(Color.AQUA), FIRE(Color.RED), EMPTY(Color.WHITE) , CLOUD(Color.PINK),MOTORIZED(Color.DARKBLUE) , MOUNTAIN(Color.DARKGRAY), ROCKY(Color.GREEN), ROAD(Color.BLACK); final Color color; ViewElement(Color color) {