From 47698c64bc0834830c071b39d3205dfe0e43a847 Mon Sep 17 00:00:00 2001 From: a23022716 <celia.arezki.1@etu.univ-amu.fr> Date: Fri, 22 Nov 2024 12:17:18 +0100 Subject: [PATCH] correction --- .../java/model/BoardFireFighterBehavior.java | 106 ++++++++++++ .../model/BoardFirefighterProperties.java | 65 ++++++++ src/main/java/model/FirefighterBoard.java | 151 +++++++----------- 3 files changed, 225 insertions(+), 97 deletions(-) create mode 100644 src/main/java/model/BoardFireFighterBehavior.java create mode 100644 src/main/java/model/BoardFirefighterProperties.java diff --git a/src/main/java/model/BoardFireFighterBehavior.java b/src/main/java/model/BoardFireFighterBehavior.java new file mode 100644 index 0000000..18e8817 --- /dev/null +++ b/src/main/java/model/BoardFireFighterBehavior.java @@ -0,0 +1,106 @@ +package model; + +import util.Position; +import util.TargetStrategy; + +import java.util.*; + +public class BoardFireFighterBehavior implements BoardBehavior{ + private final TargetStrategy targetStrategy = new TargetStrategy(); + private final Map<Position, List<Position>> neighbors; + private List<Position> firefighterPositions; + private Set<Position> firePositions; + private int step; + + public BoardFireFighterBehavior(Map<Position, List<Position>> neighbors) { + this.neighbors = neighbors; + this.step = 0; + } + + public void initializeElements(int initialFireCount, int initialFirefighterCount, int rowCount, int columnCount, Random randomGenerator) { + firefighterPositions = new ArrayList<>(); + firePositions = new HashSet<>(); + for (int i = 0; i < initialFireCount; i++) { + firePositions.add(randomPosition(rowCount, columnCount, randomGenerator)); + } + for (int i = 0; i < initialFirefighterCount; i++) { + firefighterPositions.add(randomPosition(rowCount, columnCount, randomGenerator)); + } + } + + private Position randomPosition(int rowCount, int columnCount, Random randomGenerator) { + return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); + } + + public 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; + } + + public List<Position> updateFirefighters() { + List<Position> modifiedPositions = new ArrayList<>(); + List<Position> newFirefighterPositions = new ArrayList<>(); + for (Position firefighterPosition : firefighterPositions) { + Position newFirefighterPosition = targetStrategy.neighborClosestToFire(firefighterPosition, firePositions, neighbors); + newFirefighterPositions.add(newFirefighterPosition); + extinguish(newFirefighterPosition); + modifiedPositions.add(firefighterPosition); + modifiedPositions.add(newFirefighterPosition); + + List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() + .filter(firePositions::contains).toList(); + for (Position firePosition : neighborFirePositions) { + extinguish(firePosition); + } + modifiedPositions.addAll(neighborFirePositions); + } + firefighterPositions = newFirefighterPositions; + return modifiedPositions; + } + + private void extinguish(Position position) { + firePositions.remove(position); + } + + public void reset(int step) { + this.step = step; + } + + public Set<Position> getFirePositions() { + return firePositions; + } + + public List<Position> getFirefighterPositions() { + return firefighterPositions; + } + + public void incrementStep() { + step++; + } + + public int getStep() { + return step; + } + @Override + public int stepNumber() { + return 0; + } + + @Override + public List<Position> updateToNextGeneration() { + return List.of(); + } + + @Override + public void reset() { + + } +} diff --git a/src/main/java/model/BoardFirefighterProperties.java b/src/main/java/model/BoardFirefighterProperties.java new file mode 100644 index 0000000..efd5b8a --- /dev/null +++ b/src/main/java/model/BoardFirefighterProperties.java @@ -0,0 +1,65 @@ +package model; + +import util.Position; + +import java.util.List; +import java.util.Map; + +public class BoardFirefighterProperties implements BoardProperties{ + private final int rowCount; + private final int columnCount; + private final Position[][] positions; + private final Map<Position, List<Position>> neighbors; + + public BoardFirefighterProperties(int rowCount, int columnCount, Map<Position, List<Position>> neighbors) { + this.rowCount = rowCount; + this.columnCount = columnCount; + this.positions = new Position[rowCount][columnCount]; + this.neighbors = neighbors; + + initializePositions(); + } + + private void initializePositions() { + for (int row = 0; row < rowCount; row++) { + for (int column = 0; column < columnCount; column++) { + positions[row][column] = new Position(row, column); + } + } + } + + public int getRowCount() { + return rowCount; + } + + public int getColumnCount() { + return columnCount; + } + + public Map<Position, List<Position>> getNeighbors() { + return neighbors; + } + + public Position getPosition(int row, int column) { + return positions[row][column]; + } + @Override + public int rowCount() { + return 0; + } + + @Override + public int columnCount() { + return 0; + } + + @Override + public List<ModelElement> getState(Position position) { + return List.of(); + } + + @Override + public void setState(List<ModelElement> state, Position position) { + + } +} diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 6398ec5..2626de0 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -1,32 +1,41 @@ package model; + import util.Position; -import util.TargetStrategy; import java.util.*; - public class FirefighterBoard implements Board<List<ModelElement>> { - private final int columnCount; - private final int rowCount; + private final BoardFireFighterBehavior behavior; + private final BoardFirefighterProperties properties; + private final int initialFireCount; private final int initialFirefighterCount; - 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++) + Map<Position, List<Position>> neighbors = initializeNeighbors(rowCount, columnCount); + + this.properties = new BoardFirefighterProperties(rowCount, columnCount, neighbors); + this.behavior = new BoardFireFighterBehavior(neighbors); + + this.initialFireCount = initialFireCount; + this.initialFirefighterCount = initialFirefighterCount; + + initializeElements(); + } + + private Map<Position, List<Position>> initializeNeighbors(int rowCount, int columnCount) { + Map<Position, List<Position>> neighbors = new HashMap<>(); + Position[][] positions = new Position[rowCount][columnCount]; + + for (int row = 0; row < rowCount; row++) { + for (int column = 0; column < columnCount; column++) { positions[row][column] = new Position(row, column); - for (int column = 0; column < columnCount; column++) - for (int row = 0; row < rowCount; row++) { + } + } + + for (int row = 0; row < rowCount; row++) { + for (int column = 0; column < columnCount; column++) { List<Position> list = new ArrayList<>(); if (row > 0) list.add(positions[row - 1][column]); if (column > 0) list.add(positions[row][column - 1]); @@ -34,114 +43,62 @@ public class FirefighterBoard implements Board<List<ModelElement>> { if (column < columnCount - 1) list.add(positions[row][column + 1]); neighbors.put(positions[row][column], list); } - this.initialFireCount = initialFireCount; - this.initialFirefighterCount = initialFirefighterCount; - initializeElements(); + } + return neighbors; } 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)); + behavior.initializeElements(initialFireCount, initialFirefighterCount, properties.getRowCount(), properties.getColumnCount(), randomGenerator); } @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)) + if (behavior.getFirePositions().contains(position)) { result.add(ModelElement.FIRE); + } + if (behavior.getFirefighterPositions().contains(position)) { + result.add(ModelElement.FIREFIGHTER); + } return result; } @Override public int rowCount() { - return rowCount; + return properties.getRowCount(); } @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; - + return properties.getColumnCount(); } @Override - public int stepNumber() { - return step; + public void reset() { + behavior.reset(0); + initializeElements(); } - 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); + @Override + public void setState(List<ModelElement> state, Position position) { + if (state.contains(ModelElement.FIRE)) { + behavior.getFirePositions().add(position); + } + if (state.contains(ModelElement.FIREFIGHTER)) { + behavior.getFirefighterPositions().add(position); } - firefighterPositions = firefighterNewPositions; - return modifiedPosition; } @Override - public void reset() { - step = 0; - initializeElements(); - } - - private void extinguish(Position position) { - firePositions.remove(position); + public List<Position> updateToNextGeneration() { + List<Position> modifiedPositions = behavior.updateFirefighters(); + modifiedPositions.addAll(behavior.updateFires()); + behavior.incrementStep(); + return modifiedPositions; } - @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); - } - } + public int stepNumber() { + return behavior.getStep(); } -} \ No newline at end of file +} -- GitLab