Skip to content
Snippets Groups Projects
FireFighters.java 2.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • ABDELMOUDJIB Mohammed el amine's avatar
    ABDELMOUDJIB Mohammed el amine committed
    package Fighters;
    
    
    import Activation.Activation;
    
    ABDELMOUDJIB Mohammed el amine's avatar
    ABDELMOUDJIB Mohammed el amine committed
    import Fighters.AntiFire;
    
    import Position.Position;
    
    
    import javax.swing.*;
    
    ABDELMOUDJIB Mohammed el amine's avatar
    ABDELMOUDJIB Mohammed el amine committed
    import java.util.*;
    
    
    public class FireFighters extends AntiFire implements Activation {
    
    ABDELMOUDJIB Mohammed el amine's avatar
    ABDELMOUDJIB Mohammed el amine committed
        int colCount, rowCount;
    
        List<Position> firefighters = new ArrayList<>();
        Set<Position> fires = new HashSet<>();
    
        List<Position> ffNewPositions;
    
    ABDELMOUDJIB Mohammed el amine's avatar
    ABDELMOUDJIB Mohammed el amine committed
    
    
    
        @Override
        public Position activateFight(Position position) {
            Position randomPosition = moveTowardFire(position);
    
    ABDELMOUDJIB Mohammed el amine's avatar
    ABDELMOUDJIB Mohammed el amine committed
            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()));
    
    ABDELMOUDJIB Mohammed el amine's avatar
    ABDELMOUDJIB Mohammed el amine committed
            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;
        }