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

FireManager.java

Blame
  • 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.
    SimpleFireSpreadStrategy.java 2.30 KiB
    package model;
    
    import util.Position;
    import java.util.*;
    
    public class SimpleFireSpreadStrategy implements Strategy {
        private final Set<Position> firePositions;
        private final Map<Position, List<Position>> neighbors;
        private final Set<Position> mountainPositions;
        private final Set<Position> roadPositions;
        private final Set<Position> rocksPositions;
        private final int step;
    
        public SimpleFireSpreadStrategy(Set<Position> firePositions, Map<Position, List<Position>> neighbors,Set<Position> moutainsPositions,Set<Position> roadPositions,Set<Position> rocksPositions, int step) {
            this.firePositions = firePositions;
            this.neighbors = neighbors;
            this.mountainPositions = moutainsPositions;
            this.roadPositions = roadPositions;
            this.rocksPositions = rocksPositions;
            this.step = step;
        }
    
        @Override
        public List<Position> update() {
            if(step %2 != 0){
                return Collections.emptyList();
            }
            List<Position> modifiedPositions = new ArrayList<>();
            Set<Position> newFirePositions = new HashSet<>();
    
            for (Position firePosition : firePositions) {
                spreadFire(firePosition, newFirePositions);
            }
            firePositions.addAll(newFirePositions);
            modifiedPositions.addAll(newFirePositions);
            return modifiedPositions;
        }
        private void spreadFire(Position firePosition, Set<Position> newFirePositions) {
            List<Position> potentialPositions = neighbors.getOrDefault(firePosition, Collections.emptyList());
            for (Position potentialPosition : potentialPositions) {
                if (canPropagateTo(potentialPosition)) {
                    newFirePositions.add(potentialPosition);
                }
            }
        }
        private boolean canPropagateTo(Position newPosition) {
            if(mountainPositions.contains(newPosition) || roadPositions.contains(newPosition)){
                return false;
            }
            if (rocksPositions.contains(newPosition)){
                return step % 4 ==0;
            }
            return true;
        }
    
        @Override
        public List<Position> getModelPositions() {
            throw new UnsupportedOperationException("Fire positions can't be accessed as Model Positions.");
        }
    
        @Override
        public Set<Position> getFirePositions() {
            return firePositions;
        }
    }