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
No related branches found
No related tags found
No related merge requests found
Pipeline #38501 failed
package model; package model;
import util.Position; import util.Position;
import java.util.*; import java.util.*;
import model.TargetStrategy;
public class FirefighterBoard implements Board<List<ModelElement>> { public class FirefighterBoard implements Board<List<ModelElement>> {
...@@ -10,21 +10,31 @@ 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 rowCount;
private final int initialFireCount; private final int initialFireCount;
private final int initialFirefighterCount; 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 Position[][] positions;
private final Map<Position, List<Position>> neighbors = new HashMap<>();
private Fire fire;
private Firefighter firefighter;
private int step = 0; private int step = 0;
private final Random randomGenerator = new Random();
public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
this.columnCount = columnCount; this.columnCount = columnCount;
this.rowCount = rowCount; this.rowCount = rowCount;
this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
this.positions = new Position[rowCount][columnCount]; this.positions = new Position[rowCount][columnCount];
initializePositions();
initializeNeighbors();
initializeElements();
}
private void initializePositions() {
for (int column = 0; column < columnCount; column++) for (int column = 0; column < columnCount; column++)
for (int row = 0; row < rowCount; row++) for (int row = 0; row < rowCount; row++)
positions[row][column] = new Position(row, column); positions[row][column] = new Position(row, column);
}
private void initializeNeighbors() {
for (int column = 0; column < columnCount; column++) for (int column = 0; column < columnCount; column++)
for (int row = 0; row < rowCount; row++) { for (int row = 0; row < rowCount; row++) {
List<Position> list = new ArrayList<>(); List<Position> list = new ArrayList<>();
...@@ -34,64 +44,55 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -34,64 +44,55 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
if (column < columnCount - 1) list.add(positions[row][column + 1]); if (column < columnCount - 1) list.add(positions[row][column + 1]);
neighbors.put(positions[row][column], list); neighbors.put(positions[row][column], list);
} }
this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
initializeElements();
} }
public void initializeElements() { private void initializeElements() {
firefighterPositions = new ArrayList<>(); Set<Position> initialFirePositions = new HashSet<>();
firePositions = new HashSet<>(); List<Position> initialFirefighterPositions = new ArrayList<>();
for (int index = 0; index < initialFireCount; index++) Random random = new Random();
firePositions.add(randomPosition());
for (int index = 0; index < initialFirefighterCount; index++)
firefighterPositions.add(randomPosition());
}
private Position randomPosition() { for (int i = 0; i < initialFireCount; i++) {
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); initialFirePositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
} }
for (int i = 0; i < initialFirefighterCount; i++) {
@Override initialFirefighterPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
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;
} }
@Override fire = new Fire(initialFirePositions);
public int rowCount() { firefighter = new Firefighter(initialFirefighterPositions, new TargetStrategy());
return rowCount;
} }
@Override @Override
public int columnCount() { public List<ModelElement> getState(Position position) {
return columnCount; 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() { public List<Position> updateToNextGeneration() {
List<Position> modifiedPositions = updateFirefighters(); List<Position> modifiedPositions = firefighter.moveToClosestFire(fire.getPositions(), neighbors);
modifiedPositions.addAll(updateFires()); modifiedPositions.addAll(fire.spread(neighbors.keySet()));
step++; step++;
return modifiedPositions; return modifiedPositions;
} }
private List<Position> updateFires() { @Override
List<Position> modifiedPositions = new ArrayList<>(); public void setState(List<ModelElement> state, Position position) {
if (step % 2 == 0) { // Mise à jour des états (feu ou pompier) en fonction de la liste `state`
List<Position> newFirePositions = new ArrayList<>(); if (state.contains(ModelElement.FIRE)) fire.getPositions().add(position);
for (Position fire : firePositions) { if (state.contains(ModelElement.FIREFIGHTER)) firefighter.getPositions().add(position);
newFirePositions.addAll(neighbors.get(fire));
} }
firePositions.addAll(newFirePositions);
modifiedPositions.addAll(newFirePositions); @Override
public int rowCount() {
return rowCount;
} }
return modifiedPositions;
@Override
public int columnCount() {
return columnCount;
} }
@Override @Override
...@@ -99,49 +100,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -99,49 +100,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
return step; 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 @Override
public void reset() { public void reset() {
step = 0; step = 0;
initializeElements(); 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