Skip to content
Snippets Groups Projects
Select Git revision
  • b37c71b1351d502639ba20f973f3e98eb169665b
  • main default protected
  • correction_video
  • going_further
  • ImprovedMouseInteraction
  • final2023
  • template
  • ModifGUI
8 results

CellularAutomatonSimulation.java

Blame
  • Forked from YAGOUBI Rim / Game of life Template
    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 ;
        }
    
        
    }