Newer
Older
import java.util.*;
public class FirefighterBoard implements Board<List<ModelElement>> {
private final int columnCount;
private final int rowCount;
MEHDI
committed
private Map<Position, Fire> fires = new HashMap<>();
private Map<Position, Extinguisher> extinguishers = new HashMap<>();
private Map<Position, Obstacle> obstacles = new HashMap<>();
private int step = 0;
private final Random randomGenerator = new Random();
public FirefighterBoard(int columnCount, int rowCount) {
this.columnCount = columnCount;
this.rowCount = rowCount;
MEHDI
committed
initializePositions();
MEHDI
committed
private void initializePositions() {
ASFOUR Mohamed
committed
for (int column = 0; column < columnCount; column++) {
for (int row = 0; row < rowCount; row++) {
positions[row][column] = new Position(row, column);
}
}
MEHDI
committed
}
ASFOUR Mohamed
committed
obstacles.clear();
extinguishers.clear();
fires.clear();
for(ModelElement modelElement : ModelElement.values()){
for(int elementCount = 0; elementCount< modelElement.getInitialNumber();elementCount++){
Position position = randomPosition();
if(modelElement.isObstacle()){
obstacles.put(position, (Obstacle) modelElement.getModelElementClass(position));
} else if (modelElement.isExtinguisher()) {
extinguishers.put(position, (Extinguisher) modelElement.getModelElementClass(position));
}
else{
fires.put(position, (Fire) modelElement.getModelElementClass(position));
}
}
MEHDI
committed
}
}
ASFOUR Mohamed
committed
return positions[randomGenerator.nextInt(rowCount)][randomGenerator.nextInt(columnCount)];
}
@Override
public List<ModelElement> getState(Position position) {
List<ModelElement> result = new ArrayList<>();
MEHDI
committed
if (fires.containsKey(position)) result.add(ModelElement.FIRE);
for (Extinguisher extinguisher : extinguishers.values()) {
if (extinguisher.getPosition().equals(position)) result.add(extinguisher.getElement());
}
MEHDI
committed
for (Obstacle obstacle : obstacles.values()) {
if (obstacle.getPosition().equals(position)) result.add(obstacle.getElement());
ASFOUR Mohamed
committed
}
MEHDI
committed
@Override
public int rowCount() {
return rowCount;
}
MEHDI
committed
@Override
public int columnCount() {
return columnCount;
}
ASFOUR Mohamed
committed
MEHDI
committed
public List<Position> updateToNextGeneration() {
Fire fire = new Fire(randomPosition());
List<Position> modifiedPositions = new ArrayList<>();
ASFOUR Mohamed
committed
MEHDI
committed
for(Extinguisher element : extinguishers.values()){
modifiedPositions.addAll(element.update(this));
MEHDI
committed
modifiedPositions.addAll(fire.update(this));
step++;
ASFOUR Mohamed
committed
return modifiedPositions;
MEHDI
committed
@Override
public int stepNumber() {
return step;
}
MEHDI
committed
public Map<Position,Fire>getFires(){
return this.fires;
}
@Override
MEHDI
committed
public Map<Position, Extinguisher> getExtinguishers() {
return extinguishers;
}
MEHDI
committed
public Map<Position, Obstacle> getObstacles() {
return obstacles;
}
MEHDI
committed
@Override
public void setState(List<ModelElement> state, Position position) {
MEHDI
committed
MEHDI
committed
if(extinguishers.containsKey(position)){
extinguishers.remove(position);
MEHDI
committed
extinguishers.get(position).extinguish(this,position);
MEHDI
committed
}
for (ModelElement element : state) {
switch (element) {
MEHDI
committed
case FIRE -> fires.put(position, new Fire(position));
case FIREFIGHTER -> extinguishers.put(position,new FireFighter(position));
case CLOUD -> extinguishers.put(position,new Cloud(position));
MEHDI
committed
ASFOUR Mohamed
committed
}