diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index c0bd67cc4f444a33c41551779b11f3d619412bef..c84740f34bbeb8be2450813efecb299d4337656f 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -1,8 +1,8 @@ package model; import util.Position; - import java.util.*; +import model.TargetStrategy; public class FirefighterBoard implements Board<List<ModelElement>> { @@ -10,21 +10,31 @@ public class FirefighterBoard implements Board<List<ModelElement>> { 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 Position[][] positions; + private final Map<Position, List<Position>> neighbors = new HashMap<>(); + + private Fire fire; + private Firefighter firefighter; private int step = 0; - private final Random randomGenerator = new Random(); public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { this.columnCount = columnCount; this.rowCount = rowCount; + this.initialFireCount = initialFireCount; + this.initialFirefighterCount = initialFirefighterCount; this.positions = new Position[rowCount][columnCount]; + initializePositions(); + initializeNeighbors(); + initializeElements(); + } + + private void initializePositions() { for (int column = 0; column < columnCount; column++) for (int row = 0; row < rowCount; row++) positions[row][column] = new Position(row, column); + } + + private void initializeNeighbors() { for (int column = 0; column < columnCount; column++) for (int row = 0; row < rowCount; row++) { List<Position> list = new ArrayList<>(); @@ -34,64 +44,55 @@ public class FirefighterBoard implements Board<List<ModelElement>> { if (column < columnCount - 1) list.add(positions[row][column + 1]); neighbors.put(positions[row][column], list); } - this.initialFireCount = initialFireCount; - this.initialFirefighterCount = initialFirefighterCount; - initializeElements(); } - public void initializeElements() { - firefighterPositions = new ArrayList<>(); - firePositions = new HashSet<>(); - for (int index = 0; index < initialFireCount; index++) - firePositions.add(randomPosition()); - for (int index = 0; index < initialFirefighterCount; index++) - firefighterPositions.add(randomPosition()); - } + private void initializeElements() { + Set<Position> initialFirePositions = new HashSet<>(); + List<Position> initialFirefighterPositions = new ArrayList<>(); + Random random = new Random(); - private Position randomPosition() { - return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); + for (int i = 0; i < initialFireCount; i++) { + initialFirePositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount))); + } + for (int i = 0; i < initialFirefighterCount; i++) { + initialFirefighterPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount))); + } + + fire = new Fire(initialFirePositions); + firefighter = new Firefighter(initialFirefighterPositions, new TargetStrategy()); } @Override public List<ModelElement> getState(Position position) { - List<ModelElement> result = new ArrayList<>(); - for (Position firefighterPosition : firefighterPositions) - if (firefighterPosition.equals(position)) - result.add(ModelElement.FIREFIGHTER); - if (firePositions.contains(position)) - result.add(ModelElement.FIRE); - return result; + List<ModelElement> elements = new ArrayList<>(); + if (fire.getPositions().contains(position)) elements.add(ModelElement.FIRE); + if (firefighter.getPositions().contains(position)) elements.add(ModelElement.FIREFIGHTER); + return elements; } @Override - public int rowCount() { - return rowCount; + public List<Position> updateToNextGeneration() { + List<Position> modifiedPositions = firefighter.moveToClosestFire(fire.getPositions(), neighbors); + modifiedPositions.addAll(fire.spread(neighbors.keySet())); + step++; + return modifiedPositions; } @Override - public int columnCount() { - return columnCount; + public void setState(List<ModelElement> state, Position position) { + // Mise à jour des états (feu ou pompier) en fonction de la liste `state` + if (state.contains(ModelElement.FIRE)) fire.getPositions().add(position); + if (state.contains(ModelElement.FIREFIGHTER)) firefighter.getPositions().add(position); } - public List<Position> updateToNextGeneration() { - List<Position> modifiedPositions = updateFirefighters(); - modifiedPositions.addAll(updateFires()); - step++; - return modifiedPositions; + @Override + public int rowCount() { + return rowCount; } - 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 + public int columnCount() { + return columnCount; } @Override @@ -99,49 +100,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> { return step; } - 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); - } - firefighterPositions = firefighterNewPositions; - return modifiedPosition; - } - @Override public void reset() { step = 0; 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; - } - for (ModelElement element : state) { - switch (element) { - case FIRE -> firePositions.add(position); - case FIREFIGHTER -> firefighterPositions.add(position); - } - } - } -} \ No newline at end of file +}