Skip to content
Snippets Groups Projects
Select Git revision
  • ba1ad89c335fd2aff1a067bd884ab44869c962a8
  • main default protected
  • variant
3 results

FireFighterPerson.java

Blame
  • Forked from LABOUREL Arnaud / Firefighter 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;
        }
    }