From 1341cc1329a5ef145bf052be61a8746765a7140c Mon Sep 17 00:00:00 2001
From: 1380 <@l21221596>
Date: Mon, 13 Nov 2023 20:13:26 +0100
Subject: [PATCH] In order to implement the Visitor design pattern, we create
 various sub-packages, each one contains different classes and interfaces

---
 src/main/java/app/SimulatorApplication.java   |  4 +-
 src/main/java/model/BoardElement.java         | 18 +++++
 src/main/java/model/ExtenguishFire/Cloud.java |  4 +
 .../model/ExtenguishFire/FireFighter.java     |  4 +
 .../model/ExtenguishFire/FireFighters.java    | 11 +++
 .../ExtenguishFire/MotorizedFireFighter.java  |  4 +
 src/main/java/model/FirefighterBoard.java     |  9 ++-
 src/main/java/model/Flammable/Fire.java       | 79 +++++++++++++++++++
 src/main/java/model/Flammable/Fires.java      | 20 +++++
 src/main/java/model/Obstacle/Mountain.java    |  4 +
 src/main/java/model/Obstacle/Obstacles.java   | 10 +++
 src/main/java/model/Obstacle/Road.java        |  4 +
 .../java/model/Visitor/CrossMountain.java     | 34 ++++++++
 src/main/java/model/Visitor/CrossRoad.java    | 34 ++++++++
 src/main/java/model/Visitor/FireFinder.java   | 34 ++++++++
 src/main/java/model/Visitor/Visitor.java      | 17 ++++
 src/main/resources/view/view.fxml             |  2 +-
 17 files changed, 285 insertions(+), 7 deletions(-)
 create mode 100644 src/main/java/model/BoardElement.java
 create mode 100644 src/main/java/model/ExtenguishFire/Cloud.java
 create mode 100644 src/main/java/model/ExtenguishFire/FireFighter.java
 create mode 100644 src/main/java/model/ExtenguishFire/FireFighters.java
 create mode 100644 src/main/java/model/ExtenguishFire/MotorizedFireFighter.java
 create mode 100644 src/main/java/model/Flammable/Fire.java
 create mode 100644 src/main/java/model/Flammable/Fires.java
 create mode 100644 src/main/java/model/Obstacle/Mountain.java
 create mode 100644 src/main/java/model/Obstacle/Obstacles.java
 create mode 100644 src/main/java/model/Obstacle/Road.java
 create mode 100644 src/main/java/model/Visitor/CrossMountain.java
 create mode 100644 src/main/java/model/Visitor/CrossRoad.java
 create mode 100644 src/main/java/model/Visitor/FireFinder.java
 create mode 100644 src/main/java/model/Visitor/Visitor.java

diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java
index 6b009e4..2646eb7 100644
--- a/src/main/java/app/SimulatorApplication.java
+++ b/src/main/java/app/SimulatorApplication.java
@@ -15,8 +15,8 @@ public class SimulatorApplication extends javafx.application.Application {
   private static final String APP_NAME = "Firefighter simulator";
   private static final int ROW_COUNT = 20;
   private static final int COLUMN_COUNT = 20;
-  private static final int SQUARE_WIDTH = 50;
-  private static final int SQUARE_HEIGHT = 50;
+  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;
 
diff --git a/src/main/java/model/BoardElement.java b/src/main/java/model/BoardElement.java
new file mode 100644
index 0000000..912a524
--- /dev/null
+++ b/src/main/java/model/BoardElement.java
@@ -0,0 +1,18 @@
+package model;
+
+import javafx.scene.paint.Color;
+import model.Visitor.Visitor;
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+public interface BoardElement {
+
+    Color getColor();
+    void setColor(Color color);
+    Boolean accept(Visitor visitor);
+    void initialize(int initialElementCount, HashMap<Position, ArrayList<BoardElement>> elementPosition);
+}
diff --git a/src/main/java/model/ExtenguishFire/Cloud.java b/src/main/java/model/ExtenguishFire/Cloud.java
new file mode 100644
index 0000000..8301d6e
--- /dev/null
+++ b/src/main/java/model/ExtenguishFire/Cloud.java
@@ -0,0 +1,4 @@
+package model.ExtenguishFire;
+
+public class Cloud {
+}
diff --git a/src/main/java/model/ExtenguishFire/FireFighter.java b/src/main/java/model/ExtenguishFire/FireFighter.java
new file mode 100644
index 0000000..b9d56c6
--- /dev/null
+++ b/src/main/java/model/ExtenguishFire/FireFighter.java
@@ -0,0 +1,4 @@
+package model.ExtenguishFire;
+
+public class FireFighter {
+}
diff --git a/src/main/java/model/ExtenguishFire/FireFighters.java b/src/main/java/model/ExtenguishFire/FireFighters.java
new file mode 100644
index 0000000..91e7ccf
--- /dev/null
+++ b/src/main/java/model/ExtenguishFire/FireFighters.java
@@ -0,0 +1,11 @@
+package model.ExtenguishFire;
+
+import model.BoardElement;
+import util.Position;
+
+import java.util.List;
+
+public interface FireFighters extends BoardElement {
+    List<Position> updateFirefighters();
+    boolean accept();
+}
diff --git a/src/main/java/model/ExtenguishFire/MotorizedFireFighter.java b/src/main/java/model/ExtenguishFire/MotorizedFireFighter.java
new file mode 100644
index 0000000..e202215
--- /dev/null
+++ b/src/main/java/model/ExtenguishFire/MotorizedFireFighter.java
@@ -0,0 +1,4 @@
+package model.ExtenguishFire;
+
+public class MotorizedFireFighter {
+}
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 3251952..2d0b030 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -6,14 +6,15 @@ import java.util.*;
 
 
 public class FirefighterBoard implements Board<List<ModelElement>> {
-  private final int columnCount;
-  private final int rowCount;
+   static  int columnCount;
+   static  int rowCount;
   private final int initialFireCount;
   private final int initialFirefighterCount;
+  protected HashMap<Position,ArrayList<BoardElement>> elementPosition;
   private List<Position> firefighterPositions;
   private Set<Position> firePositions;
   private int step = 0;
-  private final Random randomGenerator = new Random();
+  static Random randomGenerator = new Random();
 
   public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
     this.columnCount = columnCount;
@@ -32,7 +33,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
       firefighterPositions.add(randomPosition());
   }
 
-  private Position randomPosition() {
+   public static Position randomPosition() {
     return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
   }
 
diff --git a/src/main/java/model/Flammable/Fire.java b/src/main/java/model/Flammable/Fire.java
new file mode 100644
index 0000000..621ab15
--- /dev/null
+++ b/src/main/java/model/Flammable/Fire.java
@@ -0,0 +1,79 @@
+package model.Flammable;
+
+import javafx.scene.paint.Color;
+import model.BoardElement;
+import model.FirefighterBoard;
+import model.Visitor.FireFinder;
+import model.Visitor.Visitor;
+import util.Position;
+
+import java.util.*;
+
+public class Fire implements Fires{
+
+    private Color color;
+
+    public Fire(){
+    }
+    public Fire(Color color){
+        this.color = color;
+    }
+
+    @Override
+    public Color getColor() {
+        return this.color;
+    }
+
+    @Override
+    public void setColor(Color color) {
+        this.color = color;
+    }
+
+    @Override
+    public Boolean accept(Visitor visitor){
+        return visitor.visit(this);
+    }
+
+    @Override
+    public void initialize(int initialFireCount, HashMap<Position, ArrayList<BoardElement>> elementPosition) {
+        FireFinder fireFinder=new FireFinder();
+        Position position = FirefighterBoard.randomPosition();
+        int index;
+        for ( index = 0; index < initialFireCount; index++) {
+            if(elementPosition.containsKey(position)  ) {
+                for (BoardElement element : elementPosition.get(position)) {
+                    if (!element.accept(fireFinder)) {
+                        break;
+                    }
+                }
+            if(index==-1){
+                elementPosition.get(position).add(new Fire());
+            }
+            }
+            else{
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(new Fire());
+                elementPosition.put(position,boardElements);
+            }
+        }
+    }
+
+            /*if(elementPosition.containsKey(position) &&  ){
+                continue;
+            }
+            else if(elementPosition.containsKey(position)){
+                elementPosition.get(position).add(fire);
+            }
+            else{
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(fire);
+                elementPosition.put(position,boardElements);
+            }
+        }
+    }*/
+
+    @Override
+    public List<Position> updateFires() {
+        return null;
+    }
+}
diff --git a/src/main/java/model/Flammable/Fires.java b/src/main/java/model/Flammable/Fires.java
new file mode 100644
index 0000000..b17a550
--- /dev/null
+++ b/src/main/java/model/Flammable/Fires.java
@@ -0,0 +1,20 @@
+package model.Flammable;
+
+import javafx.scene.paint.Color;
+import model.BoardElement;
+import model.Visitor.Visitor;
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public interface Fires extends BoardElement{
+    void setColor(Color color);
+
+    Boolean accept(Visitor visitor);
+
+    void initialize(int initialFireCount, HashMap<Position, ArrayList<BoardElement>> elementPosition);
+
+    List<Position> updateFires();
+}
diff --git a/src/main/java/model/Obstacle/Mountain.java b/src/main/java/model/Obstacle/Mountain.java
new file mode 100644
index 0000000..3664256
--- /dev/null
+++ b/src/main/java/model/Obstacle/Mountain.java
@@ -0,0 +1,4 @@
+package model.Obstacle;
+
+public class Mountain {
+}
diff --git a/src/main/java/model/Obstacle/Obstacles.java b/src/main/java/model/Obstacle/Obstacles.java
new file mode 100644
index 0000000..fc8290a
--- /dev/null
+++ b/src/main/java/model/Obstacle/Obstacles.java
@@ -0,0 +1,10 @@
+package model.Obstacle;
+
+import model.BoardElement;
+import util.Position;
+
+import java.util.List;
+
+public interface Obstacles extends BoardElement {
+    boolean accept();
+}
diff --git a/src/main/java/model/Obstacle/Road.java b/src/main/java/model/Obstacle/Road.java
new file mode 100644
index 0000000..70a0adb
--- /dev/null
+++ b/src/main/java/model/Obstacle/Road.java
@@ -0,0 +1,4 @@
+package model.Obstacle;
+
+public class Road {
+}
diff --git a/src/main/java/model/Visitor/CrossMountain.java b/src/main/java/model/Visitor/CrossMountain.java
new file mode 100644
index 0000000..288af45
--- /dev/null
+++ b/src/main/java/model/Visitor/CrossMountain.java
@@ -0,0 +1,34 @@
+package model.Visitor;
+
+import model.ExtenguishFire.FireFighter;
+import model.ExtenguishFire.MotorizedFireFighter;
+import model.Flammable.Fire;
+import model.Obstacle.Mountain;
+import model.Obstacle.Road;
+
+public class CrossMountain implements Visitor {
+    @Override
+    public boolean visit(Fire fire) {
+        return false;
+    }
+
+    @Override
+    public boolean visit(FireFighter fireFighter) {
+        return false;
+    }
+
+    @Override
+    public boolean visit(MotorizedFireFighter motorizedFireFighter) {
+        return false;
+    }
+
+    @Override
+    public boolean visit(Mountain mountain) {
+        return false;
+    }
+
+    @Override
+    public boolean visit(Road road) {
+        return false;
+    }
+}
diff --git a/src/main/java/model/Visitor/CrossRoad.java b/src/main/java/model/Visitor/CrossRoad.java
new file mode 100644
index 0000000..cf53acf
--- /dev/null
+++ b/src/main/java/model/Visitor/CrossRoad.java
@@ -0,0 +1,34 @@
+package model.Visitor;
+
+import model.ExtenguishFire.FireFighter;
+import model.ExtenguishFire.MotorizedFireFighter;
+import model.Flammable.Fire;
+import model.Obstacle.Mountain;
+import model.Obstacle.Road;
+
+public class CrossRoad implements Visitor {
+    @Override
+    public boolean visit(Fire fire) {
+        return false;
+    }
+
+    @Override
+    public boolean visit(FireFighter fireFighter) {
+        return true;
+    }
+
+    @Override
+    public boolean visit(MotorizedFireFighter motorizedFireFighter) {
+        return true;
+    }
+
+    @Override
+    public boolean visit(Mountain mountain) {
+        return false;
+    }
+
+    @Override
+    public boolean visit(Road road) {
+        return false;
+    }
+}
diff --git a/src/main/java/model/Visitor/FireFinder.java b/src/main/java/model/Visitor/FireFinder.java
new file mode 100644
index 0000000..7e7ce43
--- /dev/null
+++ b/src/main/java/model/Visitor/FireFinder.java
@@ -0,0 +1,34 @@
+package model.Visitor;
+
+import model.ExtenguishFire.FireFighter;
+import model.ExtenguishFire.MotorizedFireFighter;
+import model.Flammable.Fire;
+import model.Obstacle.Mountain;
+import model.Obstacle.Road;
+
+public class FireFinder implements Visitor {
+    @Override
+    public boolean visit(Fire fire) {
+        return true;
+    }
+
+    @Override
+    public boolean visit(FireFighter fireFighter) {
+        return false;
+    }
+
+    @Override
+    public boolean visit(MotorizedFireFighter motorizedFireFighter) {
+        return false;
+    }
+
+    @Override
+    public boolean visit(Mountain mountain) {
+        return false;
+    }
+
+    @Override
+    public boolean visit(Road road) {
+        return false;
+    }
+}
diff --git a/src/main/java/model/Visitor/Visitor.java b/src/main/java/model/Visitor/Visitor.java
new file mode 100644
index 0000000..da5b1a2
--- /dev/null
+++ b/src/main/java/model/Visitor/Visitor.java
@@ -0,0 +1,17 @@
+package model.Visitor;
+
+import model.ExtenguishFire.FireFighter;
+import model.ExtenguishFire.MotorizedFireFighter;
+import model.Flammable.Fire;
+import model.Flammable.Fires;
+import model.Obstacle.Mountain;
+import model.Obstacle.Road;
+
+public interface Visitor {
+
+    boolean visit(Fire fire);
+    boolean visit(FireFighter fireFighter);
+    boolean visit(MotorizedFireFighter motorizedFireFighter);
+    boolean visit(Mountain mountain);
+    boolean visit(Road road);
+}
diff --git a/src/main/resources/view/view.fxml b/src/main/resources/view/view.fxml
index 3f19ac9..ac3a91e 100644
--- a/src/main/resources/view/view.fxml
+++ b/src/main/resources/view/view.fxml
@@ -33,7 +33,7 @@
                   mnemonicParsing="false" onAction="#pauseToggleButtonAction" prefHeight="24.0"
                   prefWidth="200.0" styleClass="button" text="Pause"/>
   </VBox>
-  <FirefighterGrid fx:id="grid" width="1000.0" height="1000.0"
+  <FirefighterGrid fx:id="grid" width="600.0" height="600.0"
                    xmlns="http://javafx.com/javafx"
                    xmlns:fx="http://javafx.com/fxml">
   </FirefighterGrid>
-- 
GitLab