Skip to content
Snippets Groups Projects
FirefighterBoard.java 14.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
    package model;
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
    import javafx.util.Pair;
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
    import static model.ModelElement.CLOUD;
    
    
    public class FirefighterBoard implements Board<List<ModelElement>> {
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        private final int columnCount;
        private final int rowCount;
        private final int initialFireCount;
        private final int initialFirefighterCount;
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
        private final int initialRoadCount;
        private final int initialcloudCount;
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
        private final int initialmountainsCount;
    
        private final int initialrocksCount;
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
    
        private List<Position> firefighterPositions;
        private Set<Position> firePositions;
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
        private Set<Position> roadPositions;
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        private final Map<Position, List<Position>> neighbors;
        private final Position[][] positions;
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
        private List<Position> cloudPositions;
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
        private Set<Position> moutainsPositions;
    
        private Set<Position> rocksPositions;
    
    Chadi's avatar
    Chadi committed
    
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        private int step = 0;
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        // Constructor for FirefighterBoard
    
        public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialRoadCount, int initialcloudCount, int initialmountainsCount, int initialrocksCount) {
    
            this.columnCount = columnCount;
            this.rowCount = rowCount;
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            this.initialFireCount = initialFireCount;
            this.initialFirefighterCount = initialFirefighterCount;
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
            this.initialRoadCount = initialRoadCount;
            this.initialcloudCount = initialcloudCount;
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
            this.initialmountainsCount = initialmountainsCount;
    
            this.initialrocksCount = initialrocksCount;
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            this.positions = new Position[rowCount][columnCount];
            this.firefighterPositions = new ArrayList<>();
            this.firePositions = new HashSet<>();
            this.neighbors = new HashMap<>();
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
            this.cloudPositions = new ArrayList<>();
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
            this.moutainsPositions = new HashSet<>();
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
            this.roadPositions = new HashSet<>();
    
            this.rocksPositions = new HashSet<>();
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            initializeBoard();
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        private void initializeBoard() {
            Random random = new Random();
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            // Initialize fire positions
            for (int i = 0; i < initialFireCount; i++) {
                firePositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            // Initialize firefighter positions
            for (int i = 0; i < initialFirefighterCount; i++) {
                firefighterPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
            // Initialize road positions
            for (int i = 0; i < initialRoadCount; i++) {
                roadPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
            }
            // Initialize road positions
            for (int i = 0; i < initialcloudCount; i++) {
                cloudPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
            }
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
            // Initialize Moutains Positions
            for (int i = 0; i < initialmountainsCount; i++) {
                moutainsPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
            }
    
            // Initialize rocks positions
            for (int i = 0; i < initialrocksCount; i++) {
                rocksPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
            }
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            // Initialize neighbors map
            for (int row = 0; row < rowCount; row++) {
                for (int col = 0; col < columnCount; col++) {
                    positions[row][col] = new Position(row, col);
                    neighbors.put(positions[row][col], calculateNeighbors(row, col));
                }
            }
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        private List<Position> calculateNeighbors(int row, int col) {
            List<Position> adjacentPositions = new ArrayList<>();
            if (row > 0) adjacentPositions.add(new Position(row - 1, col));  // Top neighbor
            if (col > 0) adjacentPositions.add(new Position(row, col - 1));  // Left neighbor
            if (row < rowCount - 1) adjacentPositions.add(new Position(row + 1, col));  // Bottom neighbor
            if (col < columnCount - 1) adjacentPositions.add(new Position(row, col + 1));  // Right neighbor
            return adjacentPositions;
        }
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        @Override
        public List<ModelElement> getState(Position position) {
            List<ModelElement> result = new ArrayList<>();
    
            for (ModelElement element : ModelElement.values()){
                switch (element){
                    case FIRE -> {
                        if (firePositions.contains(position)) {
                            result.add(ModelElement.FIRE);
                        }
                    }
                    case FIREFIGHTER -> {
                        if (firefighterPositions.contains(position)) {
                            result.add(ModelElement.FIREFIGHTER);
                        }
                    }
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
                    case CLOUD -> {
                        if (cloudPositions.contains(position)) {
                            result.add(ModelElement.CLOUD);
                        }
                    }
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
                    case ROAD -> {
                        if (roadPositions.contains(position)) {
                            result.add(ModelElement.ROAD);
                        }
                    }
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
                    case MOUTAIN -> {
                        if (moutainsPositions.contains(position)) {
                            result.add(ModelElement.MOUTAIN);
                        }
                    }
    
                    case ROCKS -> {
                        if (rocksPositions.contains(position)) {
                            result.add(ModelElement.ROCKS);
                        }
                    }
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
                    default ->{
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            return result;
    
        }
    
        @Override
        public int rowCount() {
            return rowCount;
        }
    
        @Override
        public int columnCount() {
            return columnCount;
        }
    
        @Override
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        public int stepNumber() {
            return step;
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            step = 0;
    
            Initializer initializer = new Initializer(columnCount,rowCount,initialFireCount,initialFirefighterCount, initialRoadCount,initialcloudCount, initialmountainsCount, initialrocksCount);
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
            resetPos(firePositions,initializer.getFirePositions());
            resetPos(firefighterPositions,initializer.getFirefighterPositions());
            resetPos(cloudPositions,initializer.getCloudPositions());
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
            resetPos(moutainsPositions,initializer.getMountainsPositions());
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
            resetPos(roadPositions,initializer.getRoadPositions());
    
            resetPos(rocksPositions,initializer.getRoadPositions());
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
    
            neighbors.clear();
            neighbors.putAll(initializer.getNeighbors());
    
            initializeBoard();
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
        private <S> void resetPos(Collection<S> currentPositions, Collection<S> newPositions) {
            currentPositions.clear();
            currentPositions.addAll(newPositions);
      }
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        public void setState(List<ModelElement> state, Position position) {
            firePositions.remove(position);
            firefighterPositions.remove(position);
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            for (ModelElement element : state) {
                switch (element) {
                    case FIRE -> firePositions.add(position);
                    case FIREFIGHTER -> firefighterPositions.add(position);
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
                    case CLOUD -> cloudPositions.add(position);
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
                }
            }
        }
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        @Override
        public List<Position> updateToNextGeneration() {
    
            List<ModelElement> elements = List.of(
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
                    ModelElement.FIRE,
                    ModelElement.FIREFIGHTER,
                    ModelElement.CLOUD
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            List<Position> modifiedPositions = new ArrayList<>();
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
            for(ModelElement element : elements) {
                Strategy strategy = switch(element) {
    
                    case FIRE -> new SimpleFireSpreadStrategy(firePositions, neighbors,moutainsPositions,roadPositions, rocksPositions,step);
    
                    case FIREFIGHTER -> new FirefighterMovementStrategy(firefighterPositions,firePositions,neighbors);
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
                    case CLOUD -> new CloudStrategy(cloudPositions,firePositions,neighbors,rowCount,columnCount);
    
                    default -> throw new IllegalStateException("Type de modèle inconnu : " + element);
                };
                modifiedPositions.addAll(strategy.update());
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
                switch (element) {
                    case FIRE -> firePositions = strategy.getFirePositions();
                    case FIREFIGHTER -> firefighterPositions = strategy.getModelPositions();
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
                    case CLOUD -> cloudPositions = strategy.getModelPositions();
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            step++;
            return modifiedPositions;
        }
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
        public List<Pair<Position, ModelElement>> getUpdatedElements() {
            List<Pair<Position, ModelElement>> updatedElements = new ArrayList<>();
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            // Add fire positions
            for (Position firePosition : firePositions) {
                updatedElements.add(new Pair<>(firePosition, ModelElement.FIRE));
            }
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            // Add firefighter positions
            for (Position firefighterPosition : firefighterPositions) {
                updatedElements.add(new Pair<>(firefighterPosition, ModelElement.FIREFIGHTER));
            }
    
            for (Position cloudPosition : cloudPositions) {
                updatedElements.add(new Pair<>(cloudPosition, ModelElement.CLOUD));
            }
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
            // Add firefighter positions
            for (Position cloudPosition : cloudPositions) {
                updatedElements.add(new Pair<>(cloudPosition, ModelElement.CLOUD));
            }
            for (Position roadPosition : roadPositions) {
                updatedElements.add(new Pair<>(roadPosition, ModelElement.ROAD));
            }
    
    MANSOUR Chadi's avatar
    MANSOUR Chadi committed
            for (Position moutainPosition : moutainsPositions){
                updatedElements.add(new Pair<>(moutainPosition, ModelElement.MOUTAIN));
            }
    
            for (Position rockPosition : rocksPositions){
                updatedElements.add(new Pair<>(rockPosition,ModelElement.ROCKS));
            }
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
    CHAHINE Rami's avatar
    .  
    CHAHINE Rami committed
            return updatedElements;
        }
    }
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
    import java.util.*;
    
    
    public class FirefighterBoard implements Board<List<ModelElement>> {
      private final int columnCount;
      private final int rowCount;
      private final int initialFireCount;
      private final int initialFirefighterCount;
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
      private final TargetStrategy targetStrategy = new TargetStrategy();
    
      private List<Position> firefighterPositions;
      private Set<Position> firePositions;
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
      private Map<Position, List<Position>> neighbors = new HashMap();
      private final Position[][] positions;
    
      private int step = 0;
      private final Random randomGenerator = new Random();
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
    
      public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
        this.columnCount = columnCount;
        this.rowCount = rowCount;
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
        this.positions = new Position[rowCount][columnCount];
        for (int column = 0; column < columnCount; column++)
          for (int row = 0; row < rowCount; row++)
            positions[row][column] = new Position(row, column);
        for (int column = 0; column < columnCount; column++)
          for (int row = 0; row < rowCount; row++) {
            List<Position> list = new ArrayList<>();
            if (row > 0) list.add(positions[row - 1][column]);
            if (column > 0) list.add(positions[row][column - 1]);
            if (row < rowCount - 1) list.add(positions[row + 1][column]);
            if (column < columnCount - 1) list.add(positions[row][column + 1]);
            neighbors.put(positions[row][column], list);
          }
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        this.initialFireCount = initialFireCount;
        this.initialFirefighterCount = initialFirefighterCount;
        initializeElements();
      }
    
      public void initializeElements() {
        firefighterPositions = new ArrayList<>();
        firePositions = new HashSet<>();
        for (int index = 0; index < initialFireCount; index++)
          firePositions.add(randomPosition());
        for (int index = 0; index < initialFirefighterCount; index++)
          firefighterPositions.add(randomPosition());
      }
    
      private Position randomPosition() {
    
        return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
      }
    
      @Override
      public List<ModelElement> getState(Position position) {
        List<ModelElement> result = new ArrayList<>();
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
        for (Position firefighterPosition : firefighterPositions)
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
          if (firefighterPosition.equals(position))
            result.add(ModelElement.FIREFIGHTER);
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
        if (firePositions.contains(position))
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
          result.add(ModelElement.FIRE);
        return result;
      }
    
      @Override
      public int rowCount() {
        return rowCount;
      }
    
      @Override
      public int columnCount() {
        return columnCount;
      }
    
      public List<Position> updateToNextGeneration() {
    
        List<Position> modifiedPositions = updateFirefighters();
        modifiedPositions.addAll(updateFires());
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        step++;
    
        return modifiedPositions;
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
      private List<Position> updateFires() {
    
        List<Position> modifiedPositions = new ArrayList<>();
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        if (step % 2 == 0) {
          List<Position> newFirePositions = new ArrayList<>();
          for (Position fire : firePositions) {
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
            newFirePositions.addAll(neighbors.get(fire));
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
          }
          firePositions.addAll(newFirePositions);
    
          modifiedPositions.addAll(newFirePositions);
    
        return modifiedPositions;
    
      @Override
      public int stepNumber() {
        return step;
      }
    
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
      private List<Position> updateFirefighters() {
    
        List<Position> modifiedPosition = new ArrayList<>();
    
        List<Position> firefighterNewPositions = new ArrayList<>();
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        for (Position firefighterPosition : firefighterPositions) {
    
    couetoux.b's avatar
    couetoux.b committed
          Position newFirefighterPosition =
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
                  targetStrategy.neighborClosestToFire(firefighterPosition,
                          firePositions, neighbors);
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
          firefighterNewPositions.add(newFirefighterPosition);
          extinguish(newFirefighterPosition);
    
          modifiedPosition.add(firefighterPosition);
          modifiedPosition.add(newFirefighterPosition);
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
          List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
    
                  .filter(firePositions::contains).toList();
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
          for (Position firePosition : neighborFirePositions)
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
            extinguish(firePosition);
    
          modifiedPosition.addAll(neighborFirePositions);
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        }
        firefighterPositions = firefighterNewPositions;
    
        return modifiedPosition;
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
      }
    
      @Override
      public void reset() {
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        initializeElements();
      }
    
      private void extinguish(Position position) {
        firePositions.remove(position);
      }
    
    
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
      @Override
      public void setState(List<ModelElement> state, Position position) {
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        firePositions.remove(position);
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
        for (; ; ) {
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
          if (!firefighterPositions.remove(position)) break;
        }
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
        for (ModelElement element : state) {
          switch (element) {
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
            case FIRE -> firePositions.add(position);
            case FIREFIGHTER -> firefighterPositions.add(position);
          }
        }
      }
    
    CHAHINE Rami's avatar
    CHAHINE Rami committed
    }*/