Skip to content
Snippets Groups Projects
Commit 5955641f authored by RADELLAH Badr's avatar RADELLAH Badr
Browse files

Lors de cette première séance, j'ai travaillé sur la refactorisation du code...

Lors de cette première séance, j'ai travaillé sur la refactorisation du code existant en déléguant les responsabilités des pompiers et des feux à des classes séparées (Firefighter et Fire). J'ai également amélioré l'architecture du code en isolant mieux la logique de gestion des feux et des pompiers dans leurs propres classes respectives, afin de rendre le code plus modulaire et conforme aux principes SOLID, notamment le principe de responsabilité unique.
Pour la prochaine séance e préparerai également un diagramme de classe détaillant l'organisation actuelle du code et Implémentation des nuages mobiles qui éteignent les feux
parent 262bcd35
Branches
No related tags found
No related merge requests found
Pipeline #38501 failed
package model;
import util.Position;
import java.util.*;
import model.TargetStrategy;
public class FirefighterBoard implements Board<List<ModelElement>> {
......@@ -10,21 +10,31 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
private final int rowCount;
private final int initialFireCount;
private final int initialFirefighterCount;
private final TargetStrategy targetStrategy = new TargetStrategy();
private List<Position> firefighterPositions;
private Set<Position> firePositions;
private Map<Position, List<Position>> neighbors = new HashMap();
private final Position[][] positions;
private final Map<Position, List<Position>> neighbors = new HashMap<>();
private Fire fire;
private Firefighter firefighter;
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.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
this.positions = new Position[rowCount][columnCount];
initializePositions();
initializeNeighbors();
initializeElements();
}
private void initializePositions() {
for (int column = 0; column < columnCount; column++)
for (int row = 0; row < rowCount; row++)
positions[row][column] = new Position(row, column);
}
private void initializeNeighbors() {
for (int column = 0; column < columnCount; column++)
for (int row = 0; row < rowCount; row++) {
List<Position> list = new ArrayList<>();
......@@ -34,64 +44,55 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
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() {
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 void initializeElements() {
Set<Position> initialFirePositions = new HashSet<>();
List<Position> initialFirefighterPositions = new ArrayList<>();
Random random = new Random();
private Position randomPosition() {
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
for (int i = 0; i < initialFireCount; i++) {
initialFirePositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
}
@Override
public List<ModelElement> getState(Position position) {
List<ModelElement> result = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions)
if (firefighterPosition.equals(position))
result.add(ModelElement.FIREFIGHTER);
if (firePositions.contains(position))
result.add(ModelElement.FIRE);
return result;
for (int i = 0; i < initialFirefighterCount; i++) {
initialFirefighterPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
}
@Override
public int rowCount() {
return rowCount;
fire = new Fire(initialFirePositions);
firefighter = new Firefighter(initialFirefighterPositions, new TargetStrategy());
}
@Override
public int columnCount() {
return columnCount;
public List<ModelElement> getState(Position position) {
List<ModelElement> elements = new ArrayList<>();
if (fire.getPositions().contains(position)) elements.add(ModelElement.FIRE);
if (firefighter.getPositions().contains(position)) elements.add(ModelElement.FIREFIGHTER);
return elements;
}
@Override
public List<Position> updateToNextGeneration() {
List<Position> modifiedPositions = updateFirefighters();
modifiedPositions.addAll(updateFires());
List<Position> modifiedPositions = firefighter.moveToClosestFire(fire.getPositions(), neighbors);
modifiedPositions.addAll(fire.spread(neighbors.keySet()));
step++;
return modifiedPositions;
}
private List<Position> updateFires() {
List<Position> modifiedPositions = new ArrayList<>();
if (step % 2 == 0) {
List<Position> newFirePositions = new ArrayList<>();
for (Position fire : firePositions) {
newFirePositions.addAll(neighbors.get(fire));
@Override
public void setState(List<ModelElement> state, Position position) {
// Mise à jour des états (feu ou pompier) en fonction de la liste `state`
if (state.contains(ModelElement.FIRE)) fire.getPositions().add(position);
if (state.contains(ModelElement.FIREFIGHTER)) firefighter.getPositions().add(position);
}
firePositions.addAll(newFirePositions);
modifiedPositions.addAll(newFirePositions);
@Override
public int rowCount() {
return rowCount;
}
return modifiedPositions;
@Override
public int columnCount() {
return columnCount;
}
@Override
......@@ -99,49 +100,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
return step;
}
private List<Position> updateFirefighters() {
List<Position> modifiedPosition = new ArrayList<>();
List<Position> firefighterNewPositions = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) {
Position newFirefighterPosition =
targetStrategy.neighborClosestToFire(firefighterPosition,
firePositions, neighbors);
firefighterNewPositions.add(newFirefighterPosition);
extinguish(newFirefighterPosition);
modifiedPosition.add(firefighterPosition);
modifiedPosition.add(newFirefighterPosition);
List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
.filter(firePositions::contains).toList();
for (Position firePosition : neighborFirePositions)
extinguish(firePosition);
modifiedPosition.addAll(neighborFirePositions);
}
firefighterPositions = firefighterNewPositions;
return modifiedPosition;
}
@Override
public void reset() {
step = 0;
initializeElements();
}
private void extinguish(Position position) {
firePositions.remove(position);
}
@Override
public void setState(List<ModelElement> state, Position position) {
firePositions.remove(position);
for (; ; ) {
if (!firefighterPositions.remove(position)) break;
}
for (ModelElement element : state) {
switch (element) {
case FIRE -> firePositions.add(position);
case FIREFIGHTER -> firefighterPositions.add(position);
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment