diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index 86edcaabec644b1286ff1756cf794995b02a54ae..c60478d49ee5883e0e0fd9083e6bd235d642ff58 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -4,20 +4,18 @@ import util.Position;
import java.util.*;
public class Fire {
- public static Set<Position> firePositions;
+ public static List<Position> firePositions;
public static void nextMove(){
// propagate the fire to the adjacent cells
- Set<Position> newFirePositions = new HashSet<>();
- for(Position firePosition : firePositions){
- if(firePosition.row() > 0) // if the fire is not on the top edge
- newFirePositions.add(new Position(firePosition.row() - 1, firePosition.column()));
- if(firePosition.row() < FirefighterBoard.rowCount - 1) // if the fire is not on the bottom edge
- newFirePositions.add(new Position(firePosition.row() + 1, firePosition.column()));
- if(firePosition.column() > 0) // if the fire is not on the left edge
- newFirePositions.add(new Position(firePosition.row(), firePosition.column() - 1));
- if(firePosition.column() < FirefighterBoard.columnCount - 1) // if the fire is not on the right edge
- newFirePositions.add(new Position(firePosition.row(), firePosition.column() + 1));
+ List<Position> newFirePositions = new ArrayList<>();
+ for (Position firePosition : firePositions) {
+ List<Position> neighborPositions = Utils.neighbors(firePosition);
+ newFirePositions.addAll(neighborPositions);
}
+ // check if the new fire positions are not already on fire
+ for (Position newFirePosition : newFirePositions)
+ if (!firePositions.contains(newFirePosition))
+ firePositions.add(newFirePosition);
}
}
diff --git a/src/main/java/model/FireFighters.java b/src/main/java/model/FireFighters.java
index bffc265517135e2e108929061a681713fcbfd7d6..81da2404874d40e3733042afa2a330e95c69842e 100644
--- a/src/main/java/model/FireFighters.java
+++ b/src/main/java/model/FireFighters.java
@@ -8,31 +8,27 @@ public class FireFighters {
public static void nextMove(){
- Set<Position> firePositions = Fire.firePositions;
- // find the closest fire to each firefighter
- for(Position firefighterPosition : firefighterPositions){
- Position closestFire = null;
- int closestDistance = Integer.MAX_VALUE;
- for(Position firePosition : firePositions){
- int distance = Math.abs(firefighterPosition.row() - firePosition.row()) + Math.abs(firefighterPosition.column() - firePosition.column());
- if(distance < closestDistance){
- closestDistance = distance;
- closestFire = firePosition;
- }
- }
- List<Position> newFirefighterPositions = new ArrayList<>();
- // move the firefighter towards the closest fire
- if(closestFire.row() > firefighterPosition.row())
- newFirefighterPositions.add(new Position(firefighterPosition.row() + 1, firefighterPosition.column()));
- else if(closestFire.row() < firefighterPosition.row())
- newFirefighterPositions.add(new Position(firefighterPosition.row() - 1, firefighterPosition.column()));
- else if(closestFire.column() > firefighterPosition.column())
- newFirefighterPositions.add(new Position(firefighterPosition.row(), firefighterPosition.column() + 1));
- else if(closestFire.column() < firefighterPosition.column())
- newFirefighterPositions.add(new Position(firefighterPosition.row(), firefighterPosition.column() - 1));
+ List<Position> firefighterNewPositions = new ArrayList<>();
+ for (Position firefighterPosition : firefighterPositions) {
+ Position newFirefighterPosition = Utils.neighborClosestToFire(firefighterPosition);
+ firefighterNewPositions.add(newFirefighterPosition);
+ extinguish(newFirefighterPosition);
+ }
+ firefighterPositions = firefighterNewPositions;
+ }
- firefighterPositions = newFirefighterPositions;
-
+ public static void extinguishs(){
+ for (Position firefighterPosition : firefighterPositions) {
+ List<Position> neighborFirePositions = Utils.neighbors(firefighterPosition).stream()
+ .filter(Fire.firePositions::contains).toList();
+ for(Position firePosition : neighborFirePositions)
+ extinguish(firePosition);
}
}
+
+
+
+ public static void extinguish(Position position){
+ Fire.firePositions.remove(position);
+ }
}
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 305a10892af399cfd972d52a2941e406e390dc88..1d961dfd1fdf3dbccfe76a67007a2b2342218d91 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -22,6 +22,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
}
public void initializeElements() {
+ Fire.firePositions = new ArrayList<>();
+ FireFighters.firefighterPositions = new ArrayList<>();
for (int index = 0; index < initialFireCount; index++)
Fire.firePositions.add(randomPosition());
for (int index = 0; index < initialFirefighterCount; index++)
@@ -54,24 +56,19 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
}
public List<Position> updateToNextGeneration() {
+
FireFighters.nextMove();
- List<Position> result = FireFighters.firefighterPositions;
- Fire.nextMove();
- result.addAll(Fire.firePositions);
- step++;
- return result;
- }
+ FireFighters.extinguishs();
+
+ if (step % 2 == 0)
+ Fire.nextMove();
- private List<Position> updateFires() {
+ step++;
List<Position> result = new ArrayList<>();
- if (step % 2 == 0) {
- List<Position> newFirePositions = new ArrayList<>();
- for (Position fire : Fire.firePositions) {
- newFirePositions.addAll(neighbors(fire));
- }
- Fire.firePositions.addAll(newFirePositions);
- result.addAll(newFirePositions);
- }
+
+ result.addAll(Fire.firePositions);
+ result.addAll(FireFighters.firefighterPositions);
+
return result;
}
@@ -81,24 +78,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
return step;
}
- private List<Position> updateFirefighters() {
- List<Position> result = new ArrayList<>();
- List<Position> firefighterNewPositions = new ArrayList<>();
- for (Position firefighterPosition : FireFighters.firefighterPositions) {
- Position newFirefighterPosition = neighborClosestToFire(firefighterPosition);
- firefighterNewPositions.add(newFirefighterPosition);
- extinguish(newFirefighterPosition);
- result.add(firefighterPosition);
- result.add(newFirefighterPosition);
- List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
- .filter(Fire.firePositions::contains).toList();
- for(Position firePosition : neighborFirePositions)
- extinguish(firePosition);
- result.addAll(neighborFirePositions);
- }
- FireFighters.firefighterPositions = firefighterNewPositions;
- return result;
- }
@Override
public void reset() {
@@ -106,38 +85,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
initializeElements();
}
- private void extinguish(Position position) {
- Fire.firePositions.remove(position);
- }
-
- private 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));
- if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column()));
- if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
- return list;
- }
-
- private Position neighborClosestToFire(Position position) {
- Set<Position> seen = new HashSet<>();
- HashMap<Position, Position> firstMove = new HashMap<>();
- Queue<Position> toVisit = new LinkedList<>(neighbors(position));
- for (Position initialMove : toVisit)
- firstMove.put(initialMove, initialMove);
- while (!toVisit.isEmpty()) {
- Position current = toVisit.poll();
- if (Fire.firePositions.contains(current))
- return firstMove.get(current);
- for (Position adjacent : neighbors(current)) {
- if (seen.contains(adjacent)) continue;
- toVisit.add(adjacent);
- seen.add(adjacent);
- firstMove.put(adjacent, firstMove.get(current));
- }
- }
- return position;
- }
@Override
public void setState(List<ModelElement> state, Position position) {
diff --git a/src/main/java/view/FirefighterGrid.java b/src/main/java/view/FirefighterGrid.java
index c1b2274637f93e4a2482faa9d2a5559211b31dc6..a4306b3f80d321a4af6a890c6e1f9328e5ae23bc 100644
--- a/src/main/java/view/FirefighterGrid.java
+++ b/src/main/java/view/FirefighterGrid.java
@@ -19,17 +19,18 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
@Override
public void repaint(List<Pair<Position, ViewElement>> positionedElements) {
- clear(positionedElements);
+ clear();
paint(positionedElements);
paintLines();
}
-
+ /*
private void clear(List<Pair<Position, ViewElement>> positionedElements) {
for (Pair<Position, ViewElement> positionElement : positionedElements) {
Position position = positionElement.getKey();
clearSquare(position.row(), position.column());
}
}
+ */
private void paint(List<Pair<Position, ViewElement>> positionedElements) {
for(Pair<Position, ViewElement> pair : positionedElements){
@@ -90,8 +91,9 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
getGraphicsContext2D().setFill(color);
getGraphicsContext2D().fillRect(row*squareHeight,column*squareWidth,squareHeight,squareWidth);
}
-
+ /*
private void clearSquare(int row, int column){
getGraphicsContext2D().clearRect(row*squareHeight,column*squareWidth,squareHeight,squareWidth);
}
+ */
}
\ No newline at end of file