Skip to content
Snippets Groups Projects
Commit 1b9baf40 authored by MANSOUR Chadi's avatar MANSOUR Chadi
Browse files

CloudStrategy added

parent a3e13941
Branches
No related tags found
No related merge requests found
Pipeline #41289 failed
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;
}
}
......@@ -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,6 +82,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
result.add(ModelElement.FIREFIGHTER);
}
}
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);
}
}
}
......@@ -126,7 +145,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
public List<Position> updateToNextGeneration() {
List<ModelElement> elements = List.of(
ModelElement.FIRE,
ModelElement.FIREFIGHTER
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++;
......
......@@ -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;}
}
......@@ -2,7 +2,7 @@ package model;
public enum ModelElement {
FIREFIGHTER("blue"), FIRE("red");
FIREFIGHTER("blue"), FIRE("red"), CLOUD("darkgrey");
private final String color;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment