Skip to content
Snippets Groups Projects
Select Git revision
  • 195ac475da5d3c8e15914a1201dc904c5b1eef52
  • main default protected
  • aimen_nabi
  • variant
4 results

FireFighters.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.
    FireFighters.java 2.44 KiB
    package Fighters;
    
    import Activation.Activation;
    import Fighters.AntiFire;
    
    import Position.Position;
    
    import javax.swing.*;
    import java.util.*;
    
    public class FireFighters extends AntiFire implements Activation {
        int colCount, rowCount;
        List<Position> firefighters = new ArrayList<>();
        Set<Position> fires = new HashSet<>();
    
        List<Position> ffNewPositions;
    
    
    
        @Override
        public Position activateFight(Position position) {
            Position randomPosition = moveTowardFire(position);
    
            List<Position> nextFires = next(randomPosition).stream().filter(fires::contains).toList();
            extinguish(randomPosition);
            for (Position fire : nextFires)
                extinguish(fire);
            return randomPosition;
        }
    
    
        @Override
        public List<Position> next(Position position) {
            List<Position> list = new ArrayList<>();
    
            if(position.row()>0) list.add(new Position(position.row()-1, position.col()));
            if(position.col()>0) list.add(new Position(position.row(), position.col()-1));
            if(position.row()<rowCount-1) list.add(new Position(position.row()+1, position.col()));
            if(position.col()<colCount-1) list.add(new Position(position.row(), position.col()+1));
            return list;
        }
    
        @Override
        public Position moveTowardFire(Position position) {
            Queue<Position> toVisit = new LinkedList<>();
            Set<Position> seen = new HashSet<>();
            HashMap<Position,Position> firstMove = new HashMap<>();
            toVisit.addAll(next(position));
            for(Position initialMove : toVisit)
                firstMove.put(initialMove,initialMove);
            while(!toVisit.isEmpty()){
                Position current = toVisit.poll();
                if(fires.contains(current))
                    return firstMove.get(current);
                for(Position adjacent : next(current)){
                    if(seen.contains(adjacent)) continue;
                    toVisit.add(adjacent);
                    seen.add(adjacent);
                    firstMove.put(adjacent, firstMove.get(current));
                }
            }
            return position;
        }
    
        @Override
        public void activation() {
            ffNewPositions = new ArrayList<>();
            for(Position ff : firefighters){
                Position newPosition = activateFight(ff);
    
                grid.paint(ff.row(),ff.col());
                grid.paintFF(newPosition.row(), newPosition.col());
                ffNewPositions.add(newPosition);
            }
            firefighters = ffNewPositions;
        }
    }