diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index e88b0e9856086cc6f53f2782175393dca6365eb6..ed586dc271d54c3c9a83e659492a3eafe316ad63 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -17,8 +17,8 @@ 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_FIREFIGHTER_COUNT = 6; + public static final int INITIAL_FIRE_COUNT = 15; + public static final int INITIAL_FIREFIGHTER_COUNT = 10; private Stage primaryStage; private Parent view; diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 9207e71cbc3b9830a4fca7ac258cc3116a7077e9..43f0d1821927a38e3f481a5d9b1b9018d2e2ca73 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -13,8 +13,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int initialFirefighterCount; private final TargetStrategy targetStrategy = new TargetStrategy(); private List<FireFighter> firefighters; - private Set<Fire> fires; - private Map<Position, List<Position>> neighbors = new HashMap(); + private Map<Position, Fire> fires = new HashMap<>(); + private final Map<Position, List<Position>> neighbors = new HashMap<>(); private final Position[][] positions; private int step = 0; private final Random randomGenerator = new Random(); @@ -23,46 +23,63 @@ public class FirefighterBoard implements Board<List<ModelElement>> { this.columnCount = columnCount; this.rowCount = rowCount; this.positions = new Position[rowCount][columnCount]; - for (int column = 0; column < columnCount; column++) - for (int row = 0; row < rowCount; row++) - positions[row][column] = new Position(row, column); - for (int column = 0; column < columnCount; column++) - for (int row = 0; row < rowCount; row++) { - List<Position> list = new ArrayList<>(); - if (row > 0) list.add(positions[row - 1][column]); - if (column > 0) list.add(positions[row][column - 1]); - if (row < rowCount - 1) list.add(positions[row + 1][column]); - if (column < columnCount - 1) list.add(positions[row][column + 1]); - neighbors.put(positions[row][column], list); - } + + // Initialize positions and neighbors + initializePositionsAndNeighbors(); + this.initialFireCount = initialFireCount; this.initialFirefighterCount = initialFirefighterCount; initializeElements(); } + private void initializePositionsAndNeighbors() { + for (int column = 0; column < columnCount; column++) { + for (int row = 0; row < rowCount; row++) { + positions[row][column] = new Position(row, column); + } + } + + for (int column = 0; column < columnCount; column++) { + for (int row = 0; row < rowCount; row++) { + neighbors.put(positions[row][column], calculateNeighbors(row, column)); + } + } + } + + private List<Position> calculateNeighbors(int row, int column) { + List<Position> list = new ArrayList<>(); + if (row > 0) list.add(positions[row - 1][column]); + if (column > 0) list.add(positions[row][column - 1]); + if (row < rowCount - 1) list.add(positions[row + 1][column]); + if (column < columnCount - 1) list.add(positions[row][column + 1]); + return list; + } + public void initializeElements() { firefighters = new ArrayList<>(); - fires = new HashSet<>(); - for (int index = 0; index < initialFireCount; index++) - fires.add(new Fire(randomPosition())); - for (int index = 0; index < initialFirefighterCount; index++) + fires.clear(); + + for (int index = 0; index < initialFireCount; index++) { + Position position = randomPosition(); + fires.put(position, new Fire(position)); + } + + for (int index = 0; index < initialFirefighterCount; index++) { firefighters.add(new FireFighter(randomPosition())); + } } private Position randomPosition() { - return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); + return positions[randomGenerator.nextInt(rowCount)][randomGenerator.nextInt(columnCount)]; } @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 (this.getFirePositions(fires).contains(position)) - result.add(ModelElement.FIRE); - + for (FireFighter firefighter : firefighters) { + if (firefighter.getPosition().equals(position)) result.add(ModelElement.FIREFIGHTER); + } + if (fires.containsKey(position)) result.add(ModelElement.FIRE); return result; } @@ -86,47 +103,50 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private List<Position> updateFires() { List<Position> modifiedPositions = new ArrayList<>(); if (step % 2 == 0) { - List<Position> newFirePositions = new ArrayList<>(); - for (Position fire : getFirePositions(this.fires)) { + Set<Position> newFirePositions = new HashSet<>(); + for (Position fire : new HashSet<>(fires.keySet())) { // Utilisez une copie de la clé newFirePositions.addAll(neighbors.get(fire)); } - this.getFirePositions(fires).addAll(newFirePositions); - modifiedPositions.addAll(newFirePositions); + for (Position position : newFirePositions) { + if (!fires.containsKey(position)) { // Vérifiez si le feu est nouveau + fires.put(position, new Fire(position)); + modifiedPositions.add(position); + } + } } return modifiedPositions; - } + @Override public int stepNumber() { return step; } private List<Position> updateFirefighters() { - List<Position> modifiedPosition = new ArrayList<>(); - List<Position> firefighterNewPositions = new ArrayList<>(); - for (Position firefighterPosition : this.getFireFighterPositions(this.firefighters)) { - Position newFirefighterPosition = - targetStrategy.neighborClosestToFire(firefighterPosition, - this.getFirePositions(fires), neighbors); - firefighterNewPositions.add(newFirefighterPosition); - extinguish(newFirefighterPosition); - modifiedPosition.add(firefighterPosition); - modifiedPosition.add(newFirefighterPosition); - List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() - .filter(this.getFirePositions(fires)::contains).toList(); - for (Position firePosition : neighborFirePositions) - extinguish(firePosition); - modifiedPosition.addAll(neighborFirePositions); - } - ArrayList<FireFighter> newFireFighters = new ArrayList<>(); - for(Position position : firefighterNewPositions){ - newFireFighters.add(new FireFighter(position)); + List<Position> modifiedPositions = new ArrayList<>(); + for (FireFighter firefighter : firefighters) { + 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); + } } - firefighters = newFireFighters; - return modifiedPosition; + return modifiedPositions; } + @Override public void reset() { step = 0; @@ -134,10 +154,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } private void extinguish(Position position) { - for(Fire fire: fires){ - if(fire.getPosition().equals(position)){ - fires.remove(fire); - } + if (fires.containsKey(position)) { + fires.remove(position); } } @@ -145,39 +163,13 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @Override public void setState(List<ModelElement> state, Position position) { extinguish(position); - for (; ; ) { - if (!getFireFighterPositions(this.firefighters).remove(position)) break; - } + firefighters.removeIf(firefighter -> firefighter.getPosition().equals(position)); + for (ModelElement element : state) { switch (element) { - case FIRE -> fires.add(new Fire(position)); + case FIRE -> fires.put(position, new Fire(position)); case FIREFIGHTER -> firefighters.add(new FireFighter(position)); } } } - - - - - public Set<Position> getFirePositions(Set<Fire> fireSet){ - Set<Position> firePositions = new HashSet<>(); - for(Fire fire : fireSet){ - firePositions.add(fire.getPosition()); - } - return firePositions; - } - - - public ArrayList<Position> getFireFighterPositions(List<FireFighter> fireFighterList){ - ArrayList<Position> fireFighterPositions = new ArrayList<>(); - for(FireFighter fireFighter : fireFighterList){ - fireFighterPositions.add(fireFighter.getPosition()); - } - return fireFighterPositions; - } - - - - - -} \ No newline at end of file +}