Select Git revision
TestAutomaticElevatorSimple.java
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
FireFighterMovements.java 3.38 KiB
package model.ExtinguishFire;
import model.ElementFactory;
import model.Movements;
import util.Position;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import static model.Board.BoardFireFighterBehavior.*;
public class FireFighterMovements implements Movements {
private final ElementFactory<FireFighter> firefighterFactory;
private List<Position> firefighterPositions;
public FireFighterMovements(ElementFactory<FireFighter> firefighterFactory) {
this.firefighterFactory = firefighterFactory;
this.firefighterPositions = new ArrayList<>();
}
@Override
public List<Position> updateElements() {
List<Position> modifiedPositions = new ArrayList<>();
List<Position> newFirefighterPositions = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) {
// Calcul de la position vers laquelle le pompier devrait se déplacer
Position newFirefighterPosition =getTargetStrategy().neighborClosestToTarget(firefighterPosition, getFireMovements().getPositions(), getNeighbors());
// Vérification si la position cible est valide pour le mouvement
if (canMoveTo(newFirefighterPosition, (Set<Position>) getFireMovements().getPositions(), firefighterPositions)) {
// Si le déplacement est valide, on met à jour la position du pompier
newFirefighterPositions.add(newFirefighterPosition);
// Éteindre le feu à la nouvelle position
extinguish(newFirefighterPosition);
modifiedPositions.add(firefighterPosition);
modifiedPositions.add(newFirefighterPosition);
// Vérification des voisins et extinction des feux voisins
List<Position> neighborFirePositions = getNeighbors().get(newFirefighterPosition).stream()
.filter(getFireMovements().getPositions()::contains).toList();
// Log pour débogage
System.out.println("Pompiers se déplacent de " + firefighterPosition + " vers " + newFirefighterPosition);
// Éteindre les feux voisins
for (Position firePosition : neighborFirePositions) {
extinguish(firePosition);
modifiedPositions.add(firePosition); // Ajout des feux éteints dans la liste des positions modifiées
}
} else {
// Si la position n'est pas valide, le pompier reste sur place
newFirefighterPositions.add(firefighterPosition);
System.out.println("Pompier ne peut pas se déplacer à " + newFirefighterPosition + ", il reste à " + firefighterPosition);
}
}
// Mettre à jour la liste des positions des pompiers
firefighterPositions = newFirefighterPositions;
return modifiedPositions;
}
@Override
public void initializeElement(int rowCount, int columnCount) {
// Pompiers
firefighterPositions = new ArrayList<>();
List<FireFighter> firefighters = firefighterFactory.createElements(rowCount, columnCount);
for (FireFighter firefighter : firefighters) {
firefighterPositions.add(firefighter.getPosition());
}
}
@Override
public Collection<Position> getPositions() {
return firefighterPositions;
}
}