From 5059fbfe938664da6d61b0cedcd9e8d22f2c9ee0 Mon Sep 17 00:00:00 2001
From: MEHDI <mehdi.belhachemi@etu-univ.amu.fr>
Date: Sun, 24 Nov 2024 20:44:39 +0100
Subject: [PATCH] mehdi: finished MotorizedFireFighter class

---
 src/main/java/controller/Controller.java      |  3 ++
 src/main/java/model/Extinguisher.java         |  2 +
 src/main/java/model/Fire.java                 | 32 ++++++++++--
 src/main/java/model/FireFighter.java          | 19 +++----
 src/main/java/model/ModelElement.java         |  6 ++-
 src/main/java/model/MotorizedFireFighter.java | 49 +++++++++++++++++++
 src/main/java/view/ViewElement.java           |  1 +
 7 files changed, 96 insertions(+), 16 deletions(-)
 create mode 100644 src/main/java/model/MotorizedFireFighter.java

diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 577a4d1..f1fa004 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -100,6 +100,9 @@ public class Controller {
     if (squareState.contains(ModelElement.ROCAILLE)) {
       return ViewElement.ROCAILLE;
     }
+    if (squareState.contains(ModelElement.MOTORIZEDFIREFIGHTER)) {
+      return ViewElement.MOTORIZEDFIREFIGHTER;
+    }
     return ViewElement.EMPTY;
   }
 
diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java
index 4983ad2..1d7a630 100644
--- a/src/main/java/model/Extinguisher.java
+++ b/src/main/java/model/Extinguisher.java
@@ -2,10 +2,12 @@ package model;
 
 import util.Neighbour;
 import util.Position;
+import util.TargetStrategy;
 
 import java.util.List;
 
 public abstract class Extinguisher implements Element{
+    protected final TargetStrategy targetStrategy = new TargetStrategy();
     protected Neighbour neighbour;
 
     protected Position position;
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index 994ed1e..798f4c4 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -40,13 +40,11 @@ public class Fire implements Element {
         List<Position> modifiedPositions = new ArrayList<>();
         if (firefighterBoard.stepNumber() % 2 == 0) {
             Set<Position> newFirePositions = new HashSet<>();
-            for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) {
-                List<Position> neighboursAvailable = this.neighbour.getNeighbors().get(fire);
-                neighboursAvailable.removeAll(firefighterBoard.getObstacles().keySet());
-
 
-                newFirePositions.addAll(this.neighbour.getNeighbors().get(fire));
+            for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) {
+                newFirePositions.addAll(removeMountainAndRoads(firefighterBoard,fire));
             }
+
             for (Position position : newFirePositions) {
                 if (!firefighterBoard.getFires().containsKey(position)) {
                     firefighterBoard.getFires().put(position, new Fire(position));
@@ -62,6 +60,30 @@ public class Fire implements Element {
     }
 
 
+    public List<Position>removeMountainAndRoads(Board<List<ModelElement>> firefighterBoard,Position position){
+        List<Position>neighboursAvailable;
+
+        neighboursAvailable = this.neighbour.getNeighbors().get(position);
+        if(firefighterBoard.stepNumber()%4==0){
+            List<Position>MountainAndRoadsPositions = new ArrayList<>();
+            for(Obstacle obstacle : firefighterBoard.getObstacles().values()){
+                if(obstacle instanceof Road || obstacle instanceof Montain){
+                    MountainAndRoadsPositions.add(obstacle.getPosition());
+                    neighboursAvailable.removeAll(MountainAndRoadsPositions);
+                }
+            }
+        }
+        else{
+
+            neighboursAvailable.removeAll(firefighterBoard.getObstacles().keySet());
+        }
+
+
+        return neighboursAvailable;
+    }
+
+
+
 
 
 }
\ No newline at end of file
diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java
index b656cf7..9e1233e 100644
--- a/src/main/java/model/FireFighter.java
+++ b/src/main/java/model/FireFighter.java
@@ -2,36 +2,33 @@ package model;
 
 import util.Neighbour;
 import util.Position;
-import util.TargetStrategy;
+
 
 import java.util.ArrayList;
 
-import java.util.HashSet;
+
 import java.util.List;
 
 
 
 public class FireFighter extends Extinguisher {
 
-    private final TargetStrategy targetStrategy = new TargetStrategy();
-
 
-    public FireFighter(Position position){
+    public FireFighter(Position position) {
         super(position);
         element = ModelElement.FIREFIGHTER;
     }
 
 
-    public List<Position> update(Board<List<ModelElement>> firefighterBoard){
+    public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
         this.neighbour = new Neighbour(firefighterBoard);
-
         List<Position> modifiedPositions = new ArrayList<>();
 
         Position currentPosition = this.getPosition();
         Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), this.neighbour.getNeighbors());
+        this.setPosition(newPosition);
 
 
-        this.setPosition(newPosition);
         modifiedPositions.add(currentPosition);
         modifiedPositions.add(newPosition);
 
@@ -53,4 +50,8 @@ public class FireFighter extends Extinguisher {
         return modifiedPositions;
     }
 
-}
\ No newline at end of file
+
+
+    }
+
+
diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java
index 4aa440e..64c839a 100644
--- a/src/main/java/model/ModelElement.java
+++ b/src/main/java/model/ModelElement.java
@@ -7,12 +7,13 @@ import java.util.List;
 
 public enum ModelElement {
 
-  FIREFIGHTER(10),
+  FIREFIGHTER(5),
   FIRE(10),
   CLOUD(10),
   ROAD(5),
   MOUNTAIN(5),
-  ROCAILLE(3);
+  ROCAILLE(3),
+  MOTORIZEDFIREFIGHTER(5);
   private final int initialNumber;
 
 
@@ -34,6 +35,7 @@ public enum ModelElement {
       case CLOUD -> new Cloud(position);
       case MOUNTAIN -> new Montain(position);
       case ROCAILLE -> new Rocaille(position);
+      case MOTORIZEDFIREFIGHTER -> new MotorizedFireFighter(position);
       default -> throw new IllegalArgumentException("Unknown ModelElement: " + this);
       };
 
diff --git a/src/main/java/model/MotorizedFireFighter.java b/src/main/java/model/MotorizedFireFighter.java
new file mode 100644
index 0000000..a9dad94
--- /dev/null
+++ b/src/main/java/model/MotorizedFireFighter.java
@@ -0,0 +1,49 @@
+package model;
+
+import util.Neighbour;
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MotorizedFireFighter extends Extinguisher {
+
+    public MotorizedFireFighter(Position position) {
+        super(position);
+        this.element = ModelElement.MOTORIZEDFIREFIGHTER;
+    }
+
+    @Override
+    public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
+        this.neighbour = new Neighbour(firefighterBoard);
+
+        List<Position> modifiedPositions = new ArrayList<>();
+
+        Position currentPosition = this.getPosition();
+        Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), this.neighbour.getNeighbors());
+        Position DoublenewPosition = targetStrategy.neighborClosestToFire(newPosition, firefighterBoard.getFires().keySet(), this.neighbour.getNeighbors());
+        this.setPosition(DoublenewPosition);
+
+        modifiedPositions.add(currentPosition);
+        modifiedPositions.add(newPosition);
+        modifiedPositions.add(DoublenewPosition);
+
+        extinguish(firefighterBoard, newPosition);
+        extinguish(firefighterBoard, DoublenewPosition);
+
+
+        for (Position neighbor : this.neighbour.getNeighbors().get(DoublenewPosition)) {
+            extinguish(firefighterBoard, neighbor);
+            modifiedPositions.add(neighbor);
+        }
+
+        for (Obstacle obstacle : firefighterBoard.getObstacles().values()) {
+            if (obstacle instanceof Montain) {
+                modifiedPositions.remove(obstacle.getPosition());
+            }
+        }
+
+        return modifiedPositions;
+
+    }
+}
diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java
index 57b2b15..a5db13a 100644
--- a/src/main/java/view/ViewElement.java
+++ b/src/main/java/view/ViewElement.java
@@ -10,6 +10,7 @@ public enum ViewElement {
   MOUNTAIN(Color.BROWN),
 
   ROCAILLE(Color.GREEN),
+  MOTORIZEDFIREFIGHTER(Color.PURPLE),
   EMPTY(Color.WHITE);
   final Color color;
   ViewElement(Color color) {
-- 
GitLab