Skip to content
Snippets Groups Projects
Select Git revision
  • a152b729204d4f0f7f9b058bdcd82d32e255c2aa
  • main default protected
  • correction_video
  • going_further
  • ImprovedMouseInteraction
  • final2023
  • template
  • ModifGUI
8 results

CellularAutomatonSimulation.java

Blame
  • Forked from LABOUREL Arnaud / Game of life Template
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    FirefighterBoard.java 4.34 KiB
    package model;
    
    import util.Position;
    
    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;
      private final model.TargetStrategy targetStrategy = new model.TargetStrategy();
      private List<Firefighter> firefighters;
      private Fire fire;
      private final Map<Position, List<Position>> neighbors = new HashMap<>();
      private final Position[][] positions;
      private int step = 0;
      private final Random randomGenerator = new Random();
    
      public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
        this.columnCount = columnCount;
        this.rowCount = rowCount;
        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);
          }
        this.initialFireCount = initialFireCount;
        this.initialFirefighterCount = initialFirefighterCount;
        initializeElements();
      }
    
      public void initializeElements() {
        firefighters = new ArrayList<>();
        Set<Position> firePositions = new HashSet<>();
        for (int index = 0; index < initialFireCount; index++)
          firePositions.add(randomPosition());
        fire = new Fire(firePositions, neighbors);
        for (int index = 0; index < initialFirefighterCount; index++)
          firefighters.add(new Firefighter(randomPosition()));
      }
    
      private Position randomPosition() {
        return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
      }
    
      @Override
      public List<ModelElement> getState(Position position) {
        List<ModelElement> result = new ArrayList<>();
        for (Firefighter firefighter : firefighters)
          if (firefighter.getPosition().equals(position))
            result.add(ModelElement.FIREFIGHTER);
        if (fire.getFirePositions().contains(position))
          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();
        if (step % 2 == 0){
          modifiedPositions.addAll(fire.spreadFire());
        }
        step++;
    
        return modifiedPositions;
      }
    
      @Override
      public int stepNumber() {
        return step;
      }
    
      private List<Position> updateFirefighters() {
        List<Position> modifiedPosition = new ArrayList<>();
        for (Firefighter firefighter : firefighters) {
    
          modifiedPosition.add(firefighter.getPosition());
    
          Position newPosition = firefighter.moveToBestPosition(targetStrategy, fire.getFirePositions(), neighbors);
          firefighter.setPosition(newPosition);
    
          modifiedPosition.add(newPosition);
    
          firefighter.extinguish(newPosition, fire.getFirePositions());
    
          // Éteindre les feux dans les positions voisines
          List<Position> adjacentFires = neighbors.get(newPosition).stream()
                  .filter(fire.getFirePositions()::contains)
                  .toList();
          for (Position firePosition : adjacentFires) {
            firefighter.extinguish(firePosition, fire.getFirePositions());
            modifiedPosition.add(firePosition); // Ajouter la position comme modifiée
          }
    
        }
        return modifiedPosition;
      }
    
      @Override
      public void reset() {
        step = 0;
        initializeElements();
      }
    
      @Override
      public void setState(List<ModelElement> state, Position position) {
        fire.getFirePositions().remove(position);
        firefighters.removeIf(f -> f.getPosition().equals(position));
        for (ModelElement element : state) {
          switch (element) {
            case FIRE -> fire.getFirePositions().add(position);
            case FIREFIGHTER -> firefighters.add(new Firefighter(position));
          }
        }
      }
    }