From 4f09ba812fa2834dff4878b1221bb4fa8044eed1 Mon Sep 17 00:00:00 2001
From: LATIOUI <alatioui24@gmail.com>
Date: Thu, 23 Nov 2023 00:15:22 +0100
Subject: [PATCH] Implmentation of MotorizedFireFighter

---
 .gradle/file-system.probe                     | Bin 8 -> 8 bytes
 src/main/java/app/SimulatorApplication.java   |   8 +-
 src/main/java/controller/Controller.java      |   4 +-
 .../Builder/FireFirefightersBuilder.java      |   3 +-
 src/main/java/model/Builder/GameManage.java   |   4 +
 src/main/java/model/ExtinguishFire/Cloud.java |  14 +--
 .../ExtinguishFire/MotorizedFireFighter.java  | 105 +++++++++++++++++-
 src/main/java/model/Flammable/Fire.java       |   4 +-
 src/main/java/model/GameBoard.java            |   6 +-
 9 files changed, 129 insertions(+), 19 deletions(-)

diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe
index d9291c52f11415278b548b676f495d34ee06357e..e2a27b4fa137df29ad7ad2b30eb568a77facaacd 100644
GIT binary patch
literal 8
PcmZQzVC?>B>GB@{2-^b!

literal 8
PcmZQzVC??J`&S$Q2-O0l

diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java
index 041f726..351abfe 100644
--- a/src/main/java/app/SimulatorApplication.java
+++ b/src/main/java/app/SimulatorApplication.java
@@ -17,10 +17,10 @@ public class SimulatorApplication extends javafx.application.Application {
   private static final int COLUMN_COUNT = 20;
   private static final int SQUARE_WIDTH = 30;
   private static final int SQUARE_HEIGHT = 30;
-  public static final int INITIAL_FIRE_COUNT = 3;
-  public static final int INITIAL_FIREFIGHTER_COUNT = 6;
+  public static final int INITIAL_FIRE_COUNT = 5;
+  public static final int INITIAL_FIREFIGHTER_COUNT = 3;
   public static final int INITIAL_CLOUD_COUNT = 2;
-
+  public static final int INITIAL_MOTORIZEDFIREFIGHTER_COUNT = 2;
   private Stage primaryStage;
   private Parent view;
   private void initializePrimaryStage(Stage primaryStage) {
@@ -45,7 +45,7 @@ public class SimulatorApplication extends javafx.application.Application {
     view = loader.load();
     Controller controller = loader.getController();
     controller.initialize(SQUARE_WIDTH, SQUARE_HEIGHT, COLUMN_COUNT, ROW_COUNT,
-            INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT);
+            INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MOTORIZEDFIREFIGHTER_COUNT);
   }
 
   private void showScene() {
diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index d816b1f..8719a0a 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -109,9 +109,9 @@ public class Controller {
   }
 
   public void initialize(int squareWidth, int squareHeight, int columnCount,
-                         int rowCount, int initialFireCount, int initialFirefighterCount,int initialCloudCount) {
+                         int rowCount, int initialFireCount, int initialFirefighterCount,int initialCloudCount,int initialMotorizedFireFighterCount) {
     grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
-    board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount,initialCloudCount);
+    board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount,initialCloudCount,initialMotorizedFireFighterCount);
     board.initializeElements();
     repaintGrid();
   }
diff --git a/src/main/java/model/Builder/FireFirefightersBuilder.java b/src/main/java/model/Builder/FireFirefightersBuilder.java
index 13acd7a..8176171 100644
--- a/src/main/java/model/Builder/FireFirefightersBuilder.java
+++ b/src/main/java/model/Builder/FireFirefightersBuilder.java
@@ -1,12 +1,13 @@
 package model.Builder;
 
 public class FireFirefightersBuilder {
-    public void Build(int fires, int firefighters , int clouds) {
+    public void Build(int fires, int firefighters , int clouds , int motorizedFireFighter) {
         ConcreteGameBuilder concreteGameBuilder;
         concreteGameBuilder =new ConcreteGameBuilder();
         concreteGameBuilder.setFire(fires)
                 .setFireFighter(firefighters)
                 .setCloud(clouds)
+                .setMotorizedFireFighter(motorizedFireFighter)
                 .build();
     }
 }
diff --git a/src/main/java/model/Builder/GameManage.java b/src/main/java/model/Builder/GameManage.java
index 3786c3e..151135d 100644
--- a/src/main/java/model/Builder/GameManage.java
+++ b/src/main/java/model/Builder/GameManage.java
@@ -3,6 +3,7 @@ package model.Builder;
 import javafx.scene.paint.Color;
 import model.ExtinguishFire.Cloud;
 import model.ExtinguishFire.FireFighter;
+import model.ExtinguishFire.MotorizedFireFighter;
 import model.Flammable.Fire;
 
 public class GameManage {
@@ -35,6 +36,9 @@ public class GameManage {
         for(int i=0;i<clouds;i++) {
             new Cloud(Color.DARKBLUE);
         }
+        for(int i=0;i<motorizedFireFighters;i++) {
+            new MotorizedFireFighter(Color.ORANGE);
+        }
         // TODO: 15/11/2023  la suite .... aussi l'initialisation va changer dans fire et firefighter
     }
 
diff --git a/src/main/java/model/ExtinguishFire/Cloud.java b/src/main/java/model/ExtinguishFire/Cloud.java
index a4fcfb4..f4db6c7 100644
--- a/src/main/java/model/ExtinguishFire/Cloud.java
+++ b/src/main/java/model/ExtinguishFire/Cloud.java
@@ -55,20 +55,20 @@ public class Cloud implements ExtinguishFire{
         List<Position> neighbors = gameBoard.neighbors(position);
         Random random = new Random();
         int randomIndex = random.nextInt(neighbors.size());
-        Position newFirefighterPosition = neighbors.get(randomIndex);
-        if(newElementPosition.containsKey(newFirefighterPosition)){
-            newElementPosition.get(newFirefighterPosition).add(this);
+        Position newCloudPosition = neighbors.get(randomIndex);
+        if(newElementPosition.containsKey(newCloudPosition)){
+            newElementPosition.get(newCloudPosition).add(this);
         }
         else{
             ArrayList<BoardElement> boardElements = new ArrayList<>();
             boardElements.add(this);
-            newElementPosition.put(newFirefighterPosition,boardElements);
+            newElementPosition.put(newCloudPosition,boardElements);
         }
-        extinguishPosition.add(newFirefighterPosition);
-        List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
+        extinguishPosition.add(newCloudPosition);
+        /*List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
                 .filter(firePositions::contains).toList();
         for(Position firePosition : neighborFirePositions) {
             extinguishPosition.add(firePosition);
-        }
+        }*/
     }
 }
diff --git a/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java b/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java
index ef4d68e..5d04606 100644
--- a/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java
+++ b/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java
@@ -1,4 +1,107 @@
 package model.ExtinguishFire;
 
-public class MotorizedFireFighter {
+import javafx.scene.paint.Color;
+import model.BoardElement;
+import model.GameBoard;
+import model.Visitor.CrossMountain;
+import model.Visitor.FireFinder;
+import model.Visitor.Visitor;
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static model.GameBoard.elementPosition;
+
+public class MotorizedFireFighter implements ExtinguishFire {
+
+    Color color;
+
+    public MotorizedFireFighter(Color color){
+        this.color=color;
+        initialize();
+    }
+    @Override
+    public Color getColor() {
+        return color;
+    }
+
+    @Override
+    public Boolean accept(Visitor visitor) {
+        return visitor.visit(this);
+    }
+
+    @Override
+    public void initialize() {
+        CrossMountain crossMountain=new CrossMountain();
+        boolean canInitialise;
+        Position position = GameBoard.randomPosition();
+        if(elementPosition.containsKey(position)) {
+            for (;;) {
+                canInitialise = true;
+                for (BoardElement element : elementPosition.get(position)) {
+                    if (element.accept(crossMountain)) {
+                        canInitialise = false;
+                        break;
+                    }
+                }
+                if (canInitialise) {
+                    break;
+                }
+                position = GameBoard.randomPosition();
+                if (!elementPosition.containsKey(position)) break;
+            }
+            if (elementPosition.containsKey(position))
+                elementPosition.get(position).add(this);
+            else {
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(this);
+                elementPosition.put(position, boardElements);
+            }
+
+        }
+        ArrayList<BoardElement> boardElements = new ArrayList<>();
+        boardElements.add(this);
+        elementPosition.put(position,boardElements);
+    }
+
+    @Override
+    public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
+
+        List<Position> firePositions = new ArrayList<>();
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
+            for (BoardElement element : entry.getValue()) {
+                if (element.accept(new FireFinder())) {
+                    firePositions.add(entry.getKey());
+                }
+            }
+        }
+        ArrayList<Position> newMotorizedFireFighterPositions = new ArrayList<>();
+        Position newMotorizedFireFighterPosition1 = gameBoard.neighborClosestToFire(position);
+        newMotorizedFireFighterPositions.add(newMotorizedFireFighterPosition1);
+        Position newMotorizedFireFighterPosition2 = gameBoard.neighborClosestToFire(newMotorizedFireFighterPosition1);
+        newMotorizedFireFighterPositions.add(newMotorizedFireFighterPosition2);
+
+        if(newElementPosition.containsKey(newMotorizedFireFighterPosition2)){
+            newElementPosition.get(newMotorizedFireFighterPosition2).add(this);
+        }
+        else{
+            ArrayList<BoardElement> boardElements = new ArrayList<>();
+            boardElements.add(this);
+            newElementPosition.put(newMotorizedFireFighterPosition2,boardElements);
+        }
+        for(Position newPosition : newMotorizedFireFighterPositions) {
+            extinguishPosition.add(newPosition);
+        }
+        List<Position> neighborFirePositions = new ArrayList<>();
+        neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPosition1).stream()
+                .filter(firePositions::contains).toList());
+        neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPosition2).stream()
+                .filter(firePositions::contains).toList());
+        for(Position firePosition : neighborFirePositions) {
+            extinguishPosition.add(firePosition);
+        }
+    }
 }
diff --git a/src/main/java/model/Flammable/Fire.java b/src/main/java/model/Flammable/Fire.java
index 41190fc..1d156d3 100644
--- a/src/main/java/model/Flammable/Fire.java
+++ b/src/main/java/model/Flammable/Fire.java
@@ -78,8 +78,8 @@ public class Fire implements Flammable{
                 newElementPosition.get(position).add(this);
             }
             for(Position newPosition : newPositions){
-                //if(extinguishPosition.contains(newPosition))
-                    //continue;
+                if(extinguishPosition.contains(newPosition))
+                    continue;
                 if(GameBoard.elementPosition.containsKey(newPosition)) {
                     for(BoardElement boardElement : GameBoard.elementPosition.get(newPosition)){
                         if(boardElement.accept(new FireFinder()) && boardElement.accept(new CrossRoad()) && boardElement.accept(new CrossMountain())){
diff --git a/src/main/java/model/GameBoard.java b/src/main/java/model/GameBoard.java
index 4795d8c..1cb840f 100644
--- a/src/main/java/model/GameBoard.java
+++ b/src/main/java/model/GameBoard.java
@@ -15,6 +15,7 @@ public class GameBoard implements Board{
     private int initialFireCount;
     private int initialFirefighterCount;
     private int initialCloudCount;
+    private int initialMotorizedFireFighterCount;
     private int step = 0;
     static Random randomGenerator = new Random();
 
@@ -24,17 +25,18 @@ public class GameBoard implements Board{
 
     public static HashMap<Position, ArrayList<BoardElement>> elementPosition=new HashMap<>();
 
-    public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount,int initialCloudCount) {
+    public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount,int initialCloudCount,int initialMotorizedFireFighterCount) {
         this.columnCount = columnCount;
         this.rowCount = rowCount;
         this.initialFireCount = initialFireCount;
         this.initialFirefighterCount = initialFirefighterCount;
         this.initialCloudCount = initialCloudCount;
+        this.initialMotorizedFireFighterCount=initialMotorizedFireFighterCount;
     }
 
     public void initializeElements(){
         FireFirefightersBuilder fireFirefighterBuilder=new FireFirefightersBuilder();
-        fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount,this.initialCloudCount);
+        fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount,this.initialCloudCount,this.initialMotorizedFireFighterCount);
     }
 
     public static Position randomPosition() {
-- 
GitLab