diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java index f49af1d194474ee94402f3a1d58dc1e3a0db29c7..dc5231c8ec8efdf664fb3fbb9d10ed854e54b2dc 100644 --- a/src/main/java/model/Fire.java +++ b/src/main/java/model/Fire.java @@ -2,9 +2,7 @@ package model; import util.Position; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class Fire implements Element { @@ -33,8 +31,24 @@ public class Fire implements Element { this.position = position; } - public List<Position> update(FirefighterBoard firefighterBoard){ - return null; + + public List<Position> update(FirefighterBoard firefighterBoard) { + List<Position> modifiedPositions = new ArrayList<>(); + Map<Position, List<Position>> neighbors = firefighterBoard.getNeighbors(); + + // Étendre le feu seulement à chaque étape paire + if (firefighterBoard.stepNumber() % 2 == 0) { + List<Position> neighborPositions = neighbors.get(this.getPosition()); + for (Position position : neighborPositions) { + if (!(firefighterBoard.getState(position).contains(modelElement))) { + // Ajouter un nouveau feu directement dans la liste des éléments + firefighterBoard.getElements().add(new Fire(position)); + } + // Marquer la position comme modifiée + modifiedPositions.add(position); + } + } + return modifiedPositions; } public boolean contains(List<Position> positions) { diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java index 6fd518d3371f02a687ed6c700e420913fb61a1c4..c136eb4e8128ebfd698231ff642c61f8bed053d1 100644 --- a/src/main/java/model/FireFighter.java +++ b/src/main/java/model/FireFighter.java @@ -4,7 +4,9 @@ import util.Position; import util.TargetStrategy; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class FireFighter extends Extinguisher { diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 071930f418e7cb5591ba517336e7fb515698ce80..ab4b6a7bef1ca2d639cdcc7b6d0a7af3cdd6fc31 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -13,12 +13,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int initialFirefighterCount; private final int initialCloudCount; private final int initialRoadCount; - private List<FireFighter> firefighters; - private List<Element> elements; - private Map<Position, Fire> fires = new HashMap<>(); - private List<Cloud> clouds; private final Map<Position, List<Position>> neighbors = new HashMap<>(); private final Position[][] positions; private int step = 0; @@ -57,12 +53,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> { public void initializeElements() { elements = new ArrayList<>(); - fires.clear(); - for (int index = 0; index < initialFireCount; index++) { - Position position = randomPosition(); - fires.put(position, new Fire(position)); + + elements.add(new Fire(randomPosition())); } for (int index = 0; index < initialFirefighterCount; index++) { @@ -99,7 +93,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> { for(Element element : elements){ if(element.getPosition().equals(position))result.add(element.getElement()); } - if (fires.containsKey(position)) result.add(ModelElement.FIRE); return result; } @@ -108,44 +101,25 @@ public class FirefighterBoard implements Board<List<ModelElement>> { - - private List<Position> updateFires() { + public List<Position> updateElements() { List<Position> modifiedPositions = new ArrayList<>(); - if (step % 2 == 0) { - Set<Position> newFirePositions = new HashSet<>(); - for (Position fire : new HashSet<>(fires.keySet())) { - List<Position> neighboursAvaiable = neighbors.get(fire); - neighboursAvaiable.removeAll(getRoadsPosition()); - newFirePositions.addAll(neighbors.get(fire)); - } - for (Position position : newFirePositions) { - if (!fires.containsKey(position)) { - fires.put(position, new Fire(position)); - modifiedPositions.add(position); - } - } - } - return modifiedPositions; - } - - - - - - - public List<Position> updateElements(){ - List<Position> modifiedPositions = new ArrayList<>(); - for (Element element : elements) { - if(element.getClass().equals(Road.class)){ - continue; - } + for (Element element : new ArrayList<>(elements)) { modifiedPositions.addAll(element.update(this)); } + return modifiedPositions; } + public List<Element> getElements() { + return elements; + } + + public boolean containsFireAt(Position position) { + return elements.stream() + .anyMatch(e -> e instanceof Fire && e.getPosition().equals(position)); + } public Position randomNeighbor(Position position) { List<Position> neighborPositions = neighbors.get(position); @@ -157,7 +131,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { public List<Position> updateToNextGeneration() { List<Position> modifiedPositions = updateElements(); - modifiedPositions.addAll(updateFires()); + step++; return modifiedPositions; } @@ -185,14 +159,23 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } public void extinguish(Position position) { - if (fires.containsKey(position)) { - fires.remove(position); + + for(Fire fire : new HashSet<>(getFires().values())){ + if(fire.getPosition().equals(position)){ + elements.remove(fire); + } } } public Map<Position,Fire> getFires(){ - return this.fires; + Map<Position,Fire>fires = new HashMap<>(); + for(Element element : elements){ + if(element.getClass().equals(Fire.class)){ + fires.put(element.getPosition(), (Fire) element); + } + } + return fires; } public Map<Position, List<Position>> getNeighbors() { @@ -218,9 +201,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> { for (ModelElement element : state) { switch (element) { - case FIRE -> fires.put(position, new Fire(position)); - case FIREFIGHTER -> firefighters.add(new FireFighter(position)); - case CLOUD -> clouds.add(new Cloud(position)); + case FIRE -> elements.add(new Fire(position)); + case FIREFIGHTER -> elements.add(new FireFighter(position)); + case CLOUD -> elements.add(new Cloud(position)); } } } diff --git a/src/main/java/model/Road.java b/src/main/java/model/Road.java index b6456104fb8bd57c62d53309165cb9e590b6c98e..bd9d09d39a3188ac4adeb525d0b69e21db3e585b 100644 --- a/src/main/java/model/Road.java +++ b/src/main/java/model/Road.java @@ -2,6 +2,7 @@ package model; import util.Position; +import java.util.ArrayList; import java.util.List; public class Road implements Element { @@ -30,6 +31,6 @@ public class Road implements Element { @Override public List<Position> update(FirefighterBoard firefighterBoard) { - return null; + return List.of(); } }