Select Git revision
BoardElement.java
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;
}
}