diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 2a60897c6eb8ba847cb8589840c16a0f175ce0a3..bcf7d3eb421b0d841a53dd420d61242967e90073 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 0000000000000000000000000000000000000000..b679ea00774038aa135f5311523662cd99f166de --- /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 4e1592820d21b738ce84a9df80f95f5b30e1f51e..d39efbd7bd72f48ccacff39dd1b968e8cea80972 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 98512a2010975bb5049100c5d91fb06ee8e52d95..028b66990e5ac5f60417b296c3ef6bff14a3d1b6 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 3fa26bf07c679297159f973e032f013624e9d218..5120ad272f0fdf5c6df0821cd94129ce41006b60 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 b37bb43f82709ea572d88ff13f2d98de32b8e866..336ef7eb9832084d4e1900737ddb112fca340d8c 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 1593d5616586e6a5a0f232c722ddbdf3006f70bf..b527bfd9b2c0d1c4ed1af52f17157e6dfd93ff73 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 3aec54fdffb58cc9b427c4dec5dd57e12f4c5a08..eceb1c3a65192452ed933628b0da4709cabd3408 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{ + }