From 66bbe873b82cb42b837d93b089818426b016bfe9 Mon Sep 17 00:00:00 2001 From: Anthony Viola <anthony.viola34@gmail.com> Date: Sun, 19 Nov 2023 13:58:00 +0100 Subject: [PATCH] Firefighter rebuild --- src/main/java/app/SimulatorApplication.java | 4 +--- src/main/java/controller/Controller.java | 13 +++++++++++ src/main/java/model/Board.java | 11 +++++++++ src/main/java/model/Cloud.java | 19 +++++++++++++--- src/main/java/model/Extinguisher.java | 25 ++++++++++++++------- src/main/java/model/Fire.java | 9 ++++++-- src/main/java/model/Firefighter.java | 18 ++++++++++----- src/main/java/model/FirefighterBoard.java | 15 +++++++++++++ src/main/java/model/Item.java | 2 +- 9 files changed, 94 insertions(+), 22 deletions(-) diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index 6b009e4..179d224 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -53,7 +53,5 @@ public class SimulatorApplication extends javafx.application.Application { primaryStage.show(); } - public static void main(String[] args) { - launch(args); - } + public static void main(String[] args) { launch(args); } } diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index bcf7d3e..8f765e6 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -13,6 +13,7 @@ import javafx.scene.control.ToggleGroup; import javafx.util.Duration; import javafx.util.Pair; import model.Board; +import model.Item; import model.ModelElement; import model.FirefighterBoard; import util.Position; @@ -70,6 +71,17 @@ public class Controller { updateGenerationLabel(board.stepNumber()); } + private void updateBoard2(){ + List<Position> updatedPositions = board.updateToNextGeneration2(); + List<Item> updatedSquares = new ArrayList<>(); + for(Position updatedPosition : updatedPositions){ + Item squareState = board.getItemByPosition(updatedPosition); + updatedSquares.add(squareState); + } + grid.repaint(updatedSquares); + updateGenerationLabel(board.stepNumber()); + } + private void repaintGrid(){ int columnCount = board.columnCount(); int rowCount = board.rowCount(); @@ -77,6 +89,7 @@ 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/Board.java b/src/main/java/model/Board.java index bb089a4..46b92b8 100644 --- a/src/main/java/model/Board.java +++ b/src/main/java/model/Board.java @@ -50,6 +50,15 @@ public interface Board<S> { */ List<Position> updateToNextGeneration(); + /** + * Update the board to its next generation or state. This method may modify the + * internal state of the board and return a list of positions that have changed + * during the update. + * + * @return A list of positions that have changed during the update. + */ + List<Position> updateToNextGeneration2(); + /** * Reset the board to its initial state. */ @@ -61,5 +70,7 @@ public interface Board<S> { * @return The current step number or generation. */ int stepNumber(); + + Item getItemByPosition(Position position); } diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java index b679ea0..bc42652 100644 --- a/src/main/java/model/Cloud.java +++ b/src/main/java/model/Cloud.java @@ -2,6 +2,7 @@ package model; import util.Position; +import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -11,9 +12,21 @@ public class Cloud extends Extinguisher implements Item { } - void move(FirefighterBoard board) { - List<Position> neighborslist = board.neighbors(position); + List<Position> move(FirefighterBoard board) { + List<Position> result = new ArrayList<>(); + List<Position> neighborsList = board.neighbors(position); + for (Position neighborPosition: neighborsList) { + if (board.getItemByPosition(neighborPosition) != null){ + neighborsList.remove(neighborPosition); + } + } + if (neighborsList.isEmpty()){ + return null; + } Random ran = new Random(); - position = neighborslist.get(ran.nextInt(neighborslist.size())); + result.add(position); + position = neighborsList.get(ran.nextInt(neighborsList.size())); + result.add(position); + return result; } } diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java index d39efbd..87a996c 100644 --- a/src/main/java/model/Extinguisher.java +++ b/src/main/java/model/Extinguisher.java @@ -17,19 +17,28 @@ public abstract class Extinguisher { } - public void update(FirefighterBoard board){ - move(board); - extinguish(board); + public List<Position> update(FirefighterBoard board){ + ArrayList<Position> result = new ArrayList<Position>(); + result.addAll(move(board)); + result.addAll(extinguish(board)); + return result; } - private void extinguish(FirefighterBoard board) { + private List<Position> extinguish(FirefighterBoard board) { + List<Position> result = new ArrayList<>(); List<Item> itemList = board.itemList(); - List<Position> neighborslist = board.neighbors(position); - for (Position neighborsposition: neighborslist) { - itemList.removeIf(item -> neighborsposition == item.position() && item instanceof Fire); + List<Position> neighborsList = board.neighbors(position); + Item neighborItem; + for (Position neighborPosition: neighborsList) { + neighborItem = board.getItemByPosition(neighborPosition); + if (neighborItem instanceof Fire){ + itemList.remove(neighborItem); + result.add(neighborPosition); + } } + return result; } - abstract void move(FirefighterBoard board); + abstract List<Position> move(FirefighterBoard board); } diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java index 028b669..f2e8db6 100644 --- a/src/main/java/model/Fire.java +++ b/src/main/java/model/Fire.java @@ -13,11 +13,16 @@ public class Fire implements Item{ this.position = position; } - public void update(FirefighterBoard board) { + public List<Position> update(FirefighterBoard board) { + ArrayList<Position> result = new ArrayList<Position>(); List<Position> neighborslist = board.neighbors(position); for (Position neighborposition : neighborslist) { - board.itemList().add(new Fire(neighborposition)); + if (board.getItemByPosition(neighborposition) == null) { + board.itemList().add(new Fire(neighborposition)); + result.add(neighborposition); + } } + return neighborslist; } public Position position() { return position; diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java index 5120ad2..dc18e07 100644 --- a/src/main/java/model/Firefighter.java +++ b/src/main/java/model/Firefighter.java @@ -9,18 +9,25 @@ public class Firefighter extends Extinguisher implements Item{ super(position); } - void move(FirefighterBoard board) { + public List<Position> move(FirefighterBoard board) { + List<Position> result = new ArrayList<>(); 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); + Queue<Position> toVisit = new LinkedList<>(); + for (Position initialMove : board.neighbors(position)) { + if (board.getItemByPosition(initialMove) == null) { + firstMove.put(initialMove, initialMove); + toVisit.add(initialMove); + } + if (board.getItemByPosition(initialMove) instanceof Fire) return null; } while (!toVisit.isEmpty()) { Position current = toVisit.poll(); if (board.getItemByPosition(current) instanceof Fire) { + result.add(position); position = firstMove.get(current); - return; + result.add(position); + return result; } for (Position adjacent : board.neighbors(current)) { if (seen.contains(adjacent)) continue; @@ -29,5 +36,6 @@ public class Firefighter extends Extinguisher implements Item{ firstMove.put(adjacent, firstMove.get(current)); } } + return null; } } diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 336ef7e..7ff12de 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -67,6 +67,21 @@ public class FirefighterBoard implements Board<List<ModelElement>> { return result; } + + public List<Position> updateToNextGeneration2() { + List<Position> result = new ArrayList<Position>(); + for (Item item: itemList) { + if (!(item instanceof Fire)) result.addAll(item.update(this)); + } + if (step%2 == 0){ + for (Item item: itemList) { + if (item instanceof Fire) result.addAll(item.update(this)); + } + } + step++; + return result; + } + private List<Position> updateFires() { List<Position> result = new ArrayList<>(); if (step % 2 == 0) { diff --git a/src/main/java/model/Item.java b/src/main/java/model/Item.java index b527bfd..c0dab14 100644 --- a/src/main/java/model/Item.java +++ b/src/main/java/model/Item.java @@ -6,7 +6,7 @@ import java.util.List; public interface Item { - void update(FirefighterBoard board); + List<Position> update(FirefighterBoard board); Position position(); } -- GitLab