Skip to content
Snippets Groups Projects
FirefighterBoard.java 3.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
    package model;
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
    import util.Position;
    
    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 Map<Position, Fire> fires = new HashMap<>();
      private Map<Position, Extinguisher> extinguishers = new HashMap<>();
      private Map<Position, Obstacle> obstacles = new HashMap<>();
    
    MEHDI's avatar
    MEHDI committed
    
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
      private final Position[][] positions;
    
      private int step = 0;
      private final Random randomGenerator = new Random();
    
    MEHDI's avatar
    MEHDI committed
    
    
      public FirefighterBoard(int columnCount, int rowCount) {
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        this.columnCount = columnCount;
        this.rowCount = rowCount;
    
    COUETOUX Basile's avatar
    COUETOUX Basile committed
        this.positions = new Position[rowCount][columnCount];
    
    MEHDI's avatar
    MEHDI committed
    
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        initializeElements();
      }
    
    
        for (int column = 0; column < columnCount; column++) {
          for (int row = 0; row < rowCount; row++) {
            positions[row][column] = new Position(row, column);
          }
        }
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
      public void initializeElements() {
    
        obstacles.clear();
        extinguishers.clear();
        fires.clear();
    
        for(ModelElement modelElement : ModelElement.values()){
          for(int elementCount = 0; elementCount< modelElement.getInitialNumber();elementCount++){
            Position position = randomPosition();
            if(modelElement.isObstacle()){
              obstacles.put(position, (Obstacle) modelElement.getModelElementClass(position));
            } else if (modelElement.isExtinguisher()) {
              extinguishers.put(position, (Extinguisher) modelElement.getModelElementClass(position));
            }
            else{
              fires.put(position, (Fire) modelElement.getModelElementClass(position));
            }
          }
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
      private Position randomPosition() {
    
        return positions[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<>();
    
        if (fires.containsKey(position)) result.add(ModelElement.FIRE);
    
    
        for (Extinguisher extinguisher : extinguishers.values()) {
          if (extinguisher.getPosition().equals(position)) result.add(extinguisher.getElement());
        }
    
        for (Obstacle obstacle : obstacles.values()) {
          if (obstacle.getPosition().equals(position)) result.add(obstacle.getElement());
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        return result;
      }
    
    
      @Override
      public int columnCount() {
        return columnCount;
      }
    
      public List<Position> updateToNextGeneration() {
    
        Fire fire = new Fire(randomPosition());
        List<Position> modifiedPositions = new ArrayList<>();
    
        for(Extinguisher element : extinguishers.values()){
    
          modifiedPositions.addAll(element.update(this));
    
    BELHACHEMI Mehdi's avatar
    BELHACHEMI Mehdi committed
        }
    
      public Map<Position,Fire>getFires(){
        return this.fires;
    
      public Map<Position, Extinguisher> getExtinguishers() {
        return extinguishers;
    
      public Map<Position, Obstacle> getObstacles() {
        return obstacles;
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
      @Override
      public void reset() {
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
        initializeElements();
      }
    
    
    LABOUREL Arnaud's avatar
    LABOUREL Arnaud committed
      @Override
      public void setState(List<ModelElement> state, Position position) {
    
        if(extinguishers.containsKey(position)){
          extinguishers.remove(position);
    
          extinguishers.get(position).extinguish(this,position);
    
    BELHACHEMI Mehdi's avatar
    BELHACHEMI Mehdi committed
        for (ModelElement element : state) {
          switch (element) {
    
            case FIRE -> fires.put(position, new Fire(position));
            case FIREFIGHTER -> extinguishers.put(position,new FireFighter(position));
            case CLOUD ->  extinguishers.put(position,new Cloud(position));
    
    BELHACHEMI Mehdi's avatar
    BELHACHEMI Mehdi committed
        }
      }