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