Select Git revision
Forked from
LABOUREL Arnaud / M1 INFO FSI TP Template
Source project has a limited visibility.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
FirefighterMovementStrategy.java 2.11 KiB
package model;
import util.Position;
import util.TargetStrategy;
import java.util.*;
public class FirefighterMovementStrategy implements Strategy {
private final TargetStrategy targetStrategy = new TargetStrategy();
private List<Position> firefighterPositions;
private final Set<Position> firePositions;
private final Map<Position, List<Position>> neighbors;
public FirefighterMovementStrategy(List<Position> firefighterPositions, Set<Position> firePositions, Map<Position, List<Position>> neighbors) {
this.firefighterPositions = firefighterPositions;
this.firePositions = firePositions;
this.neighbors = neighbors;
}
@Override
public List<Position> update() {
List<Position> modifiedPositions = new ArrayList<>();
List<Position> newFirefighterPositions = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) {
Position nextPosition = NextValidPosition(firefighterPosition);
List<Position> firesToExtinguish = new ArrayList<>(neighbors.getOrDefault(nextPosition, List.of()));
firesToExtinguish.add(nextPosition);
firesToExtinguish.removeIf(pos -> !firePositions.contains(pos));
extinguishAll(firesToExtinguish);
modifiedPositions.addAll(firesToExtinguish);
// Update positions
newFirefighterPositions.add(nextPosition);
modifiedPositions.add(firefighterPosition);
modifiedPositions.add(nextPosition);
}
firefighterPositions = newFirefighterPositions;
return modifiedPositions;
}
private Position NextValidPosition(Position currentPosition) {
Position target = targetStrategy.neighborClosestToFire(currentPosition, firePositions, neighbors);
return target;
}
private void extinguishAll(List<Position> positions) {
firePositions.removeAll(positions);
}
@Override
public List<Position> getModelPositions() {
return firefighterPositions;
}
@Override
public Set<Position> getFirePositions() {
return firePositions;
}
}