Skip to content
Snippets Groups Projects
FirefighterBehavior.java 2.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • import util.Position;
    import util.TargetStrategy;
    
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
    import java.util.*;
    
    
    public class FirefighterBehavior extends FFBehavior implements TangibleBehavior<ModelElement>,RemoverBehavior<ModelElement> {
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
        List<ModelElement> obstacles=List.of(ModelElement.MOUNTAIN);
    
        ModelElement removedElement=ModelElement.FIRE;
        TargetStrategy targetStrategy=new TargetStrategy();
    
        public FirefighterBehavior(ModelElement modelElement) {
            super(modelElement);
        }
    
    
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
        public List<Position> getNext(BoardData boardData) {
    
            List<Position> firefighterPositions = boardData.getPositions().get(element.ordinal());
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
            List<Position> firePositions = new ArrayList<>(List.copyOf(boardData.getPositions().get(ModelElement.FIRE.ordinal())));
    
            List<Position> firefighterNewPositions = new ArrayList<>();
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
            Map<Position,List<Position>> neigbours=legalNeighbors(boardData);
    
            for (Position firefighterPosition : firefighterPositions) {
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
                Position newFirefighterPosition = targetStrategy.neighborClosestToFire(firefighterPosition,firePositions, neigbours);
    
                firefighterNewPositions.add(newFirefighterPosition);
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
                firePositions.remove(newFirefighterPosition);
                firePositions.remove(boardData.getNeighbors().get(newFirefighterPosition));
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
            return firefighterNewPositions;
        }
        public List<Position> remove(BoardData boardData,Position p){
            List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal());
            List<Position> neighborFirePositions = boardData.getNeighbors().get(p).stream()
                    .filter(firePositions::contains).toList();
            removePartial(boardData,p);
            for (Position firePosition : neighborFirePositions)
                removePartial(boardData,firePosition);
            return neighborFirePositions;
    
    
        @Override
        public List<ModelElement> getObstacles() {
            return obstacles;
        }
    
        @Override
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
        public void removePartial(BoardData boardData,Position p) {
    
            List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal());
            firePositions.remove(p);
        }
    
    
    BACHTARZI Imed eddine's avatar
    BACHTARZI Imed eddine committed
        @Override
        public Map<Position, List<Position>> legalNeighbors(BoardData boardData) {
            Map<Position,List<Position>> neigbours= Map.copyOf(super.legalNeighbors(boardData));
            for (Map.Entry<Position,List<Position>> entry: neigbours.entrySet()) {
                for (ModelElement e:getObstacles()) {
                    entry.getValue().removeAll(boardData.getPositions().get(e.ordinal()));
                }
            }
            return neigbours;
        }
    
    
        @Override
        public ModelElement getElementToRemove() {
            return removedElement;