diff --git a/src/main/java/model/CloudStrategy.java b/src/main/java/model/CloudStrategy.java new file mode 100644 index 0000000000000000000000000000000000000000..8399dc6da82bbc5767aa11297d110eda226b7ad8 --- /dev/null +++ b/src/main/java/model/CloudStrategy.java @@ -0,0 +1,68 @@ +package model; + +import util.Position; +import util.TargetStrategy; + +import java.util.*; + +public class CloudStrategy implements Strategy { + private final TargetStrategy targetStrategy = new TargetStrategy(); + private List<Position> cloudPositions; + private final Set<Position> firePositions; + private final Map<Position, List<Position>> neighbors; + private final Random random = new Random(); + private final int maxRows; + private final int maxCols; + + public CloudStrategy(List<Position> cloudPositions, Set<Position> firePositions, Map<Position, List<Position>> neighbors, int maxRows, int maxCols) { + + this.cloudPositions = cloudPositions; + this.firePositions = firePositions; + this.neighbors = neighbors; + this.maxRows = maxRows; + this.maxCols = maxCols; + } + + @Override + public List<Position> update() { + List<Position> modifiedCloudPositions = new ArrayList<>(); + List<Position> newCloudPositions = new ArrayList<>(); + + for (Position cloudPosition : cloudPositions) { + Position newCloudPosition = randomPos(cloudPosition); + newCloudPositions.add(newCloudPosition); + modifiedCloudPositions.add(cloudPosition); + modifiedCloudPositions.add(newCloudPosition); + extinguishFiures(newCloudPosition, modifiedCloudPositions); + } + cloudPositions = newCloudPositions; + return modifiedCloudPositions; + } + + @Override + public List<Position> getModelPositions() { + return cloudPositions; + } + + @Override + public Set<Position> getFirePositions() { + return firePositions; + } + private void extinguishFiures(Position position, List<Position> modifiedCloudPositions) { + List<Position> positions = new ArrayList<>(neighbors.getOrDefault(position, Collections.emptyList())); + positions.add(position); + List<Position> firePos = positions.stream().filter(firePositions :: contains).toList(); + firePositions.removeAll(firePos); + modifiedCloudPositions.addAll(firePos); + } + private Position randomPos(Position cloudPosition) { + int row = random.nextInt(3)-1; + int col = random.nextInt(3)-1; + int newRow = cloudPosition.getRow() + row; + int newCol = cloudPosition.getCol() + col; + if (newRow>=0 && newRow<maxRows && newCol>=0 && newCol<maxCols) { + return new Position(newRow, newCol); + } + return cloudPosition; + } +} diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 5181cb6ec19926bff50a1d45432c038965e97f72..ce6d9e41b393468ecf7cfe510f7a5890243a950c 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -4,6 +4,8 @@ import util.Position; import javafx.util.Pair; import java.util.*; +import static model.ModelElement.CLOUD; + public class FirefighterBoard implements Board<List<ModelElement>> { private final int columnCount; private final int rowCount; @@ -14,6 +16,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private Set<Position> firePositions; private final Map<Position, List<Position>> neighbors; private final Position[][] positions; + private List<Position> cloudPositions; private int step = 0; @@ -28,6 +31,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { this.firefighterPositions = new ArrayList<>(); this.firePositions = new HashSet<>(); this.neighbors = new HashMap<>(); + this.cloudPositions = new ArrayList<>(); initializeBoard(); } @@ -78,7 +82,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> { result.add(ModelElement.FIREFIGHTER); } } - default -> { + case CLOUD -> { + if (cloudPositions.contains(position)) { + result.add(ModelElement.CLOUD); + } + } + default ->{ } } } @@ -103,11 +112,20 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @Override public void reset() { step = 0; - firefighterPositions.clear(); - firePositions.clear(); + Initializer initializer = new Initializer(columnCount,rowCount,initialFireCount,initialFirefighterCount); + resetPos(firePositions,initializer.getFirePositions()); + resetPos(firefighterPositions,initializer.getFirefighterPositions()); + resetPos(cloudPositions,initializer.getCloudPositions()); + + neighbors.clear(); + neighbors.putAll(initializer.getNeighbors()); initializeBoard(); } + private <S> void resetPos(Collection<S> currentPositions, Collection<S> newPositions) { + currentPositions.clear(); + currentPositions.addAll(newPositions); + } @Override public void setState(List<ModelElement> state, Position position) { @@ -118,6 +136,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { switch (element) { case FIRE -> firePositions.add(position); case FIREFIGHTER -> firefighterPositions.add(position); + case CLOUD -> cloudPositions.add(position); } } } @@ -125,8 +144,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @Override public List<Position> updateToNextGeneration() { List<ModelElement> elements = List.of( - ModelElement.FIRE, - ModelElement.FIREFIGHTER + ModelElement.FIRE, + ModelElement.FIREFIGHTER, + ModelElement.CLOUD ); List<Position> modifiedPositions = new ArrayList<>(); @@ -134,6 +154,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { Strategy strategy = switch(element) { case FIRE -> new SimpleFireSpreadStrategy(firePositions, neighbors,step); case FIREFIGHTER -> new FirefighterMovementStrategy(firefighterPositions,firePositions,neighbors); + case CLOUD -> new CloudStrategy(cloudPositions,firePositions,neighbors,rowCount,columnCount); default -> throw new IllegalStateException("Type de modèle inconnu : " + element); }; modifiedPositions.addAll(strategy.update()); @@ -141,6 +162,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { switch (element) { case FIRE -> firePositions = strategy.getFirePositions(); case FIREFIGHTER -> firefighterPositions = strategy.getModelPositions(); + case CLOUD -> cloudPositions = strategy.getModelPositions(); } } step++; diff --git a/src/main/java/model/FirefighterMovementStrategy.java b/src/main/java/model/FirefighterMovementStrategy.java index b8c4f3b5131548522bd513ba2c45e4dbad80524d..c6ca54c774f0671a9bf05cabdb410a34b5df518a 100644 --- a/src/main/java/model/FirefighterMovementStrategy.java +++ b/src/main/java/model/FirefighterMovementStrategy.java @@ -19,7 +19,7 @@ public class FirefighterMovementStrategy implements Strategy { @Override public List<Position> update() { -List<Position> modifiedPositions = new ArrayList<>(); + List<Position> modifiedPositions = new ArrayList<>(); List<Position> newFirefighterPositions = new ArrayList<>(); for (Position firefighterPosition : firefighterPositions) { diff --git a/src/main/java/model/Initializer.java b/src/main/java/model/Initializer.java index 373eb05ba57e27989095c591c562e7129b132491..f2cf448dd9a7cb82b65f3d421d40011e2f61bae2 100644 --- a/src/main/java/model/Initializer.java +++ b/src/main/java/model/Initializer.java @@ -14,10 +14,14 @@ public class Initializer { private final Map<Position, List<Position>> neighbors; private final List<Position> firefighterPositions; private final Set<Position> firePositions; + private final List<Position> cloudPositions; private int step = 0; private final Random randomGenerator = new Random(); + private static final int cloudCount = 3; + + public Initializer(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { this.columnCount = columnCount; this.rowCount = rowCount; @@ -28,6 +32,7 @@ public class Initializer { this.neighbors = new HashMap<>(); this.firePositions = new HashSet<>(); this.firefighterPositions = new ArrayList<>(); + this.cloudPositions = new ArrayList<>(); initializePositions(); initializeNeighbors(); @@ -53,6 +58,9 @@ public class Initializer { } } private void initializeElements() { + initializeFirePositions(); + initializeFirefighters(); + initializeCloudsPositions(); } private void initializeFirePositions() { @@ -61,6 +69,9 @@ public class Initializer { private void initializeFirefighters() { addRandomPositions(firefighterPositions, initialFirefighterCount); } + private void initializeCloudsPositions() { + addRandomPositions(cloudPositions, cloudCount); + } private void addRandomPositions(Collection<Position> targetCollection, int count) { while (targetCollection.size() < count) { @@ -108,6 +119,7 @@ public class Initializer { public Set<Position> getFirePositions() { return firePositions; } + public List<Position> getCloudPositions() {return cloudPositions;} public int getStep() {return step;} } diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java index 5212cc5dc358e893318e4c01fb2926782f07b496..aa0ba36d2d22820408a534be5e919589025a3cde 100644 --- a/src/main/java/model/ModelElement.java +++ b/src/main/java/model/ModelElement.java @@ -2,7 +2,7 @@ package model; public enum ModelElement { - FIREFIGHTER("blue"), FIRE("red"); + FIREFIGHTER("blue"), FIRE("red"), CLOUD("darkgrey"); private final String color;