From 968ab2b0645ba3109b88e481c114104ff785d4c3 Mon Sep 17 00:00:00 2001
From: Anthony Viola <anthony.viola34@gmail.com>
Date: Sat, 18 Nov 2023 20:16:16 +0100
Subject: [PATCH] Firefighter rebuild

---
 src/main/java/controller/Controller.java  |  1 -
 src/main/java/model/Cloud.java            | 19 +++++++++++++++
 src/main/java/model/Extinguisher.java     | 14 +++---------
 src/main/java/model/Fire.java             | 18 +++------------
 src/main/java/model/Firefighter.java      | 28 +++++++++++++++++------
 src/main/java/model/FirefighterBoard.java | 14 ++++++++++--
 src/main/java/model/Item.java             |  2 --
 src/main/java/model/Road.java             |  1 +
 8 files changed, 59 insertions(+), 38 deletions(-)
 create mode 100644 src/main/java/model/Cloud.java

diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 2a60897..bcf7d3e 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -77,7 +77,6 @@ public class Controller {
     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());
   }
 
diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java
new file mode 100644
index 0000000..b679ea0
--- /dev/null
+++ b/src/main/java/model/Cloud.java
@@ -0,0 +1,19 @@
+package model;
+
+import util.Position;
+
+import java.util.List;
+import java.util.Random;
+
+public class Cloud extends Extinguisher implements Item {
+    public Cloud(Position position) {
+        super(position);
+    }
+
+
+    void move(FirefighterBoard board) {
+        List<Position> neighborslist = board.neighbors(position);
+        Random ran = new Random();
+        position = neighborslist.get(ran.nextInt(neighborslist.size()));
+    }
+}
diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java
index 4e15928..d39efbd 100644
--- a/src/main/java/model/Extinguisher.java
+++ b/src/main/java/model/Extinguisher.java
@@ -6,33 +6,25 @@ import java.util.ArrayList;
 import java.util.List;
 
 public abstract class Extinguisher {
-    private Position position;
+    protected Position position;
 
     public Extinguisher(Position position){
         this.position = position;
     }
-    public List<Position> neighbors(Position position, FirefighterBoard board){
-        List<Position> list = new ArrayList<>();
-        if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
-        if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
-        if (position.row() < board.rowCount() - 1) list.add(new Position(position.row() + 1, position.column()));
-        if (position.column() < board.columnCount() - 1) list.add(new Position(position.row(), position.column() + 1));
-        return list;
-    }
 
     public Position position() {
         return position;
     }
 
 
-    void update(FirefighterBoard board){
+    public void update(FirefighterBoard board){
         move(board);
         extinguish(board);
     }
 
     private void extinguish(FirefighterBoard board) {
         List<Item> itemList = board.itemList();
-        List<Position> neighborslist = neighbors(position, board);
+        List<Position> neighborslist = board.neighbors(position);
         for (Position neighborsposition: neighborslist) {
             itemList.removeIf(item -> neighborsposition == item.position() && item instanceof Fire);
 
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index 98512a2..028b669 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -7,31 +7,19 @@ import java.util.List;
 
 public class Fire implements Item{
 
-    private Position position;
+    private final Position position;
 
     public Fire(Position position) {
         this.position = position;
     }
 
-    @Override
     public void update(FirefighterBoard board) {
-        List<Position> neighborslist = neighbors(position, board);
+        List<Position> neighborslist = board.neighbors(position);
         for (Position neighborposition : neighborslist) {
             board.itemList().add(new Fire(neighborposition));
         }
     }
-
-    public List<Position> neighbors(Position position, FirefighterBoard board){
-        List<Position> list = new ArrayList<>();
-        if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
-        if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
-        if (position.row() < board.rowCount() - 1) list.add(new Position(position.row() + 1, position.column()));
-        if (position.column() < board.columnCount() - 1) list.add(new Position(position.row(), position.column() + 1));
-        return list;
-    }
-
-    @Override
     public Position position() {
-        return null;
+        return position;
     }
 }
diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java
index 3fa26bf..5120ad2 100644
--- a/src/main/java/model/Firefighter.java
+++ b/src/main/java/model/Firefighter.java
@@ -2,18 +2,32 @@ package model;
 
 import util.Position;
 
+import java.util.*;
+
 public class Firefighter extends Extinguisher implements Item{
     public Firefighter(Position position) {
         super(position);
     }
 
-    @Override
     void move(FirefighterBoard board) {
-
-    }
-
-    @Override
-    public void update(FirefighterBoard board) {
-
+        Set<Position> seen = new HashSet<>();
+        HashMap<Position, Position> firstMove = new HashMap<>();
+        Queue<Position> toVisit = new LinkedList<>(board.neighbors(position));
+        for (Position initialMove : toVisit) {
+            firstMove.put(initialMove, initialMove);
+        }
+        while (!toVisit.isEmpty()) {
+            Position current = toVisit.poll();
+            if (board.getItemByPosition(current) instanceof Fire) {
+                position = firstMove.get(current);
+                return;
+            }
+            for (Position adjacent : board.neighbors(current)) {
+                if (seen.contains(adjacent)) continue;
+                toVisit.add(adjacent);
+                seen.add(adjacent);
+                firstMove.put(adjacent, firstMove.get(current));
+            }
+        }
     }
 }
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index b37bb43..336ef7e 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -86,6 +86,15 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
 
   public List<Item> itemList() { return itemList; }
 
+  public Item getItemByPosition(Position position) {
+    for (Item item: itemList) {
+      if (item.position() == position){
+        return item;
+      }
+    }
+    return null;
+  }
+
   public List<Box> boxList() { return boxList; }
 
   private List<Position> updateFirefighters() {
@@ -117,7 +126,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     firePositions.remove(position);
   }
 
-  private List<Position> neighbors(Position position) {
+  public List<Position> neighbors(Position position) {
     List<Position> list = new ArrayList<>();
     if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
     if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
@@ -130,8 +139,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
     Set<Position> seen = new HashSet<>();
     HashMap<Position, Position> firstMove = new HashMap<>();
     Queue<Position> toVisit = new LinkedList<>(neighbors(position));
-    for (Position initialMove : toVisit)
+    for (Position initialMove : toVisit) {
       firstMove.put(initialMove, initialMove);
+    }
     while (!toVisit.isEmpty()) {
       Position current = toVisit.poll();
       if (firePositions.contains(current))
diff --git a/src/main/java/model/Item.java b/src/main/java/model/Item.java
index 1593d56..b527bfd 100644
--- a/src/main/java/model/Item.java
+++ b/src/main/java/model/Item.java
@@ -8,7 +8,5 @@ public interface Item {
 
     void update(FirefighterBoard board);
 
-    List<Position> neighbors(Position position, FirefighterBoard board);
-
     Position position();
 }
diff --git a/src/main/java/model/Road.java b/src/main/java/model/Road.java
index 3aec54f..eceb1c3 100644
--- a/src/main/java/model/Road.java
+++ b/src/main/java/model/Road.java
@@ -1,4 +1,5 @@
 package model;
 
 public class Road implements Box{
+
 }
-- 
GitLab