From 588a2b485fbb90c3dfe99e3d421e143805c99b2d Mon Sep 17 00:00:00 2001 From: Basile <basile.couetoux@univ-amu.fr> Date: Thu, 7 Nov 2024 11:58:37 +0100 Subject: [PATCH] finish extract --- src/main/java/app/SimulatorApplication.java | 2 +- src/main/java/model/FirefighterBoard.java | 47 ++++++++++--------- .../java/{model => util}/TargetStrategy.java | 11 ++--- 3 files changed, 31 insertions(+), 29 deletions(-) rename src/main/java/{model => util}/TargetStrategy.java (73%) diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index f2ec0dc..e88b0e9 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -26,7 +26,7 @@ public class SimulatorApplication extends javafx.application.Application { this.primaryStage = primaryStage; this.primaryStage.setTitle(APP_NAME); this.primaryStage.setOnCloseRequest(event -> Platform.exit()); - this.primaryStage.setResizable(false); + this.primaryStage.setResizable(true); this.primaryStage.sizeToScene(); } diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 1d4ca4c..c0bd67c 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -10,15 +10,30 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int rowCount; private final int initialFireCount; private final int initialFirefighterCount; - private final TargetStrategy targetStrategy = new TargetStrategy(this); + private final TargetStrategy targetStrategy = new TargetStrategy(); private List<Position> firefighterPositions; private Set<Position> firePositions; + private Map<Position, List<Position>> neighbors = new HashMap(); + private final Position[][] positions; private int step = 0; private final Random randomGenerator = new Random(); public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { this.columnCount = columnCount; 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.initialFirefighterCount = initialFirefighterCount; initializeElements(); @@ -40,10 +55,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @Override public List<ModelElement> getState(Position position) { List<ModelElement> result = new ArrayList<>(); - for(Position firefighterPosition : firefighterPositions) + for (Position firefighterPosition : firefighterPositions) if (firefighterPosition.equals(position)) result.add(ModelElement.FIREFIGHTER); - if(firePositions.contains(position)) + if (firePositions.contains(position)) result.add(ModelElement.FIRE); return result; } @@ -70,7 +85,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { if (step % 2 == 0) { List<Position> newFirePositions = new ArrayList<>(); for (Position fire : firePositions) { - newFirePositions.addAll(neighbors(fire)); + newFirePositions.addAll(neighbors.get(fire)); } firePositions.addAll(newFirePositions); modifiedPositions.addAll(newFirePositions); @@ -89,14 +104,15 @@ public class FirefighterBoard implements Board<List<ModelElement>> { List<Position> firefighterNewPositions = new ArrayList<>(); for (Position firefighterPosition : firefighterPositions) { Position newFirefighterPosition = - targetStrategy.neighborClosestToFire(firefighterPosition, firePositions); + targetStrategy.neighborClosestToFire(firefighterPosition, + firePositions, neighbors); firefighterNewPositions.add(newFirefighterPosition); extinguish(newFirefighterPosition); modifiedPosition.add(firefighterPosition); modifiedPosition.add(newFirefighterPosition); - List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream() + List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() .filter(firePositions::contains).toList(); - for(Position firePosition : neighborFirePositions) + for (Position firePosition : neighborFirePositions) extinguish(firePosition); modifiedPosition.addAll(neighborFirePositions); } @@ -114,29 +130,18 @@ public class FirefighterBoard implements Board<List<ModelElement>> { firePositions.remove(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)); - 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; - } @Override public void setState(List<ModelElement> state, Position position) { firePositions.remove(position); - for (;;) { + for (; ; ) { if (!firefighterPositions.remove(position)) break; } - for(ModelElement element : state){ - switch (element){ + for (ModelElement element : state) { + switch (element) { case FIRE -> firePositions.add(position); case FIREFIGHTER -> firefighterPositions.add(position); } } } - - public List<Position> getFirePositions() { -return firefighterPositions; } } \ No newline at end of file diff --git a/src/main/java/model/TargetStrategy.java b/src/main/java/util/TargetStrategy.java similarity index 73% rename from src/main/java/model/TargetStrategy.java rename to src/main/java/util/TargetStrategy.java index 2367ebe..5831867 100644 --- a/src/main/java/model/TargetStrategy.java +++ b/src/main/java/util/TargetStrategy.java @@ -5,28 +5,25 @@ import util.Position; import java.util.*; public class TargetStrategy { - private final FirefighterBoard firefighterBoard; - public TargetStrategy(FirefighterBoard firefighterBoard) { - this.firefighterBoard = firefighterBoard; - } /** * @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) { + 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>(firefighterBoard.neighbors(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 : firefighterBoard.neighbors(current)) { + for (Position adjacent : neighbors.get(current)) { if (seen.contains(adjacent)) continue; toVisit.add(adjacent); seen.add(adjacent); -- GitLab