4 files + 64 − 39 Side-by-side Compare changes Side-by-side Inline Show whitespace changes Files 4 gradle/wrapper/gradle-wrapper.properties +1 −1 Original line number Original line Diff line number Diff line distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists zipStorePath=wrapper/dists src/main/java/app/SimulatorApplication.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,7 @@ public class SimulatorApplication extends javafx.application.Application { this.primaryStage = primaryStage; this.primaryStage = primaryStage; this.primaryStage.setTitle(APP_NAME); this.primaryStage.setTitle(APP_NAME); this.primaryStage.setOnCloseRequest(event -> Platform.exit()); this.primaryStage.setOnCloseRequest(event -> Platform.exit()); this.primaryStage.setResizable(false); this.primaryStage.setResizable(true); this.primaryStage.sizeToScene(); this.primaryStage.sizeToScene(); } } Loading src/main/java/model/FirefighterBoard.java +27 −37 Original line number Original line Diff line number Diff line Loading @@ -10,14 +10,30 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int rowCount; private final int rowCount; private final int initialFireCount; private final int initialFireCount; private final int initialFirefighterCount; private final int initialFirefighterCount; private final TargetStrategy targetStrategy = new TargetStrategy(); private List<Position> firefighterPositions; private List<Position> firefighterPositions; private Set<Position> firePositions; private Set<Position> firePositions; private Map<Position, List<Position>> neighbors = new HashMap(); private final Position[][] positions; private int step = 0; private int step = 0; private final Random randomGenerator = new Random(); private final Random randomGenerator = new Random(); public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { this.columnCount = columnCount; this.columnCount = columnCount; this.rowCount = rowCount; this.rowCount = rowCount; this.positions = new Position[rowCount][columnCount]; for (int column = 0; column < columnCount; column++) for (int row = 0; row < rowCount; row++) positions[row][column] = new Position(row, column); for (int column = 0; column < columnCount; column++) for (int row = 0; row < rowCount; row++) { List<Position> list = new ArrayList<>(); if (row > 0) list.add(positions[row - 1][column]); if (column > 0) list.add(positions[row][column - 1]); if (row < rowCount - 1) list.add(positions[row + 1][column]); if (column < columnCount - 1) list.add(positions[row][column + 1]); neighbors.put(positions[row][column], list); } this.initialFireCount = initialFireCount; this.initialFireCount = initialFireCount; this.initialFirefighterCount = initialFirefighterCount; this.initialFirefighterCount = initialFirefighterCount; initializeElements(); initializeElements(); Loading Loading @@ -69,7 +85,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { if (step % 2 == 0) { if (step % 2 == 0) { List<Position> newFirePositions = new ArrayList<>(); List<Position> newFirePositions = new ArrayList<>(); for (Position fire : firePositions) { for (Position fire : firePositions) { newFirePositions.addAll(neighbors(fire)); newFirePositions.addAll(neighbors.get(fire)); } } firePositions.addAll(newFirePositions); firePositions.addAll(newFirePositions); modifiedPositions.addAll(newFirePositions); modifiedPositions.addAll(newFirePositions); Loading @@ -87,12 +103,14 @@ public class FirefighterBoard implements Board<List<ModelElement>> { List<Position> modifiedPosition = new ArrayList<>(); List<Position> modifiedPosition = new ArrayList<>(); List<Position> firefighterNewPositions = new ArrayList<>(); List<Position> firefighterNewPositions = new ArrayList<>(); for (Position firefighterPosition : firefighterPositions) { for (Position firefighterPosition : firefighterPositions) { Position newFirefighterPosition = neighborClosestToFire(firefighterPosition); Position newFirefighterPosition = targetStrategy.neighborClosestToFire(firefighterPosition, firePositions, neighbors); firefighterNewPositions.add(newFirefighterPosition); firefighterNewPositions.add(newFirefighterPosition); extinguish(newFirefighterPosition); extinguish(newFirefighterPosition); modifiedPosition.add(firefighterPosition); modifiedPosition.add(firefighterPosition); modifiedPosition.add(newFirefighterPosition); modifiedPosition.add(newFirefighterPosition); List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream() List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() .filter(firePositions::contains).toList(); .filter(firePositions::contains).toList(); for (Position firePosition : neighborFirePositions) for (Position firePosition : neighborFirePositions) extinguish(firePosition); extinguish(firePosition); Loading @@ -112,34 +130,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> { firePositions.remove(position); 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 (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 @Override public void setState(List<ModelElement> state, Position position) { public void setState(List<ModelElement> state, Position position) { Loading src/main/java/util/TargetStrategy.java 0 → 100644 +35 −0 Original line number Original line Diff line number Diff line package model; import util.Position; import java.util.*; public class TargetStrategy { /** * @param position current position. * @param targets positions that are targeted. * @return the position next to the current position that is on the path to the closest target. */ Position neighborClosestToFire(Position position, Collection<Position> targets, Map<Position,List<Position>>neighbors) { Set<Position> seen = new HashSet<Position>(); HashMap<Position, Position> firstMove = new HashMap<Position, Position>(); Queue<Position> toVisit = new LinkedList<Position>(neighbors.get(position)); for (Position initialMove : toVisit) firstMove.put(initialMove, initialMove); while (!toVisit.isEmpty()) { Position current = toVisit.poll(); if (targets.contains(current)) return firstMove.get(current); for (Position adjacent : neighbors.get(current)) { if (seen.contains(adjacent)) continue; toVisit.add(adjacent); seen.add(adjacent); firstMove.put(adjacent, firstMove.get(current)); } } return position; } } No newline at end of file
gradle/wrapper/gradle-wrapper.properties +1 −1 Original line number Original line Diff line number Diff line distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists zipStorePath=wrapper/dists
src/main/java/app/SimulatorApplication.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,7 @@ public class SimulatorApplication extends javafx.application.Application { this.primaryStage = primaryStage; this.primaryStage = primaryStage; this.primaryStage.setTitle(APP_NAME); this.primaryStage.setTitle(APP_NAME); this.primaryStage.setOnCloseRequest(event -> Platform.exit()); this.primaryStage.setOnCloseRequest(event -> Platform.exit()); this.primaryStage.setResizable(false); this.primaryStage.setResizable(true); this.primaryStage.sizeToScene(); this.primaryStage.sizeToScene(); } } Loading
src/main/java/model/FirefighterBoard.java +27 −37 Original line number Original line Diff line number Diff line Loading @@ -10,14 +10,30 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int rowCount; private final int rowCount; private final int initialFireCount; private final int initialFireCount; private final int initialFirefighterCount; private final int initialFirefighterCount; private final TargetStrategy targetStrategy = new TargetStrategy(); private List<Position> firefighterPositions; private List<Position> firefighterPositions; private Set<Position> firePositions; private Set<Position> firePositions; private Map<Position, List<Position>> neighbors = new HashMap(); private final Position[][] positions; private int step = 0; private int step = 0; private final Random randomGenerator = new Random(); private final Random randomGenerator = new Random(); public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { this.columnCount = columnCount; this.columnCount = columnCount; this.rowCount = rowCount; this.rowCount = rowCount; this.positions = new Position[rowCount][columnCount]; for (int column = 0; column < columnCount; column++) for (int row = 0; row < rowCount; row++) positions[row][column] = new Position(row, column); for (int column = 0; column < columnCount; column++) for (int row = 0; row < rowCount; row++) { List<Position> list = new ArrayList<>(); if (row > 0) list.add(positions[row - 1][column]); if (column > 0) list.add(positions[row][column - 1]); if (row < rowCount - 1) list.add(positions[row + 1][column]); if (column < columnCount - 1) list.add(positions[row][column + 1]); neighbors.put(positions[row][column], list); } this.initialFireCount = initialFireCount; this.initialFireCount = initialFireCount; this.initialFirefighterCount = initialFirefighterCount; this.initialFirefighterCount = initialFirefighterCount; initializeElements(); initializeElements(); Loading Loading @@ -69,7 +85,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { if (step % 2 == 0) { if (step % 2 == 0) { List<Position> newFirePositions = new ArrayList<>(); List<Position> newFirePositions = new ArrayList<>(); for (Position fire : firePositions) { for (Position fire : firePositions) { newFirePositions.addAll(neighbors(fire)); newFirePositions.addAll(neighbors.get(fire)); } } firePositions.addAll(newFirePositions); firePositions.addAll(newFirePositions); modifiedPositions.addAll(newFirePositions); modifiedPositions.addAll(newFirePositions); Loading @@ -87,12 +103,14 @@ public class FirefighterBoard implements Board<List<ModelElement>> { List<Position> modifiedPosition = new ArrayList<>(); List<Position> modifiedPosition = new ArrayList<>(); List<Position> firefighterNewPositions = new ArrayList<>(); List<Position> firefighterNewPositions = new ArrayList<>(); for (Position firefighterPosition : firefighterPositions) { for (Position firefighterPosition : firefighterPositions) { Position newFirefighterPosition = neighborClosestToFire(firefighterPosition); Position newFirefighterPosition = targetStrategy.neighborClosestToFire(firefighterPosition, firePositions, neighbors); firefighterNewPositions.add(newFirefighterPosition); firefighterNewPositions.add(newFirefighterPosition); extinguish(newFirefighterPosition); extinguish(newFirefighterPosition); modifiedPosition.add(firefighterPosition); modifiedPosition.add(firefighterPosition); modifiedPosition.add(newFirefighterPosition); modifiedPosition.add(newFirefighterPosition); List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream() List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() .filter(firePositions::contains).toList(); .filter(firePositions::contains).toList(); for (Position firePosition : neighborFirePositions) for (Position firePosition : neighborFirePositions) extinguish(firePosition); extinguish(firePosition); Loading @@ -112,34 +130,6 @@ public class FirefighterBoard implements Board<List<ModelElement>> { firePositions.remove(position); 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 (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 @Override public void setState(List<ModelElement> state, Position position) { public void setState(List<ModelElement> state, Position position) { Loading
src/main/java/util/TargetStrategy.java 0 → 100644 +35 −0 Original line number Original line Diff line number Diff line package model; import util.Position; import java.util.*; public class TargetStrategy { /** * @param position current position. * @param targets positions that are targeted. * @return the position next to the current position that is on the path to the closest target. */ Position neighborClosestToFire(Position position, Collection<Position> targets, Map<Position,List<Position>>neighbors) { Set<Position> seen = new HashSet<Position>(); HashMap<Position, Position> firstMove = new HashMap<Position, Position>(); Queue<Position> toVisit = new LinkedList<Position>(neighbors.get(position)); for (Position initialMove : toVisit) firstMove.put(initialMove, initialMove); while (!toVisit.isEmpty()) { Position current = toVisit.poll(); if (targets.contains(current)) return firstMove.get(current); for (Position adjacent : neighbors.get(current)) { if (seen.contains(adjacent)) continue; toVisit.add(adjacent); seen.add(adjacent); firstMove.put(adjacent, firstMove.get(current)); } } return position; } } No newline at end of file