diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index e7c14c967db39f34f8355a4f2dfb8182b8d24ed8..cf042868aaad396297f8fd541f4668f2819d4134 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -19,7 +19,7 @@ public class SimulatorApplication extends javafx.application.Application { private static final int BOX_HEIGHT = 50; public static final int INITIAL_FIRE_COUNT = 15; public static final int INITIAL_FIREFIGHTER_COUNT = 10; - public static final int INITIAL_CLOUD_COUNT = 1; + public static final int INITIAL_CLOUD_COUNT = 5; private Stage primaryStage; diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index d31f549065a0f4187e222364a6025766ee8c27d1..0c9dfb7942e6772ea0f6c2dae5c83127312c8716 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -82,15 +82,19 @@ public class Controller { } private ViewElement getViewElement(List<ModelElement> squareState) { - if(squareState.contains(ModelElement.FIREFIGHTER)){ + if (squareState.contains(ModelElement.FIREFIGHTER)) { return ViewElement.FIREFIGHTER; } - if (squareState.contains(ModelElement.FIRE)){ + if (squareState.contains(ModelElement.FIRE)) { return ViewElement.FIRE; } + if (squareState.contains(ModelElement.CLOUD)) { // Assurez-vous que le modèle inclut bien le nuage + return ViewElement.CLOUD; + } return ViewElement.EMPTY; } + private void initializeTimeline() { Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS); EventHandler<ActionEvent> eventHandler = diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java index cbda767167a71d5dfb2902d1c8c466ccc56ac47a..b517e5010a5a0a9d7447c3d0a18e93cf0e7df848 100644 --- a/src/main/java/model/Cloud.java +++ b/src/main/java/model/Cloud.java @@ -4,19 +4,19 @@ import util.Position; public class Cloud { - private Position position; - public Cloud(Position position){ + public Cloud(Position position) { this.position = position; } - public Position getPosition() { return position; } - + public void setPosition(Position position) { + this.position = position; + } } diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 224f0ba0ccb6858f742b74749383856de42cd3b9..b60c9ae13f8c843e33f8167fce5390221e548481 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -70,6 +70,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> { for (int index = 0; index < initialFirefighterCount; index++) { firefighters.add(new FireFighter(randomPosition())); } + for (int index = 0; index < initialCloudCount; index++) { + clouds.add(new Cloud(randomPosition())); + } + } private Position randomPosition() { @@ -79,13 +83,38 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @Override public List<ModelElement> getState(Position position) { List<ModelElement> result = new ArrayList<>(); + for (FireFighter firefighter : firefighters) { if (firefighter.getPosition().equals(position)) result.add(ModelElement.FIREFIGHTER); } if (fires.containsKey(position)) result.add(ModelElement.FIRE); + + for (Cloud cloud : clouds) { + if (cloud.getPosition().equals(position)) result.add(ModelElement.CLOUD); + } return result; } + private List<Position> updateClouds() { + List<Position> modifiedPositions = new ArrayList<>(); + for (Cloud cloud : clouds) { + Position currentPosition = cloud.getPosition(); + Position newPosition = randomNeighbor(currentPosition); + cloud.setPosition(newPosition); + modifiedPositions.add(currentPosition); + modifiedPositions.add(newPosition); + + + extinguish(newPosition); + } + return modifiedPositions; + } + private Position randomNeighbor(Position position) { + List<Position> neighborPositions = neighbors.get(position); + return neighborPositions.get(randomGenerator.nextInt(neighborPositions.size())); + } + + @Override public int rowCount() { return rowCount; @@ -98,20 +127,22 @@ public class FirefighterBoard implements Board<List<ModelElement>> { public List<Position> updateToNextGeneration() { List<Position> modifiedPositions = updateFirefighters(); + modifiedPositions.addAll(updateClouds()); modifiedPositions.addAll(updateFires()); step++; return modifiedPositions; } + private List<Position> updateFires() { List<Position> modifiedPositions = new ArrayList<>(); if (step % 2 == 0) { Set<Position> newFirePositions = new HashSet<>(); - for (Position fire : new HashSet<>(fires.keySet())) { // Utilisez une copie de la clé + for (Position fire : new HashSet<>(fires.keySet())) { newFirePositions.addAll(neighbors.get(fire)); } for (Position position : newFirePositions) { - if (!fires.containsKey(position)) { // Vérifiez si le feu est nouveau + if (!fires.containsKey(position)) { fires.put(position, new Fire(position)); modifiedPositions.add(position); } @@ -121,6 +152,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } + @Override public int stepNumber() { return step; @@ -132,15 +164,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> { Position currentPosition = firefighter.getPosition(); Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, fires.keySet(), neighbors); - // Déplacement du pompier firefighter.setPosition(newPosition); modifiedPositions.add(currentPosition); modifiedPositions.add(newPosition); - // Éteindre le feu à la nouvelle position extinguish(newPosition); - // Éteindre les feux voisins for (Position neighbor : neighbors.get(newPosition)) { extinguish(neighbor); modifiedPositions.add(neighbor); diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java index 759eee5e54c3a39472d8f7defbbbe6a2b67b8f00..4613ca6034c1e7c76df1da76a87982b8fee1d716 100644 --- a/src/main/java/model/ModelElement.java +++ b/src/main/java/model/ModelElement.java @@ -1,5 +1,8 @@ package model; public enum ModelElement { - FIREFIGHTER, FIRE + FIREFIGHTER, + FIRE, + CLOUD; } + diff --git a/src/main/java/view/FirefighterGrid.java b/src/main/java/view/FirefighterGrid.java index 4c9041f034ec9a4eb07ce4334de237f1e99ccdc9..d97172feb8bf89f80db96a41d50451151c96a184 100644 --- a/src/main/java/view/FirefighterGrid.java +++ b/src/main/java/view/FirefighterGrid.java @@ -10,8 +10,10 @@ import java.util.List; public class FirefighterGrid extends Canvas implements Grid<ViewElement>{ private void paintElementAtPosition(ViewElement element, Position position) { + System.out.println("Painting " + element + " at " + position); paintBox(position.row(), position.column(), element.color); } + private int boxWidth; private int boxHeight; private int columnCount; diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java index ffb76112e1af543df5af41fa906082ef11be9967..d3e00087e1a9d4e18edfcdbe07eb8be83adb16b3 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.BLUE), FIRE(Color.RED), EMPTY(Color.WHITE); + FIREFIGHTER(Color.BLUE), FIRE(Color.RED),CLOUD(Color.LIGHTSKYBLUE), EMPTY(Color.WHITE); final Color color; ViewElement(Color color) { this.color = color;