Select Git revision
FirefighterBoard.java
Forked from
COUETOUX Basile / FirefighterStarter
Source project has a limited visibility.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
BoardFireFighterBehavior.java 3.90 KiB
package model;
import util.Position;
import util.TargetStrategy;
import java.util.*;
public class BoardFireFighterBehavior implements BoardBehavior{
private final TargetStrategy targetStrategy = new TargetStrategy();
private final Map<Position, List<Position>> neighbors;
private List<Position> firefighterPositions;
private Set<Position> firePositions;
private final ElementFactory<FireFighter> firefighterFactory;
private final ElementFactory<Fire> fireFactory;
private int step;
public BoardFireFighterBehavior(Map<Position, List<Position>> neighbors, ElementFactory<Fire> fireFactory ,ElementFactory<FireFighter> firefighterFactory) {
this.step=0;
this.neighbors = neighbors;
this.firefighterFactory = firefighterFactory;
this.fireFactory = fireFactory;
}
public void initializeElements(int rowCount, int columnCount) {
// Utilisation de la factory pour créer les feux
firePositions = new HashSet<>();
List<Fire> fires = fireFactory.createElements(rowCount, columnCount);
for (Fire fire : fires) {
firePositions.add(fire.getPosition());
}
// Utilisation de la factory pour créer les pompiers
firefighterPositions = new ArrayList<>();
List<FireFighter> firefighters = firefighterFactory.createElements(rowCount, columnCount);
for (FireFighter firefighter : firefighters) {
firefighterPositions.add(firefighter.getPosition());
}
}
private Position randomPosition(int rowCount, int columnCount, Random randomGenerator) {
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
}
public List<Position> updateFires() {
List<Position> modifiedPositions = new ArrayList<>();
if (step % 2 == 0) {
List<Position> newFirePositions = new ArrayList<>();
for (Position fire : firePositions) {
newFirePositions.addAll(neighbors.get(fire));
}
firePositions.addAll(newFirePositions);
modifiedPositions.addAll(newFirePositions);
}
return modifiedPositions;
}
public List<Position> updateFirefighters() {
List<Position> modifiedPositions = new ArrayList<>();
List<Position> newFirefighterPositions = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) {
Position newFirefighterPosition = targetStrategy.neighborClosestToTarget(firefighterPosition, firePositions, neighbors);
newFirefighterPositions.add(newFirefighterPosition);
extinguish(newFirefighterPosition);
modifiedPositions.add(firefighterPosition);
modifiedPositions.add(newFirefighterPosition);
List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
.filter(firePositions::contains).toList();
for (Position firePosition : neighborFirePositions) {
extinguish(firePosition);
}
modifiedPositions.addAll(neighborFirePositions);
}
firefighterPositions = newFirefighterPositions;
return modifiedPositions;
}
private void extinguish(Position position) {
firePositions.remove(position);
}
public Set<Position> getFirePositions() {
return firePositions;
}
public List<Position> getFirefighterPositions() {
return firefighterPositions;
}
public void incrementStep() {
step++;
}
@Override
public int stepNumber() {
return step;
}
@Override
public List<Position> updateToNextGeneration() {
List<Position> modifiedPositions = updateFirefighters();
modifiedPositions.addAll(updateFires());
incrementStep();
return modifiedPositions;
}
@Override
public void reset() {
this.step=0;
}
}