Select Git revision
Forked from
NASR Alexis / Programmation2
Source project has a limited visibility.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
MotorizedMovements.java 3.06 KiB
package model;
import util.Position;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static model.BoardFireFighterBehavior.*;
public class MotorizedMovements implements Movements{
private final ElementFactory<MotorizedFireFighter> motorizedFactory;
private List<Position> motorizedFighters;
public MotorizedMovements(ElementFactory<MotorizedFireFighter> motorizedFactory) {
this.motorizedFactory = motorizedFactory;
this.motorizedFighters = new ArrayList<>();
}
@Override
public List<Position> updateElements() {
List<Position> modifiedPositions = new ArrayList<>();
List<Position> newPositions = new ArrayList<>();
for (Position currentPosition : motorizedFighters) {
// Vérification de validité de la position actuelle
if (!getNeighbors().containsKey(currentPosition)) {
System.err.println("Position actuelle invalide : " + currentPosition);
newPositions.add(currentPosition);
continue;
}
// Étape 1 : Calcul du premier déplacement
Position firstStep = getTargetStrategy().neighborClosestToTarget(currentPosition, fireMovements.getPositions(), getNeighbors());
if (firstStep == null || !getNeighbors().containsKey(firstStep)) {
// Aucun déplacement possible, rester sur place
System.out.println("Pas de première étape possible pour : " + currentPosition);
newPositions.add(currentPosition);
continue;
}
// Étape 2 : Calcul du deuxième déplacement
Position secondStep = getTargetStrategy().neighborClosestToTarget(firstStep, fireMovements.getPositions(), getNeighbors());
Position finalPosition = (secondStep != null && getNeighbors().containsKey(secondStep)) ? secondStep : firstStep;
// Ajout de la position finale aux nouvelles positions
newPositions.add(finalPosition);
// Mise à jour des positions modifiées
modifiedPositions.add(currentPosition); // Ancienne position
modifiedPositions.add(finalPosition); // Nouvelle position
// Étape 3 : Éteindre les feux à la position finale
extinguish(finalPosition);
extinguishNearbyFires(finalPosition, modifiedPositions);
}
// Mettre à jour les positions globales
motorizedFighters = newPositions;
return modifiedPositions;
}
@Override
public void initializeElement(int rowCount, int columnCount) {
motorizedFighters = new ArrayList<>();
List<MotorizedFireFighter> motorizedFirefighters = motorizedFactory.createElements(rowCount, columnCount);
for (MotorizedFireFighter motorizedFirefighter : motorizedFirefighters) {
motorizedFighters.add(motorizedFirefighter.getPosition());
}
}
@Override
public Collection<Position> getPositions() {
return this.motorizedFighters;
}
}