From 4f32dbe0ef5175a3a3b9b5dfe7e3d24708a92b29 Mon Sep 17 00:00:00 2001 From: ousseyn01 <ousseyn.ndiaye9@gmail.com> Date: Sat, 23 Nov 2024 22:50:28 +0100 Subject: [PATCH] FirefighterBoard is DONE --- src/main/java/model/FirefighterBoard.java | 89 ++++++++++------------- 1 file changed, 38 insertions(+), 51 deletions(-) diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index c0bd67c..99c94d8 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -4,16 +4,15 @@ import util.Position; import java.util.*; - public class FirefighterBoard implements Board<List<ModelElement>> { private final int columnCount; private final int rowCount; private final int initialFireCount; private final int initialFirefighterCount; - private final TargetStrategy targetStrategy = new TargetStrategy(); - private List<Position> firefighterPositions; - private Set<Position> firePositions; - private Map<Position, List<Position>> neighbors = new HashMap(); + private final model.TargetStrategy targetStrategy = new model.TargetStrategy(); + private List<Firefighter> firefighters; + private Fire fire; + private final Map<Position, List<Position>> neighbors = new HashMap<>(); private final Position[][] positions; private int step = 0; private final Random randomGenerator = new Random(); @@ -40,12 +39,13 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } public void initializeElements() { - firefighterPositions = new ArrayList<>(); - firePositions = new HashSet<>(); + firefighters = new ArrayList<>(); + Set<Position> firePositions = new HashSet<>(); for (int index = 0; index < initialFireCount; index++) firePositions.add(randomPosition()); + fire = new Fire(firePositions, neighbors); for (int index = 0; index < initialFirefighterCount; index++) - firefighterPositions.add(randomPosition()); + firefighters.add(new Firefighter(randomPosition())); } private Position randomPosition() { @@ -55,10 +55,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @Override public List<ModelElement> getState(Position position) { List<ModelElement> result = new ArrayList<>(); - for (Position firefighterPosition : firefighterPositions) - if (firefighterPosition.equals(position)) + for (Firefighter firefighter : firefighters) + if (firefighter.getPosition().equals(position)) result.add(ModelElement.FIREFIGHTER); - if (firePositions.contains(position)) + if (fire.getFirePositions().contains(position)) result.add(ModelElement.FIRE); return result; } @@ -75,23 +75,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> { public List<Position> updateToNextGeneration() { List<Position> modifiedPositions = updateFirefighters(); - modifiedPositions.addAll(updateFires()); + if (step % 2 == 0){ + modifiedPositions.addAll(fire.spreadFire()); + } step++; - return modifiedPositions; - } - private List<Position> updateFires() { - List<Position> modifiedPositions = new ArrayList<>(); - if (step % 2 == 0) { - List<Position> newFirePositions = new ArrayList<>(); - for (Position fire : firePositions) { - newFirePositions.addAll(neighbors.get(fire)); - } - firePositions.addAll(newFirePositions); - modifiedPositions.addAll(newFirePositions); - } return modifiedPositions; - } @Override @@ -101,22 +90,27 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private List<Position> updateFirefighters() { List<Position> modifiedPosition = new ArrayList<>(); - List<Position> firefighterNewPositions = new ArrayList<>(); - for (Position firefighterPosition : firefighterPositions) { - Position newFirefighterPosition = - targetStrategy.neighborClosestToFire(firefighterPosition, - firePositions, neighbors); - firefighterNewPositions.add(newFirefighterPosition); - extinguish(newFirefighterPosition); - modifiedPosition.add(firefighterPosition); - modifiedPosition.add(newFirefighterPosition); - List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() - .filter(firePositions::contains).toList(); - for (Position firePosition : neighborFirePositions) - extinguish(firePosition); - modifiedPosition.addAll(neighborFirePositions); + for (Firefighter firefighter : firefighters) { + + modifiedPosition.add(firefighter.getPosition()); + + Position newPosition = firefighter.moveToBestPosition(targetStrategy, fire.getFirePositions(), neighbors); + firefighter.setPosition(newPosition); + + modifiedPosition.add(newPosition); + + firefighter.extinguish(newPosition, fire.getFirePositions()); + + // Éteindre les feux dans les positions voisines + List<Position> adjacentFires = neighbors.get(newPosition).stream() + .filter(fire.getFirePositions()::contains) + .toList(); + for (Position firePosition : adjacentFires) { + firefighter.extinguish(firePosition, fire.getFirePositions()); + modifiedPosition.add(firePosition); // Ajouter la position comme modifiée + } + } - firefighterPositions = firefighterNewPositions; return modifiedPosition; } @@ -126,21 +120,14 @@ public class FirefighterBoard implements Board<List<ModelElement>> { initializeElements(); } - private void extinguish(Position position) { - firePositions.remove(position); - } - - @Override public void setState(List<ModelElement> state, Position position) { - firePositions.remove(position); - for (; ; ) { - if (!firefighterPositions.remove(position)) break; - } + fire.getFirePositions().remove(position); + firefighters.removeIf(f -> f.getPosition().equals(position)); for (ModelElement element : state) { switch (element) { - case FIRE -> firePositions.add(position); - case FIREFIGHTER -> firefighterPositions.add(position); + case FIRE -> fire.getFirePositions().add(position); + case FIREFIGHTER -> firefighters.add(new Firefighter(position)); } } } -- GitLab