diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 65c222600e6d2a94246de9b759ab9f7730e0f4eb..93585d706a51d5591906883bdd261afa6fb64dcd 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -1,5 +1,6 @@ package model; +import model.elements.*; import model.update.NextGenerationUpdater; import util.Position; @@ -25,6 +26,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private NextGenerationUpdater nextGenerationUpdater; private List<TerrainElement> terrainElements; + private final List<ElementHandler> handlers = new ArrayList<>(); + + public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudCount, int initialMountainCount) { @@ -60,7 +64,13 @@ public class FirefighterBoard implements Board<List<ModelElement>> { Position position = randomPosition(); terrainElements.add(new Rocaille(position)); } - } + + handlers.add(new FireHandler(fire)); + handlers.add(new FirefighterHandler(firefighters)); + handlers.add(new CloudHandler(clouds, neighbors)); + handlers.add(new MountainHandler(mountains)); + handlers.add(new TerrainHandler(terrainElements, Route.class, ModelElement.ROUTE)); + handlers.add(new TerrainHandler(terrainElements, Rocaille.class, ModelElement.ROCAILLE)); } public void initializeElements() { firefighters = new ArrayList<>(); @@ -118,38 +128,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> { return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); } - @Override - public List<ModelElement> getState(Position position) { - List<ModelElement> result = new ArrayList<>(); - for (Cloud cloud : clouds) { - if (cloud.getPosition().equals(position)) { - result.add(ModelElement.CLOUD); - } - } - for (Mountain mountain : mountains){ - if(mountain.getPosition().equals(position)){ - result.add(ModelElement.MOUNTAIN); - } - } - - for (Firefighter firefighter : firefighters) - if (firefighter.getPosition().equals(position)) - result.add(ModelElement.FIREFIGHTER); - - if (fire.getFirePositions().contains(position)) - result.add(ModelElement.FIRE); - - for (TerrainElement element : terrainElements) { - if (element.getPosition().equals(position)) { - if (element instanceof Route) { - result.add(ModelElement.ROUTE); - } else if (element instanceof Rocaille) { - result.add(ModelElement.ROCAILLE); - } - } - } - return result; - } @Override public int rowCount() { @@ -167,7 +145,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { public List<Position> updateToNextGeneration() { List<Position> updatedPositions = nextGenerationUpdater.updateToNextGeneration(); - step++; // Incrémentation du compteur de génération + step++; return updatedPositions; //return nextGenerationUpdater.updateToNextGeneration(); } @@ -178,22 +156,27 @@ public class FirefighterBoard implements Board<List<ModelElement>> { nextGenerationUpdater.resetStep(); } + @Override + public List<ModelElement> getState(Position position) { + List<ModelElement> result = new ArrayList<>(); + for (ElementHandler handler : handlers) { + if (handler.hasElement(position)) { + result.add(handler.getModelElement()); + } + } + return result; + } @Override public void setState(List<ModelElement> state, Position position) { - fire.getFirePositions().remove(position); - firefighters.removeIf(f -> f.getPosition().equals(position)); - clouds.removeIf(c -> c.getPosition().equals(position)); + for (ElementHandler handler : handlers) { + handler.removeElement(position); + } for (ModelElement element : state) { - switch (element) { - case FIRE -> fire.getFirePositions().add(position); - case FIREFIGHTER -> firefighters.add(new Firefighter(position)); - case CLOUD -> clouds.add(new Cloud(position, neighbors)); - case MOUNTAIN -> mountains.add(new Mountain(position)); - case ROUTE -> terrainElements.add(new Route(position)); - case ROCAILLE -> terrainElements.add(new Rocaille(position)); - } + handlers.stream() + .filter(handler -> handler.getModelElement() == element) + .forEach(handler -> handler.addElement(position)); } } }