Newer
Older
import java.util.*;
public class FirefighterBoard implements Board<List<ModelElement>> {
private final int columnCount;
private final int rowCount;
private final int initialFireCount;
private final TargetStrategy targetStrategy = new TargetStrategy();
ASFOUR Mohamed
committed
private Map<Position, Fire> fires = new HashMap<>();
private final Map<Position, List<Position>> neighbors = new HashMap<>();
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;
ASFOUR Mohamed
committed
// Initialize positions and neighbors
initializePositionsAndNeighbors();
this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
initializeElements();
}
ASFOUR Mohamed
committed
private void initializePositionsAndNeighbors() {
for (int column = 0; column < columnCount; column++) {
for (int row = 0; row < rowCount; row++) {
positions[row][column] = new Position(row, column);
}
}
for (int column = 0; column < columnCount; column++) {
for (int row = 0; row < rowCount; row++) {
neighbors.put(positions[row][column], calculateNeighbors(row, column));
}
}
}
private List<Position> calculateNeighbors(int row, int column) {
List<Position> list = new ArrayList<>();
if (row > 0) list.add(positions[row - 1][column]);
if (column > 0) list.add(positions[row][column - 1]);
if (row < rowCount - 1) list.add(positions[row + 1][column]);
if (column < columnCount - 1) list.add(positions[row][column + 1]);
return list;
}
ASFOUR Mohamed
committed
fires.clear();
for (int index = 0; index < initialFireCount; index++) {
Position position = randomPosition();
fires.put(position, new Fire(position));
}
for (int index = 0; index < initialFirefighterCount; index++) {
ASFOUR Mohamed
committed
}
ASFOUR Mohamed
committed
return positions[randomGenerator.nextInt(rowCount)][randomGenerator.nextInt(columnCount)];
}
@Override
public List<ModelElement> getState(Position position) {
List<ModelElement> result = new ArrayList<>();
ASFOUR Mohamed
committed
for (FireFighter firefighter : firefighters) {
if (firefighter.getPosition().equals(position)) result.add(ModelElement.FIREFIGHTER);
}
if (fires.containsKey(position)) result.add(ModelElement.FIRE);
return result;
}
@Override
public int rowCount() {
return rowCount;
}
@Override
public int columnCount() {
return columnCount;
}
public List<Position> updateToNextGeneration() {
List<Position> modifiedPositions = updateFirefighters();
modifiedPositions.addAll(updateFires());
return modifiedPositions;
List<Position> modifiedPositions = new ArrayList<>();
ASFOUR Mohamed
committed
Set<Position> newFirePositions = new HashSet<>();
for (Position fire : new HashSet<>(fires.keySet())) { // Utilisez une copie de la clé
ASFOUR Mohamed
committed
for (Position position : newFirePositions) {
if (!fires.containsKey(position)) { // Vérifiez si le feu est nouveau
fires.put(position, new Fire(position));
modifiedPositions.add(position);
}
}
return modifiedPositions;
ASFOUR Mohamed
committed
@Override
public int stepNumber() {
return step;
}
ASFOUR Mohamed
committed
List<Position> modifiedPositions = new ArrayList<>();
for (FireFighter firefighter : firefighters) {
Position currentPosition = firefighter.getPosition();
Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, fires.keySet(), neighbors);
// Déplacement du pompier
firefighter.setPosition(newPosition);
modifiedPositions.add(currentPosition);
modifiedPositions.add(newPosition);
// Éteindre le feu à la nouvelle position
extinguish(newPosition);
// Éteindre les feux voisins
for (Position neighbor : neighbors.get(newPosition)) {
extinguish(neighbor);
modifiedPositions.add(neighbor);
}
ASFOUR Mohamed
committed
return modifiedPositions;
ASFOUR Mohamed
committed
initializeElements();
}
private void extinguish(Position position) {
ASFOUR Mohamed
committed
if (fires.containsKey(position)) {
fires.remove(position);
@Override
public void setState(List<ModelElement> state, Position position) {
ASFOUR Mohamed
committed
firefighters.removeIf(firefighter -> firefighter.getPosition().equals(position));
for (ModelElement element : state) {
switch (element) {
ASFOUR Mohamed
committed
case FIRE -> fires.put(position, new Fire(position));
case FIREFIGHTER -> firefighters.add(new FireFighter(position));