diff --git a/.gradle/8.10.2/executionHistory/executionHistory.bin b/.gradle/8.10.2/executionHistory/executionHistory.bin index 24f92def9427e1eb2fb7fa1d1b80b802329454ce..a8f96d75e06c648f54523535192c0778b5ebbf13 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 b9623e111c2e3519d0d7451ff86d8c40bb498974..82c86cabe8e28e7e1cc8922b1aa181f7d4a721aa 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 e6735fb5271f9b0ac021a90356e43e33b935e1b1..8477a2464b3725af3e04b824f9c1264a39c25f8e 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 1ef521d2fc05d60bf08236e1f7d536db41e93026..3b9fab559fcbf131fd719c12b0635ce3bb71ef8a 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 523eb83b498d61d5ed383b33e97a1e7d6942c023..c8f08e9807b5c74a3c7192f0c0b45de7f17b08b8 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 4010607332a77182bc40b7835e59dd12503bbd11..59300afb8dff4a66b15052eed24bbf756b523406 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/build/classes/java/main/app/SimulatorApplication.class b/build/classes/java/main/app/SimulatorApplication.class index 83f842461bbbc81062b3633e7a0bcc6a515f6fa3..727feaf679c59fc947283e1a9e98fc8f9760413b 100644 Binary files a/build/classes/java/main/app/SimulatorApplication.class and b/build/classes/java/main/app/SimulatorApplication.class differ diff --git a/build/classes/java/main/model/BoardFireFighterBehavior.class b/build/classes/java/main/model/BoardFireFighterBehavior.class index c98e1d5ce384655a278c407abf4fad53ad459ff8..bc326b5aa19727898f4ac7f353a0696dbd3ae8df 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/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index 1152e60afc282930b6f0635125dafd3d642ca116..a722c5845a8b0a1dd2e4f036f32407b625b41c76 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/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index bff0ea47cef5a22420975952fc0c7b4ba1f89bec..8449ea1b5a6ed6f62d3a552b74f5f6c6c07ec895 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -17,7 +17,7 @@ public class SimulatorApplication extends javafx.application.Application { private static final int COLUMN_COUNT = 20; private static final int BOX_WIDTH = 50; private static final int BOX_HEIGHT = 50; - public static final int INITIAL_FIRE_COUNT = 3; + public static final int INITIAL_FIRE_COUNT = 4; public static final int INITIAL_FIREFIGHTER_COUNT = 3; public static final int INITIAL_CLOUD_COUNT = 3; public static final int INITIAL_MOTORIZED_COUNT = 3; diff --git a/src/main/java/model/BoardFireFighterBehavior.java b/src/main/java/model/BoardFireFighterBehavior.java index 4e5debedc6ee6ad8cc8d4f7083b3ecfbda5393f4..f1a4ad96655ce8cf7fa9e5fc3656b11f394b0de3 100644 --- a/src/main/java/model/BoardFireFighterBehavior.java +++ b/src/main/java/model/BoardFireFighterBehavior.java @@ -65,35 +65,68 @@ public class BoardFireFighterBehavior implements BoardBehavior{ List<Position> modifiedPositions = new ArrayList<>(); if (step % 2 == 0) { List<Position> newFirePositions = new ArrayList<>(); + + // Pour chaque feu existant, vérifier ses voisins for (Position fire : firePositions) { - newFirePositions.addAll(neighbors.get(fire)); + // Si la position voisine est libre (non occupée par un feu ou un pompier), le feu peut se propager + for (Position neighbor : neighbors.get(fire)) { + // Vérifier si le feu peut se propager à cette position (pas de feu déjà là et pas un terrain bloqué) + if (canMoveTo(neighbor, firePositions, firefighterPositions) && !firePositions.contains(neighbor)) { + newFirePositions.add(neighbor); + } + } } + + // Ajouter les nouvelles positions de feu à la liste des feux existants firePositions.addAll(newFirePositions); modifiedPositions.addAll(newFirePositions); } return modifiedPositions; } + public List<Position> updateFirefighters() { List<Position> modifiedPositions = new ArrayList<>(); List<Position> newFirefighterPositions = new ArrayList<>(); + for (Position firefighterPosition : firefighterPositions) { + // Calcul de la position vers laquelle le pompier devrait se déplacer Position newFirefighterPosition = targetStrategy.neighborClosestToTarget(firefighterPosition, firePositions, neighbors); - newFirefighterPositions.add(newFirefighterPosition); - extinguish(newFirefighterPosition); - modifiedPositions.add(firefighterPosition); - modifiedPositions.add(newFirefighterPosition); - - List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() - .filter(firePositions::contains).toList(); - for (Position firePosition : neighborFirePositions) { - extinguish(firePosition); + + // Vérification si la position cible est valide pour le mouvement + if (canMoveTo(newFirefighterPosition, firePositions, firefighterPositions)) { + // Si le déplacement est valide, on met à jour la position du pompier + newFirefighterPositions.add(newFirefighterPosition); + + // Éteindre le feu à la nouvelle position + extinguish(newFirefighterPosition); + modifiedPositions.add(firefighterPosition); + modifiedPositions.add(newFirefighterPosition); + + // Vérification des voisins et extinction des feux voisins + List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() + .filter(firePositions::contains).toList(); + + // Log pour débogage + System.out.println("Pompiers se déplacent de " + firefighterPosition + " vers " + newFirefighterPosition); + + // Éteindre les feux voisins + for (Position firePosition : neighborFirePositions) { + extinguish(firePosition); + modifiedPositions.add(firePosition); // Ajout des feux éteints dans la liste des positions modifiées + } + } else { + // Si la position n'est pas valide, le pompier reste sur place + newFirefighterPositions.add(firefighterPosition); + System.out.println("Pompier ne peut pas se déplacer à " + newFirefighterPosition + ", il reste à " + firefighterPosition); } - modifiedPositions.addAll(neighborFirePositions); } + + // Mettre à jour la liste des positions des pompiers firefighterPositions = newFirefighterPositions; return modifiedPositions; } + public List<Position> updateMotorized() { List<Position> modifiedPositions = new ArrayList<>(); List<Position> newPositions = new ArrayList<>(); @@ -201,18 +234,30 @@ public class BoardFireFighterBehavior implements BoardBehavior{ // Déplacement aléatoire List<Position> possibleMoves = neighbors.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, firePositions, firefighterPositions)) { + continue; // Si la position est invalide ou une montagne, le nuage reste sur place + } + newCloudPositions.add(newCloudPosition); - // Éteindre le feu à la position du nuage - extinguish(newCloudPosition); - modifiedPositions.add(cloudPosition); - modifiedPositions.add(newCloudPosition); + // Éteindre le feu à la position du nuage (le nuage mange le feu) + if (firePositions.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); + } + + modifiedPositions.add(cloudPosition); // Ajouter l'ancienne position du nuage + modifiedPositions.add(newCloudPosition); // Ajouter la nouvelle position du nuage } cloudPositions = newCloudPositions; return modifiedPositions; } + public List<Position> getCloudPositions() { return cloudPositions; } @@ -264,5 +309,32 @@ public class BoardFireFighterBehavior implements BoardBehavior{ public Map<Position, Terrain> getTerrainMap() { return terrainMap; } + public boolean canMoveTo(Position position, Set<Position> firePositions, List<Position> firefighterPositions) { + // Vérifie si la position est hors des limites (par exemple, en dehors de la grille ou inaccessible) + if (!neighbors.containsKey(position)) { + return false; + } + + // 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 + } + + // Si la position est une montagne, aucun élément ne peut la franchir sauf les nuages + if (terrainMap.get(position) != null && !cloudPositions.contains(position)) { + return false; // Impossible de franchir une montagne, sauf pour un nuage + } + + return true; // La position est traversable + } + + + + }