Skip to content
Snippets Groups Projects
Select Git revision
  • cb43f02eedd41cbcc5477f9bac63643311d2cada
  • main default protected
  • variant
3 results

BoardElement.java

Blame
  • Forked from COUETOUX Basile / FirefighterStarter
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    FirefighterBoard.java 4.84 KiB
    package model;
    
    import util.Position;
    
    import java.util.*;
    
    public class FirefighterBoard implements Board<List<ModelElement>> {
      private final BoardFireFighterBehavior behavior;
      private final BoardFirefighterProperties properties;
    
    
      private final Random randomGenerator = new Random();
    
      public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount,int initialCloud,int initialMotorized,
                              int initialRocky) {
        Map<Position, List<Position>> neighbors = initializeNeighbors(rowCount, columnCount);
    
        this.properties = new BoardFirefighterProperties(rowCount, columnCount);
        this.behavior = new BoardFireFighterBehavior(neighbors,new FireFactory(randomGenerator,initialFireCount),new FirefighterFactory(randomGenerator,initialFirefighterCount),
                new CloudFactory(randomGenerator,initialCloud),new MotorizedFactory(randomGenerator,initialMotorized),new RockyFactory(randomGenerator,initialRocky));
    
        behavior.initializeElements( properties.rowCount(), properties.columnCount());
      }
    
      private Map<Position, List<Position>> initializeNeighbors(int rowCount, int columnCount) {
        Map<Position, List<Position>> neighbors = new HashMap<>();
        Position[][] positions = new Position[rowCount][columnCount];
    
        for (int row = 0; row < rowCount; row++) {
          for (int column = 0; column < columnCount; column++) {
            positions[row][column] = new Position(row, column);
          }
        }
    
        for (int row = 0; row < rowCount; row++) {
          for (int column = 0; column < columnCount; column++) {
            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);
          }
        }
        return neighbors;
      }
      public List<ModelElement> getState(Position position) {
        List<ModelElement> result = new ArrayList<>();
    
        // Filtrage des éléments Fire (en transformant les positions en objets Fire)
        behavior.getFirePositions().stream()
                .filter(pos -> pos.isAtPosition(position)) // Vérifier si la position correspond
                .forEach(pos -> result.add(new Fire(pos))); // Créer un objet Fire à partir de Position
    
        // Filtrage des éléments Firefighter (en transformant les positions en objets FireFighter)
        behavior.getFireFighterMovements().getPositions().stream()
                .filter(pos -> pos.isAtPosition(position)) // Vérifier si la position correspond
                .forEach(pos -> result.add(new FireFighter(pos))); // Créer un objet Firefighter à partir de Position
        // Filtrage des éléments Cloud
        behavior.getCloudPositions().stream()
                .filter(pos -> pos.isAtPosition(position))
                .forEach(pos -> result.add(new Cloud(pos)));
        // Filtrage des éléments Motorized
        behavior.getMotorizedFighters().stream()
                .filter(pos -> pos.isAtPosition(position))
                .forEach(pos -> result.add(new MotorizedFireFighter(pos)));
    
        behavior.getTerrainMap().forEach((pos, value) -> {
          if (pos.isAtPosition(position) && value instanceof Mountain) {
            result.add((Mountain) value); // Ajouter uniquement un objet Mountain
          }
        });
        behavior.getTerrainMap().forEach((pos, value) -> {
          if (pos.isAtPosition(position) && value instanceof Road) {
            result.add((Road) value); // Ajouter uniquement un objet Mountain
          }
        });
        // Filtrage des éléments Rocky
        behavior.getRocky().stream()
                .filter(pos -> pos.isAtPosition(position))
                .forEach(pos -> result.add(new Rocky(pos)));
    
        return result;
      }
    
    
      public void reset() {
        behavior.reset();
        behavior.initializeElements(properties.rowCount(), properties.columnCount());
      }
      public void setState(List<ModelElement> state, Position position) {
        // Pour chaque élément dans l'état, on l'ajoute sur le plateau
        state.forEach(element -> addElementToBoard(element, position));
      }
    
      private void addElementToBoard(ModelElement element, Position position) {
        if (element instanceof Fire) {
          behavior.getFirePositions().add(position); // Ajouter un Fire
        } else if (element instanceof FireFighter) {
          behavior.getFirefighterPositions().add(position); // Ajouter un Firefighter
        } else if (element instanceof Cloud) {
          behavior.getCloudPositions().add(position);
        } else if (element instanceof MotorizedFireFighter) {
          behavior.getMotorizedFighters().add(position);
        }else if(element instanceof Rocky)
        {
          behavior.getRocky().add(position);
        }
      }
    
      public BoardFireFighterBehavior getBehavior() {
        return behavior;
      }
    
      public BoardFirefighterProperties getProperties() {
        return properties;
      }
    }