From 4f32dbe0ef5175a3a3b9b5dfe7e3d24708a92b29 Mon Sep 17 00:00:00 2001
From: ousseyn01 <ousseyn.ndiaye9@gmail.com>
Date: Sat, 23 Nov 2024 22:50:28 +0100
Subject: [PATCH] FirefighterBoard is DONE

---
 src/main/java/model/FirefighterBoard.java | 89 ++++++++++-------------
 1 file changed, 38 insertions(+), 51 deletions(-)

diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index c0bd67c..99c94d8 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -4,16 +4,15 @@ import util.Position;
 
 import java.util.*;
 
-
 public class FirefighterBoard implements Board<List<ModelElement>> {
   private final int columnCount;
   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 model.TargetStrategy targetStrategy = new model.TargetStrategy();
+  private List<Firefighter> firefighters;
+  private Fire fire;
+  private final Map<Position, List<Position>> neighbors = new HashMap<>();
   private final Position[][] positions;
   private int step = 0;
   private final Random randomGenerator = new Random();
@@ -40,12 +39,13 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   }
 
   public void initializeElements() {
-    firefighterPositions = new ArrayList<>();
-    firePositions = new HashSet<>();
+    firefighters = new ArrayList<>();
+    Set<Position> firePositions = new HashSet<>();
     for (int index = 0; index < initialFireCount; index++)
       firePositions.add(randomPosition());
+    fire = new Fire(firePositions, neighbors);
     for (int index = 0; index < initialFirefighterCount; index++)
-      firefighterPositions.add(randomPosition());
+      firefighters.add(new Firefighter(randomPosition()));
   }
 
   private Position randomPosition() {
@@ -55,10 +55,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   @Override
   public List<ModelElement> getState(Position position) {
     List<ModelElement> result = new ArrayList<>();
-    for (Position firefighterPosition : firefighterPositions)
-      if (firefighterPosition.equals(position))
+    for (Firefighter firefighter : firefighters)
+      if (firefighter.getPosition().equals(position))
         result.add(ModelElement.FIREFIGHTER);
-    if (firePositions.contains(position))
+    if (fire.getFirePositions().contains(position))
       result.add(ModelElement.FIRE);
     return result;
   }
@@ -75,23 +75,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
 
   public List<Position> updateToNextGeneration() {
     List<Position> modifiedPositions = updateFirefighters();
-    modifiedPositions.addAll(updateFires());
+    if (step % 2 == 0){
+      modifiedPositions.addAll(fire.spreadFire());
+    }
     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));
-      }
-      firePositions.addAll(newFirePositions);
-      modifiedPositions.addAll(newFirePositions);
-    }
     return modifiedPositions;
-
   }
 
   @Override
@@ -101,22 +90,27 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
 
   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);
+    for (Firefighter firefighter : firefighters) {
+
+      modifiedPosition.add(firefighter.getPosition());
+
+      Position newPosition = firefighter.moveToBestPosition(targetStrategy, fire.getFirePositions(), neighbors);
+      firefighter.setPosition(newPosition);
+
+      modifiedPosition.add(newPosition);
+
+      firefighter.extinguish(newPosition, fire.getFirePositions());
+
+      // Éteindre les feux dans les positions voisines
+      List<Position> adjacentFires = neighbors.get(newPosition).stream()
+              .filter(fire.getFirePositions()::contains)
+              .toList();
+      for (Position firePosition : adjacentFires) {
+        firefighter.extinguish(firePosition, fire.getFirePositions());
+        modifiedPosition.add(firePosition); // Ajouter la position comme modifiée
+      }
+
     }
-    firefighterPositions = firefighterNewPositions;
     return modifiedPosition;
   }
 
@@ -126,21 +120,14 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     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;
-    }
+    fire.getFirePositions().remove(position);
+    firefighters.removeIf(f -> f.getPosition().equals(position));
     for (ModelElement element : state) {
       switch (element) {
-        case FIRE -> firePositions.add(position);
-        case FIREFIGHTER -> firefighterPositions.add(position);
+        case FIRE -> fire.getFirePositions().add(position);
+        case FIREFIGHTER -> firefighters.add(new Firefighter(position));
       }
     }
   }
-- 
GitLab