From 22c131e8ecd46a05b9b1ddf09ef15d0a752fd2c0 Mon Sep 17 00:00:00 2001
From: hadiz <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr>
Date: Fri, 8 Nov 2024 11:27:59 +0100
Subject: [PATCH 1/6] FirefighterBoard correction

---
 src/main/java/model/FirefighterBoard.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index c0bd67c..30376bf 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -10,7 +10,7 @@ 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 final model.TargetStrategy targetStrategy = new model.TargetStrategy();
   private List<Position> firefighterPositions;
   private Set<Position> firePositions;
   private Map<Position, List<Position>> neighbors = new HashMap();
-- 
GitLab


From 87f62bbedadbce5f3d5160c042cb60d61c8c0d92 Mon Sep 17 00:00:00 2001
From: hadiz <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr>
Date: Fri, 8 Nov 2024 12:05:45 +0100
Subject: [PATCH 2/6] Firefighter

---
 src/main/java/model/Firefighter.java | 45 ++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100644 src/main/java/model/Firefighter.java

diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java
new file mode 100644
index 0000000..5d08fa2
--- /dev/null
+++ b/src/main/java/model/Firefighter.java
@@ -0,0 +1,45 @@
+package model;
+
+import util.Position;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Cette classe est responsable des actions des pompiers : se déplacer vers le feu
+ * le plus proche et éteindre les feux voisins
+ *
+ */
+
+public class Firefighter {
+    private Position position;
+    private final model.TargetStrategy targetStrategy;
+
+    public Firefighter(Position position, model.TargetStrategy targetStrategy){
+        this.position = position;
+        this.targetStrategy = targetStrategy;
+    }
+
+    public Position getPosition(){
+        return position;
+    }
+
+    public void moveTowardsFire(Set<Position> firePositions, Map<Position, List<Position>> neighbors){
+        Position newPosition = targetStrategy.neighborClosestToFire(position, firePositions, neighbors);
+        if (newPosition != null){
+            this.position = newPosition;
+        }
+    }
+
+    public void extinguishFiresAround(Set<Position> firePositions, Map<Position, List<Position>> neighbors) {
+        // Éteint le feu à la position actuelle du pompier, s'il y en a un
+        firePositions.remove(position);
+
+        // Éteint les feux dans les positions adjacentes
+        List<Position> adjacentPositions = neighbors.get(position);
+        for (Position neighbor : adjacentPositions) {
+            firePositions.remove(neighbor);
+        }
+    }
+}
-- 
GitLab


From 6ab4faab3ed2aab3b49e01cb7a5314c80a5d14ec Mon Sep 17 00:00:00 2001
From: BACHIR ABDOU <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr>
Date: Tue, 19 Nov 2024 11:07:48 +0100
Subject: [PATCH 3/6] Modification de Firefighter : ajout de setter

---
 src/main/java/model/Firefighter.java | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java
index 5d08fa2..65fc321 100644
--- a/src/main/java/model/Firefighter.java
+++ b/src/main/java/model/Firefighter.java
@@ -12,9 +12,9 @@ import java.util.Set;
  *
  */
 
-public class Firefighter {
+public abstract class Firefighter {
     private Position position;
-    private final model.TargetStrategy targetStrategy;
+    final model.TargetStrategy targetStrategy;
 
     public Firefighter(Position position, model.TargetStrategy targetStrategy){
         this.position = position;
@@ -25,6 +25,10 @@ public class Firefighter {
         return position;
     }
 
+    public void setPosition(Position position){
+        this.position = position;
+    }
+
     public void moveTowardsFire(Set<Position> firePositions, Map<Position, List<Position>> neighbors){
         Position newPosition = targetStrategy.neighborClosestToFire(position, firePositions, neighbors);
         if (newPosition != null){
-- 
GitLab


From 79ca5fcce7a2c2e5b450fb3cc015bd2bc0669de4 Mon Sep 17 00:00:00 2001
From: BACHIR ABDOU <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr>
Date: Tue, 19 Nov 2024 11:08:33 +0100
Subject: [PATCH 4/6] =?UTF-8?q?Pompiers=20motoris=C3=A9s=20:=20MotorizedFi?=
 =?UTF-8?q?reFighter?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/model/MotorizedFireFighter.java | 34 +++++++++++++++++++
 1 file changed, 34 insertions(+)
 create mode 100644 src/main/java/model/MotorizedFireFighter.java

diff --git a/src/main/java/model/MotorizedFireFighter.java b/src/main/java/model/MotorizedFireFighter.java
new file mode 100644
index 0000000..e96749a
--- /dev/null
+++ b/src/main/java/model/MotorizedFireFighter.java
@@ -0,0 +1,34 @@
+package model;
+
+import util.Position;
+
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class MotorizedFireFighter extends Firefighter{
+
+    public MotorizedFireFighter(Position position, model.TargetStrategy targetStrategy) {
+        super(position, targetStrategy);
+    }
+
+    @Override
+    public void moveTowardsFire(Set<Position> firePositions, Map<Position, List<Position>> neighbors) {
+        Position current = getPosition();
+
+        //Premier mouvement
+        Position firstMove = targetStrategy.neighborClosestToFire(current, firePositions, neighbors);
+        if (firstMove != null) {
+            current = firstMove;
+        }
+
+        //DEuxieme mouvement
+        Position secondMove = targetStrategy.neighborClosestToFire(current, firePositions, neighbors);
+        if (secondMove != null) {
+            current = secondMove;
+        }
+
+        setPosition(current);
+    }
+}
-- 
GitLab


From efbad21fcd8801496c5cdfd8b5375552465c77ec Mon Sep 17 00:00:00 2001
From: hadiz <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr>
Date: Fri, 22 Nov 2024 11:41:45 +0100
Subject: [PATCH 5/6] =?UTF-8?q?Affichage=20des=20pompiers=20motoris=C3=A9s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/controller/Controller.java  | 29 +++----
 src/main/java/model/Firefighter.java      |  2 +-
 src/main/java/model/FirefighterBoard.java | 99 ++++++++++++++++++-----
 src/main/java/model/ModelElement.java     |  2 +-
 src/main/java/view/ViewElement.java       |  2 +-
 5 files changed, 97 insertions(+), 37 deletions(-)

diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 2a60897..0c6251b 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -49,7 +49,7 @@ public class Controller {
   }
 
   private void initializePlayAndPauseToggleButtons() {
-    ToggleGroup toggleGroup = new PersistentToggleGroup();
+    ToggleGroup toggleGroup = new ToggleGroup();
     toggleGroup.getToggles().addAll(playToggleButton, pauseToggleButton);
     pauseToggleButton.setSelected(true);
   }
@@ -58,10 +58,10 @@ public class Controller {
     this.board = requireNonNull(firefighterBoard, "firefighter.model is null");
   }
 
-  private void updateBoard(){
+  private void updateBoard() {
     List<Position> updatedPositions = board.updateToNextGeneration();
     List<Pair<Position, ViewElement>> updatedSquares = new ArrayList<>();
-    for(Position updatedPosition : updatedPositions){
+    for (Position updatedPosition : updatedPositions) {
       List<ModelElement> squareState = board.getState(updatedPosition);
       ViewElement viewElement = getViewElement(squareState);
       updatedSquares.add(new Pair<>(updatedPosition, viewElement));
@@ -70,22 +70,25 @@ public class Controller {
     updateGenerationLabel(board.stepNumber());
   }
 
-  private void repaintGrid(){
+  private void repaintGrid() {
     int columnCount = board.columnCount();
     int rowCount = board.rowCount();
     ViewElement[][] viewElements = new ViewElement[rowCount][columnCount];
-    for(int column = 0; column < columnCount; column++)
-      for(int row = 0; row < rowCount; row++)
+    for (int column = 0; column < columnCount; column++)
+      for (int row = 0; row < rowCount; row++)
         viewElements[row][column] = getViewElement(board.getState(new Position(row, column)));
     grid.repaint(viewElements);
     updateGenerationLabel(board.stepNumber());
   }
 
   private ViewElement getViewElement(List<ModelElement> squareState) {
-    if(squareState.contains(ModelElement.FIREFIGHTER)){
+    if (squareState.contains(ModelElement.MOTORIZED_FIREFIGHTER)) {
+      return ViewElement.MOTORIZED_FIREFIGHTER;
+    }
+    if (squareState.contains(ModelElement.FIREFIGHTER)) {
       return ViewElement.FIREFIGHTER;
     }
-    if (squareState.contains(ModelElement.FIRE)){
+    if (squareState.contains(ModelElement.FIRE)) {
       return ViewElement.FIRE;
     }
     return ViewElement.EMPTY;
@@ -93,8 +96,7 @@ public class Controller {
 
   private void initializeTimeline() {
     Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
-    EventHandler<ActionEvent> eventHandler =
-            event -> updateBoard();
+    EventHandler<ActionEvent> eventHandler = event -> updateBoard();
     KeyFrame keyFrame = new KeyFrame(duration, eventHandler);
     timeline = new Timeline(keyFrame);
     timeline.setCycleCount(Animation.INDEFINITE);
@@ -123,8 +125,7 @@ public class Controller {
     repaintGrid();
   }
 
-  public void initialize(int squareWidth, int squareHeight, int columnCount,
-                                int rowCount, int initialFireCount, int initialFirefighterCount) {
+  public void initialize(int squareWidth, int squareHeight, int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
     grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
     this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount));
     repaintGrid();
@@ -135,7 +136,7 @@ public class Controller {
     updateBoard();
   }
 
-  private void updateGenerationLabel(int value){
+  private void updateGenerationLabel(int value) {
     generationNumberLabel.setText(Integer.toString(value));
   }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java
index 65fc321..6ecfbfd 100644
--- a/src/main/java/model/Firefighter.java
+++ b/src/main/java/model/Firefighter.java
@@ -12,7 +12,7 @@ import java.util.Set;
  *
  */
 
-public abstract class Firefighter {
+public class Firefighter {
     private Position position;
     final model.TargetStrategy targetStrategy;
 
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 30376bf..1b2859c 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -12,6 +12,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   private final int initialFirefighterCount;
   private final model.TargetStrategy targetStrategy = new model.TargetStrategy();
   private List<Position> firefighterPositions;
+  private List<Firefighter> firefighters;
   private Set<Position> firePositions;
   private Map<Position, List<Position>> neighbors = new HashMap();
   private final Position[][] positions;
@@ -22,6 +23,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     this.columnCount = columnCount;
     this.rowCount = rowCount;
     this.positions = new Position[rowCount][columnCount];
+    this.firefighters = new ArrayList<>();
     for (int column = 0; column < columnCount; column++)
       for (int row = 0; row < rowCount; row++)
         positions[row][column] = new Position(row, column);
@@ -42,10 +44,24 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   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());
+
+    int motorizedCount = initialFirefighterCount / 2;
+
+    for (int i = 0; i < motorizedCount; i++) {
+      MotorizedFireFighter motorizedFireFighter = new MotorizedFireFighter(randomPosition(), targetStrategy);
+      firefighters.add(motorizedFireFighter);
+      firefighterPositions.add(motorizedFireFighter.getPosition());
+    }
+
+    // Initialisation des pompiers réguliers
+    for (int i = 0; i < initialFirefighterCount - motorizedCount; i++) {
+      Firefighter firefighter = new Firefighter(randomPosition(), targetStrategy);
+      firefighters.add(firefighter);
+      firefighterPositions.add(firefighter.getPosition());
+    }
   }
 
   private Position randomPosition() {
@@ -55,14 +71,24 @@ 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))
-        result.add(ModelElement.FIREFIGHTER);
-    if (firePositions.contains(position))
+
+    // Vérifie le type de chaque pompier
+    for (Firefighter firefighter : firefighters) {
+      if (firefighter.getPosition().equals(position)) {
+        if (firefighter instanceof MotorizedFireFighter) {
+          result.add(ModelElement.MOTORIZED_FIREFIGHTER);
+        } else {
+          result.add(ModelElement.FIREFIGHTER);
+        }
+      }
+    }
+    if (firePositions.contains(position)) {
       result.add(ModelElement.FIRE);
+    }
     return result;
   }
 
+
   @Override
   public int rowCount() {
     return rowCount;
@@ -100,24 +126,50 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   }
 
   private List<Position> updateFirefighters() {
-    List<Position> modifiedPosition = new ArrayList<>();
+    List<Position> modifiedPositions = new ArrayList<>();
     List<Position> firefighterNewPositions = new ArrayList<>();
-    for (Position firefighterPosition : firefighterPositions) {
-      Position newFirefighterPosition =
-              targetStrategy.neighborClosestToFire(firefighterPosition,
-                      firePositions, neighbors);
+
+    for (Firefighter firefighter : firefighters) {
+      Position originalPosition = firefighter.getPosition();
+      Position newFirefighterPosition = originalPosition;
+
+      // Déplacer le pompier vers le feu le plus proche
+      if (firefighter instanceof MotorizedFireFighter) {
+        // Premier mouvement
+        Position firstMove = targetStrategy.neighborClosestToFire(newFirefighterPosition, firePositions, neighbors);
+        if (firstMove != null) {
+          newFirefighterPosition = firstMove;
+        }
+
+        // Deuxième mouvement
+        Position secondMove = targetStrategy.neighborClosestToFire(newFirefighterPosition, firePositions, neighbors);
+        if (secondMove != null) {
+          newFirefighterPosition = secondMove;
+        }
+      } else {
+        newFirefighterPosition = targetStrategy.neighborClosestToFire(newFirefighterPosition, firePositions, neighbors);
+      }
+
+      // Mettre à jour la position du pompier
+      firefighter.setPosition(newFirefighterPosition);
       firefighterNewPositions.add(newFirefighterPosition);
+
+      // Éteindre les feux autour de la nouvelle position
       extinguish(newFirefighterPosition);
-      modifiedPosition.add(firefighterPosition);
-      modifiedPosition.add(newFirefighterPosition);
       List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
               .filter(firePositions::contains).toList();
-      for (Position firePosition : neighborFirePositions)
+      for (Position firePosition : neighborFirePositions) {
         extinguish(firePosition);
-      modifiedPosition.addAll(neighborFirePositions);
+      }
+
+      // Ajouter les positions modifiées à la liste
+      modifiedPositions.add(originalPosition);
+      modifiedPositions.add(newFirefighterPosition);
+      modifiedPositions.addAll(neighborFirePositions);
     }
+
     firefighterPositions = firefighterNewPositions;
-    return modifiedPosition;
+    return modifiedPositions;
   }
 
   @Override
@@ -134,13 +186,20 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
   @Override
   public void setState(List<ModelElement> state, Position position) {
     firePositions.remove(position);
-    for (; ; ) {
-      if (!firefighterPositions.remove(position)) break;
-    }
+    firefighterPositions.remove(position);
     for (ModelElement element : state) {
       switch (element) {
         case FIRE -> firePositions.add(position);
-        case FIREFIGHTER -> firefighterPositions.add(position);
+        case FIREFIGHTER -> {
+          Firefighter firefighter = new Firefighter(position, targetStrategy);
+          firefighters.add(firefighter);
+          firefighterPositions.add(position);
+        }
+        case MOTORIZED_FIREFIGHTER -> {
+          MotorizedFireFighter motorizedFireFighter = new MotorizedFireFighter(position, targetStrategy);
+          firefighters.add(motorizedFireFighter);
+          firefighterPositions.add(position);
+        }
       }
     }
   }
diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java
index 759eee5..77942c1 100644
--- a/src/main/java/model/ModelElement.java
+++ b/src/main/java/model/ModelElement.java
@@ -1,5 +1,5 @@
 package model;
 
 public enum ModelElement {
-  FIREFIGHTER, FIRE
+  FIREFIGHTER, MOTORIZED_FIREFIGHTER, FIRE
 }
diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java
index ffb7611..482767a 100644
--- a/src/main/java/view/ViewElement.java
+++ b/src/main/java/view/ViewElement.java
@@ -3,7 +3,7 @@ package view;
 import javafx.scene.paint.Color;
 
 public enum ViewElement {
-  FIREFIGHTER(Color.BLUE), FIRE(Color.RED), EMPTY(Color.WHITE);
+  FIREFIGHTER(Color.BLUE), FIRE(Color.RED),  MOTORIZED_FIREFIGHTER(Color.BLACK), EMPTY(Color.WHITE);
   final Color color;
   ViewElement(Color color) {
     this.color = color;
-- 
GitLab


From 0959f9fb7f7dd73827e91383f2a5d4d4c097be64 Mon Sep 17 00:00:00 2001
From: hadiz <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr>
Date: Fri, 22 Nov 2024 12:10:14 +0100
Subject: [PATCH 6/6] Propagation de feux

---
 src/main/java/model/FirefighterBoard.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 1b2859c..d865134 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -45,10 +45,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     firefighterPositions = new ArrayList<>();
     firePositions = new HashSet<>();
 
-    for (int index = 0; index < initialFireCount; index++)
+    for (int index = 0; index < initialFireCount*2; index++)
       firePositions.add(randomPosition());
 
-    int motorizedCount = initialFirefighterCount / 2;
+    int motorizedCount = initialFirefighterCount/2;
 
     for (int i = 0; i < motorizedCount; i++) {
       MotorizedFireFighter motorizedFireFighter = new MotorizedFireFighter(randomPosition(), targetStrategy);
-- 
GitLab