diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index 6b009e4114f78b4f406f2a3954cb94be05354e80..179d224778e79e32f5b657dbdb29fab36f0dc3c3 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 bcf7d3eb421b0d841a53dd420d61242967e90073..8f765e69cb3d5128f11c4d0e7ae99eebfca53886 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 bb089a41406d57b0b2fe3d43b3c040cbd640b6b9..46b92b8bc1d1a35d831eca3ee8e83961fe823684 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 b679ea00774038aa135f5311523662cd99f166de..bc42652baba0a7c93a234e04d86c9297aaa3649c 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 d39efbd7bd72f48ccacff39dd1b968e8cea80972..87a996cb52bcef679d47cff8f69514c88d4d86d6 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 028b66990e5ac5f60417b296c3ef6bff14a3d1b6..f2e8db671a8c8f17d99e5e4aa59f31aeefb27b45 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 5120ad272f0fdf5c6df0821cd94129ce41006b60..dc18e07fa8c8e12f13a682b1e2c56ea8541c8ae1 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 336ef7eb9832084d4e1900737ddb112fca340d8c..7ff12de03d2aff326eb81ab13fa36835449a092e 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 b527bfd9b2c0d1c4ed1af52f17157e6dfd93ff73..c0dab144aa4335e57a48d8c69fbeb48363b9e3c7 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(); }