Select Git revision
TargetStrategy.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.
FireFighter.java 4.41 KiB
package model;
import java.util.ArrayList;
import java.util.List;
import javafx.scene.paint.Color;
import util.Position;
import util.PositionUtil;
public class FireFighter implements Entity{
private int age;
private Position position;
private final Color viewColor = Color.BLUE;
public FireFighter(Position position, Board<Entity> b){
this.position = position;
this.age = 0;
}
public FireFighter(Position position, Board<Entity> b, int age){
this.position = position;
this.age = age;
}
public List<Position> nextTurn(Board<Entity> b) {
List<Position> positions = new ArrayList<>();
// Générer les positions adjacentes
List<Position> adjacentPositions = PositionUtil.generateAdjacentPositions(position, b);
// Vérifier s'il y a du feu dans une des positions adjacentes
boolean hasFire = adjacentPositions.stream()
.anyMatch(p -> b.getState(p) instanceof Fire);
if (hasFire) {
// Si du feu est trouvé, on éteint les feux adjacents
positions.addAll(extinguish(adjacentPositions, b));
} else {
// Chercher la position du feu le plus proche
Position nearestFirePos = b.getNearestEntity(position, Fire.class);
if (nearestFirePos != null && !nearestFirePos.equals(position)) {
// Trouver la meilleure position pour se rapprocher du feu
Position nextPos = getNextPositionTowards(position, nearestFirePos, b);
if (nextPos != null) {
// Mettre à jour la position du pompier
b.clearCase(position); // Vider l'ancienne case
positions.add(new Position(position.x(), position.y()));
this.position = nextPos;
b.setState(this, nextPos); // Mettre à jour la nouvelle case
positions.add(nextPos);
adjacentPositions = PositionUtil.generateAdjacentPositions(nextPos, b);
positions.addAll(extinguish(adjacentPositions, b));
}
// Aucun déplacement possible = le pompier reste sur place
}
}
return positions;
}
private List<Position> extinguish(List<Position> adjacentPositions, Board<Entity> b) {
List<Position> extinguishedPositions = new ArrayList<>();
for (Position p : adjacentPositions) {
if (b.getState(p) instanceof Fire) {
b.clearCase(p);
extinguishedPositions.add(p); // Ajouter la position où le feu a été éteint
}
}
return extinguishedPositions;
}
private Position getNextPositionTowards(Position currentPos, Position targetPos, Board<Entity> b) {
// Générer les 8 positions adjacentes possibles
List<Position> possibleMoves = PositionUtil.generateAllAdjacentPositions(currentPos, b);
// Filtrer les positions qui sont libres
possibleMoves.removeIf(p -> !(b.getState(p) instanceof EmptySquare));
// Si aucune position libre n'est disponible, retourner null
if (possibleMoves.isEmpty()) {
return null;
}
// Calculer la distance actuelle vers la cible
int currentDistance = PositionUtil.getManhattanDistance(currentPos, targetPos);
// Choisir la position libre qui réduit le plus la distance vers le feu
Position bestMove = null;
int minDistance = currentDistance;
for (Position move : possibleMoves) {
int distance = PositionUtil.getManhattanDistance(move, targetPos);
if (distance < minDistance) {
minDistance = distance;
bestMove = move;
}
}
// Si aucun déplacement ne réduit la distance, annuler le déplacement
if (bestMove == null) {
return null;
}
return bestMove;
}
@Override
public void setPosition(Position p) {
this.position = p;
}
@Override
public Position getPosition() {
return this.position;
}
public Color getViewColor(){
return this.viewColor;
}
@Override
public int getAge() {
return this.age;
}
@Override
public void incrementAge() {
this.age = age + 1 ;
}
}