From a2dd7f6de220147304619b6bc97d652d7f5f23b4 Mon Sep 17 00:00:00 2001
From: Yanis OUALAN <oualanyanis01@gmail.com>
Date: Sat, 23 Nov 2024 12:26:48 +0100
Subject: [PATCH] =?UTF-8?q?[Ajout]=20Pompier=20motoris=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/model/Cloud.java                |  3 +-
 src/main/java/model/Fire.java                 | 24 ++++++++-
 src/main/java/model/FireFighter.java          |  5 +-
 src/main/java/model/FireFighterScenario.java  | 10 +---
 src/main/java/model/MotorizedFireFighter.java | 52 +++++++++++++++++++
 src/main/java/util/PositionUtil.java          | 12 +++++
 6 files changed, 93 insertions(+), 13 deletions(-)
 create mode 100644 src/main/java/model/MotorizedFireFighter.java

diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java
index 52ad4a1..baf7b0a 100644
--- a/src/main/java/model/Cloud.java
+++ b/src/main/java/model/Cloud.java
@@ -45,7 +45,7 @@ public class Cloud implements Entity{
         if (b.getStates(next_position).getEntities().stream().anyMatch(element -> element instanceof Fire) ){
             extinguish(next_position, b);
         }
-
+        
         Position old_position = this.position;
         this.position = next_position;
         b.addEntityAtSquare(this, next_position);
@@ -101,4 +101,5 @@ public class Cloud implements Entity{
     @Override
     public int getPriority(){ return this.priority;}
 
+
 }
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index 3bb763e..c3814b3 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -6,7 +6,7 @@ import java.util.List;
 import javafx.scene.paint.Color;
 import util.Position;
 import util.PositionUtil;
-import util.PositionUtil;
+
 
 public class Fire implements Entity {
     Board<Square> b;
@@ -82,4 +82,26 @@ public class Fire implements Entity {
 
     @Override
     public int getPriority(){ return this.priority;}
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+        if (obj == null || getClass() != obj.getClass()) return false;
+        Fire fire = (Fire) obj;
+        return age == fire.age &&
+               priority == fire.priority &&
+               (position == null ? fire.position == null : position.equals(fire.position)) &&
+               (b == null ? fire.b == null : b.equals(fire.b)) &&
+               (viewColor == null ? fire.viewColor == null : viewColor.equals(fire.viewColor));
+    }
+    
+    @Override
+    public int hashCode() {
+        int result = (b == null ? 0 : b.hashCode());
+        result = 31 * result + (position == null ? 0 : position.hashCode());
+        result = 31 * result + (viewColor == null ? 0 : viewColor.hashCode());
+        result = 31 * result + age;
+        result = 31 * result + priority;
+        return result;
+    }
 }
diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java
index e206765..bd7ffb6 100644
--- a/src/main/java/model/FireFighter.java
+++ b/src/main/java/model/FireFighter.java
@@ -31,7 +31,6 @@ public class FireFighter implements Entity {
         // Vérifier s'il y a du feu dans une des positions adjacentes
         boolean hasFire = adjacentPositions.stream()
                 .anyMatch(p -> b.doesSquareContainEntity(p, Fire.class));
-
         if (hasFire) {
             // Si du feu est trouvé, on éteint les feux adjacents
             positions.addAll(extinguish(adjacentPositions, b));
@@ -59,7 +58,7 @@ public class FireFighter implements Entity {
         return positions;
     }
 
-    private List<Position> extinguish(List<Position> adjacentPositions, Board<Square> b) {
+    protected List<Position> extinguish(List<Position> adjacentPositions, Board<Square> b) {
         List<Position> extinguishedPositions = new ArrayList<>();
         for (Position p : adjacentPositions) {
             extinguishedPositions.addAll(adjacentPositions);
@@ -76,7 +75,7 @@ public class FireFighter implements Entity {
         return extinguishedPositions;
     }
 
-    private Position getNextPositionTowards(Position currentPos, Position targetPos, Board<Square> b) {
+    protected Position getNextPositionTowards(Position currentPos, Position targetPos, Board<Square> b) {
         // Générer les 8 positions adjacentes possibles
         List<Position> possibleMoves = PositionUtil.generateAllAdjacentPositions(currentPos, b);
 
diff --git a/src/main/java/model/FireFighterScenario.java b/src/main/java/model/FireFighterScenario.java
index d0dc344..58d3704 100644
--- a/src/main/java/model/FireFighterScenario.java
+++ b/src/main/java/model/FireFighterScenario.java
@@ -3,16 +3,12 @@ package model;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Random;
-import java.util.Random;
 
 import util.Matrix;
 import util.Position;
 import util.PositionUtil;
-import util.PositionUtil;
 
 public class FireFighterScenario extends EntityScenario implements Board<Square> {
 
@@ -48,7 +44,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
         positions.add(new Position(x, y));
       }
     }
-
+    setSquare(new Square(new Position(0,0), new MotorizedFireFighter(new Position(0,0), this)));
     while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount || cloudCount < intialCloudCount) {
       Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire
 
@@ -166,9 +162,8 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
       }
       List<Entity> entities = new ArrayList<>(s.getEntities());
       for (Entity e : entities) {
-        List<Position> entityUpdatedPositions = e.nextTurn(this);
         e.incrementAge();
-        changedPositions.addAll(entityUpdatedPositions);
+        changedPositions.addAll(e.nextTurn(this));
       }
 
     }
@@ -184,7 +179,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
 
     // Définir la distance maximale possible
     int maxDistance = rows + cols;
-
     // Parcourir les distances croissantes à partir de 1
     for (int distance = 1; distance < maxDistance; distance++) {
       List<Position> positionsAtDistance = PositionUtil.getPositionsAtManhattanDistance(fromPos, distance, rows, cols);
diff --git a/src/main/java/model/MotorizedFireFighter.java b/src/main/java/model/MotorizedFireFighter.java
new file mode 100644
index 0000000..4ad3f74
--- /dev/null
+++ b/src/main/java/model/MotorizedFireFighter.java
@@ -0,0 +1,52 @@
+package model;
+
+import java.util.*;
+import javafx.scene.paint.Color;
+import util.*;
+
+public class MotorizedFireFighter extends FireFighter {
+    private final Color viewColor = Color.CYAN;
+    public MotorizedFireFighter(Position position, Board<Square> b){
+        super(position, b);
+    }
+    public List<Position> nextTurn(Board<Square> b) {
+        List<Position> positions = new ArrayList<>();
+
+        // Générer les positions adjacentes
+        List<Position> adjacentPositions = PositionUtil.generateAdjacentPositions(getPosition(), b);
+        adjacentPositions.removeIf( p -> b.doesSquareContainEntity(p, Mountain.class));
+
+        // Vérifier s'il y a du feu dans une des positions adjacentes
+        boolean hasFire = adjacentPositions.stream()
+                .anyMatch(p -> b.doesSquareContainEntity(p, Fire.class));
+        if (hasFire) {
+            // Si du feu est trouvé, on éteint les feux adjacents
+            positions.addAll(extinguish(adjacentPositions, b));
+        } else {
+            // Chercher la position du feu le plus proche
+            Position nearestFirePos = b.getNearestEntity(getPosition(), Fire.class);
+
+            if (nearestFirePos != null && !nearestFirePos.equals(getPosition())) {
+                // Trouver la meilleure position pour se rapprocher du feu
+                Position nextPos = getNextPositionTowards(getNextPositionTowards(getPosition(), nearestFirePos, b),nearestFirePos, b);
+                if (nextPos != null) {
+                    // Mettre à jour la position du pompier
+                    b.clearCaseFrom(this, getPosition()); // Vider l'ancienne case
+                    positions.add(new Position(getPosition().x(), getPosition().y()));
+                    setPosition(nextPos);
+                    b.addEntityAtSquare(this, nextPos); // Mettre à jour la nouvelle case
+                    positions.add(nextPos);
+                    adjacentPositions = PositionUtil.generateAdjacentPositions(nextPos, b);
+                    positions.addAll(extinguish(adjacentPositions, b));
+                }
+                // Aucun déplacement possible = le pompier reste sur place
+            }
+        }
+
+        return positions;
+    }
+    public Color getViewColor(){
+        return this.viewColor;
+    }
+
+}
diff --git a/src/main/java/util/PositionUtil.java b/src/main/java/util/PositionUtil.java
index ce415d5..4fa6408 100644
--- a/src/main/java/util/PositionUtil.java
+++ b/src/main/java/util/PositionUtil.java
@@ -74,6 +74,18 @@ public class PositionUtil {
                 .collect(Collectors.toList());
     }
 
+    public static List<Position> generateAdjacentPositions(Position position, Board<Square> board, int distance) {
+        int x = position.x();
+        int y = position.y();
+
+        List<Position> positions = new ArrayList<Position>();
+        for(int i = 0; i < 4; i++){
+
+        }
+        return positions;
+    }
+
+
     // Méthode pour générer toutes les positions adjacentes (y compris les
     // diagonales)
     public static List<Position> generateAllAdjacentPositions(Position position, Board<Square> board) {
-- 
GitLab