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 int initialCloudCount;
private List<Element> elements;
ASFOUR Mohamed
committed
private Map<Position, Fire> fires = new HashMap<>();
private List<Cloud> clouds;
ASFOUR Mohamed
committed
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,int initialCloudCount,int initialRoadCount) {
this.columnCount = columnCount;
this.rowCount = rowCount;
ASFOUR Mohamed
committed
initializePositionsAndNeighbors();
this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
this.initialCloudCount = initialCloudCount;
this.initialRoadCount = initialRoadCount;
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));
}
}
}
ASFOUR Mohamed
committed
elements = new ArrayList<>();
ASFOUR Mohamed
committed
fires.clear();
ASFOUR Mohamed
committed
for (int index = 0; index < initialFireCount; index++) {
Position position = randomPosition();
fires.put(position, new Fire(position));
}
for (int index = 0; index < initialFirefighterCount; index++) {
elements.add(new FireFighter(randomPosition()));
ASFOUR Mohamed
committed
}
for (int index = 0; index < initialCloudCount; index++) {
elements.add(new Cloud(randomPosition()));
}
for (int index = 0; index < initialRoadCount; index++) {
elements.add(new Road(randomPosition()));
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
return positions[randomGenerator.nextInt(rowCount)][randomGenerator.nextInt(columnCount)];
}
@Override
public List<ModelElement> getState(Position position) {
List<ModelElement> result = new ArrayList<>();
for(Element element : elements){
if(element.getPosition().equals(position))result.add(element.getElement());
ASFOUR Mohamed
committed
}
if (fires.containsKey(position)) result.add(ModelElement.FIRE);
List<Position> modifiedPositions = new ArrayList<>();
ASFOUR Mohamed
committed
Set<Position> newFirePositions = new HashSet<>();
for (Position fire : new HashSet<>(fires.keySet())) {
List<Position> neighboursAvaiable = neighbors.get(fire);
neighboursAvaiable.removeAll(getRoadsPosition());
ASFOUR Mohamed
committed
for (Position position : newFirePositions) {
if (!fires.containsKey(position)) {
ASFOUR Mohamed
committed
fires.put(position, new Fire(position));
modifiedPositions.add(position);
}
}
return modifiedPositions;
ASFOUR Mohamed
committed
ASFOUR Mohamed
committed
public List<Position> updateElements(){
List<Position> modifiedPositions = new ArrayList<>();
for (Element element : elements) {
if(element.getClass().equals(Road.class)){
continue;
ASFOUR Mohamed
committed
}
modifiedPositions.addAll(element.update(this));
ASFOUR Mohamed
committed
return modifiedPositions;
ASFOUR Mohamed
committed
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
public Position randomNeighbor(Position position) {
List<Position> neighborPositions = neighbors.get(position);
return neighborPositions.get(randomGenerator.nextInt(neighborPositions.size()));
}
public List<Position> updateToNextGeneration() {
List<Position> modifiedPositions = updateElements();
modifiedPositions.addAll(updateFires());
step++;
return modifiedPositions;
}
@Override
public int stepNumber() {
return step;
}
@Override
public int rowCount() {
return rowCount;
}
@Override
public int columnCount() {
return columnCount;
}
public void extinguish(Position position) {
ASFOUR Mohamed
committed
if (fires.containsKey(position)) {
fires.remove(position);
public Map<Position,Fire> getFires(){
return this.fires;
}
public Map<Position, List<Position>> getNeighbors() {
return neighbors;
}
public List<Position> getRoadsPosition(){
List<Position>roadPosition = new ArrayList<>();
for(Element road: elements){
if(road.getClass().equals(Road.class)){
roadPosition.add(road.getPosition());
}
}
return roadPosition;
}
@Override
public void setState(List<ModelElement> state, Position position) {
elements.removeIf(element -> element.getPosition().equals(position));
ASFOUR Mohamed
committed
for (ModelElement element : state) {
switch (element) {
ASFOUR Mohamed
committed
case FIRE -> fires.put(position, new Fire(position));
case FIREFIGHTER -> firefighters.add(new FireFighter(position));
case CLOUD -> clouds.add(new Cloud(position));