diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java new file mode 100644 index 0000000000000000000000000000000000000000..b8691b207b33acdd359e533ac60cafee33f6c95a --- /dev/null +++ b/src/main/java/model/Cloud.java @@ -0,0 +1,4 @@ +package model; + +public class Cloud { +} diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 99c94d8621980ccc1c302f9d19c12dc1179f943b..e3ef4335121b750862755337f4e50a82b943077d 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -131,4 +131,4 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } } } -} \ No newline at end of file +} diff --git a/src/main/java/model/firefighterManager.java b/src/main/java/model/firefighterManager.java new file mode 100644 index 0000000000000000000000000000000000000000..20d51d212219ab01dbbe508097278ff0fd973fd9 --- /dev/null +++ b/src/main/java/model/firefighterManager.java @@ -0,0 +1,147 @@ +/*package model; + +import util.Position; + +import java.util.*; + + +public class FirefighterBoard implements Board<List<ModelElement>> { + private final int columnCount; + private final int rowCount; + private final int initialFireCount; + private final int initialFirefighterCount; + private final model.TargetStrategy targetStrategy = new model.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(); + } + + public void initializeElements() { + firefighterPositions = new ArrayList<>(); + firePositions = new HashSet<>(); + for (int index = 0; index < initialFireCount; index++) + firePositions.add(randomPosition()); + for (int index = 0; index < initialFirefighterCount; index++) + firefighterPositions.add(randomPosition()); + } + + private Position randomPosition() { + return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); + } + + @Override + public List<ModelElement> getState(Position position) { + List<ModelElement> result = new ArrayList<>(); + for (Position firefighterPosition : firefighterPositions) + if (firefighterPosition.equals(position)) + result.add(ModelElement.FIREFIGHTER); + if (firePositions.contains(position)) + result.add(ModelElement.FIRE); + return result; + } + + @Override + public int rowCount() { + return rowCount; + } + + @Override + public int columnCount() { + return columnCount; + } + + public List<Position> updateToNextGeneration() { + List<Position> modifiedPositions = updateFirefighters(); + modifiedPositions.addAll(updateFires()); + step++; + return modifiedPositions; + } + + private List<Position> updateFires() { + List<Position> modifiedPositions = new ArrayList<>(); + if (step % 2 == 0) { + List<Position> newFirePositions = new ArrayList<>(); + for (Position fire : firePositions) { + newFirePositions.addAll(neighbors.get(fire)); + } + firePositions.addAll(newFirePositions); + modifiedPositions.addAll(newFirePositions); + } + return modifiedPositions; + + } + + @Override + public int stepNumber() { + return step; + } + + private List<Position> updateFirefighters() { + List<Position> modifiedPosition = new ArrayList<>(); + List<Position> firefighterNewPositions = new ArrayList<>(); + for (Position firefighterPosition : firefighterPositions) { + Position newFirefighterPosition = + targetStrategy.neighborClosestToFire(firefighterPosition, + firePositions, neighbors); + firefighterNewPositions.add(newFirefighterPosition); + extinguish(newFirefighterPosition); + modifiedPosition.add(firefighterPosition); + modifiedPosition.add(newFirefighterPosition); + List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() + .filter(firePositions::contains).toList(); + for (Position firePosition : neighborFirePositions) + extinguish(firePosition); + modifiedPosition.addAll(neighborFirePositions); + } + firefighterPositions = firefighterNewPositions; + return modifiedPosition; + } + + @Override + public void reset() { + step = 0; + initializeElements(); + } + + private void extinguish(Position position) { + firePositions.remove(position); + } + + + @Override + public void setState(List<ModelElement> state, Position position) { + firePositions.remove(position); + for (; ; ) { + if (!firefighterPositions.remove(position)) break; + } + for (ModelElement element : state) { + switch (element) { + case FIRE -> firePositions.add(position); + case FIREFIGHTER -> firefighterPositions.add(position); + } + } + } +}*/ \ No newline at end of file