From 5955641f3bee94035e551da3043a200728ef1990 Mon Sep 17 00:00:00 2001
From: badrr <badr.radellah@etu.univ-amu.fr>
Date: Sat, 9 Nov 2024 17:39:32 +0100
Subject: [PATCH] =?UTF-8?q?Lors=20de=20cette=20premi=C3=A8re=20s=C3=A9ance?=
 =?UTF-8?q?,=20j'ai=20travaill=C3=A9=20sur=20la=20refactorisation=20du=20c?=
 =?UTF-8?q?ode=20existant=20en=20d=C3=A9l=C3=A9guant=20les=20responsabilit?=
 =?UTF-8?q?=C3=A9s=20des=20pompiers=20et=20des=20feux=20=C3=A0=20des=20cla?=
 =?UTF-8?q?sses=20s=C3=A9par=C3=A9es=20(Firefighter=20et=20Fire).=20J'ai?=
 =?UTF-8?q?=20=C3=A9galement=20am=C3=A9lior=C3=A9=20l'architecture=20du=20?=
 =?UTF-8?q?code=20en=20isolant=20mieux=20la=20logique=20de=20gestion=20des?=
 =?UTF-8?q?=20feux=20et=20des=20pompiers=20dans=20leurs=20propres=20classe?=
 =?UTF-8?q?s=20respectives,=20afin=20de=20rendre=20le=20code=20plus=20modu?=
 =?UTF-8?q?laire=20et=20conforme=20aux=20principes=20SOLID,=20notamment=20?=
 =?UTF-8?q?le=20principe=20de=20responsabilit=C3=A9=20unique.=20Pour=20la?=
 =?UTF-8?q?=20prochaine=20s=C3=A9ance=20e=20pr=C3=A9parerai=20=C3=A9galeme?=
 =?UTF-8?q?nt=20un=20diagramme=20de=20classe=20d=C3=A9taillant=20l'organis?=
 =?UTF-8?q?ation=20actuelle=20du=20code=20et=20Impl=C3=A9mentation=20des?=
 =?UTF-8?q?=20nuages=20mobiles=20qui=20=C3=A9teignent=20les=20feux?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/model/FirefighterBoard.java | 137 ++++++++--------------
 1 file changed, 49 insertions(+), 88 deletions(-)

diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index c0bd67c..c84740f 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -1,8 +1,8 @@
 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)));
+    }
+    for (int i = 0; i < initialFirefighterCount; i++) {
+      initialFirefighterPositions.add(new Position(random.nextInt(rowCount), random.nextInt(columnCount)));
+    }
+
+    fire = new Fire(initialFirePositions);
+    firefighter = new Firefighter(initialFirefighterPositions, new TargetStrategy());
   }
 
   @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;
+    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 int rowCount() {
-    return rowCount;
+  public List<Position> updateToNextGeneration() {
+    List<Position> modifiedPositions = firefighter.moveToClosestFire(fire.getPositions(), neighbors);
+    modifiedPositions.addAll(fire.spread(neighbors.keySet()));
+    step++;
+    return modifiedPositions;
   }
 
   @Override
-  public int columnCount() {
-    return columnCount;
+  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);
   }
 
-  public List<Position> updateToNextGeneration() {
-    List<Position> modifiedPositions = updateFirefighters();
-    modifiedPositions.addAll(updateFires());
-    step++;
-    return modifiedPositions;
+  @Override
+  public int rowCount() {
+    return rowCount;
   }
 
-  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));
-      }
-      firePositions.addAll(newFirePositions);
-      modifiedPositions.addAll(newFirePositions);
-    }
-    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);
-      }
-    }
-  }
-}
\ No newline at end of file
+}
-- 
GitLab