diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index 44fd3c2512d327d67c150257255a0e1136af07f0..faa82df869ca61db8918182d852804ccdbe64ce9 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -17,7 +17,7 @@ public class SimulatorApplication extends javafx.application.Application { private static final int COLUMN_COUNT = 20; private static final int BOX_WIDTH = 50; private static final int BOX_HEIGHT = 50; - public static final int INITIAL_FIRE_COUNT = 15; + public static final int INITIAL_FIRE_COUNT = 10; public static final int INITIAL_FIREFIGHTER_COUNT = 10; public static final int INITIAL_CLOUD_COUNT = 5; public static final int INITIAL_ROAD_COUNT = 5; diff --git a/src/main/java/model/Board.java b/src/main/java/model/Board.java index bb089a41406d57b0b2fe3d43b3c040cbd640b6b9..cf0d9686e7d14ad05a92f7e3203adb32eda4f9d8 100644 --- a/src/main/java/model/Board.java +++ b/src/main/java/model/Board.java @@ -3,6 +3,7 @@ package model; import util.Position; import java.util.List; +import java.util.Map; /** * This interface represents a generic board for modeling various state-based systems. @@ -11,6 +12,8 @@ import java.util.List; */ public interface Board<S> { + + /** * Get the state of the board at a specific position. * @@ -27,6 +30,13 @@ public interface Board<S> { */ void setState(S state, Position position); + + Map<Position, Obstacle> getObstacles(); + Map<Position, Extinguisher> getExtinguishers(); + + Map<Position, Fire> getFires(); + + /** * Get the number of rows in the board. * diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java index 498385f06281b4432049270165c94b9a7d7fe29d..bf1c2312da8d46722ce80edb5a2e6fbf8f604a5f 100644 --- a/src/main/java/model/Cloud.java +++ b/src/main/java/model/Cloud.java @@ -29,4 +29,6 @@ public class Cloud extends Extinguisher { } + + } diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java index df80a5e19143b1f59111b841c6131e84204c3474..c40981f3a8ac611dc397389073a0ed8b02249322 100644 --- a/src/main/java/model/Extinguisher.java +++ b/src/main/java/model/Extinguisher.java @@ -18,6 +18,7 @@ public abstract class Extinguisher implements Element{ public void setPosition(Position position) { this.position = position; + } @Override public boolean contains(List<Position> positions) { @@ -29,6 +30,12 @@ public abstract class Extinguisher implements Element{ public ModelElement getElement(){ return this.element; } + public void extinguish(Board board,Position position) { + if (board.getFires().containsKey(position)) { + board.getFires().remove(position); + } + + } public abstract List<Position> update(FirefighterBoard firefighterBoard); diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java index dc5231c8ec8efdf664fb3fbb9d10ed854e54b2dc..edc20746815c90857cf07a103c63147a65e38f79 100644 --- a/src/main/java/model/Fire.java +++ b/src/main/java/model/Fire.java @@ -10,11 +10,12 @@ public class Fire implements Element { private Position position; - private ModelElement modelElement = ModelElement.FIRE; + private ModelElement modelElement; public Fire(Position position){ this.position = position; + modelElement = ModelElement.FIRE; } @@ -34,23 +35,25 @@ public class Fire implements Element { public List<Position> update(FirefighterBoard firefighterBoard) { List<Position> modifiedPositions = new ArrayList<>(); - Map<Position, List<Position>> neighbors = firefighterBoard.getNeighbors(); - - // Étendre le feu seulement à chaque étape paire if (firefighterBoard.stepNumber() % 2 == 0) { - List<Position> neighborPositions = neighbors.get(this.getPosition()); - for (Position position : neighborPositions) { - if (!(firefighterBoard.getState(position).contains(modelElement))) { - // Ajouter un nouveau feu directement dans la liste des éléments - firefighterBoard.getElements().add(new Fire(position)); + Set<Position> newFirePositions = new HashSet<>(); + for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) { + List<Position> neighboursAvaiable = firefighterBoard.getNeighbors().get(fire); + neighboursAvaiable.removeAll(firefighterBoard.getObstacles().keySet()); + + newFirePositions.addAll(firefighterBoard.getNeighbors().get(fire)); + } + + + for (Position position : newFirePositions) { + if (!firefighterBoard.getFires().containsKey(position)) { + firefighterBoard.getFires().put(position, new Fire(position)); + modifiedPositions.add(position); } - // Marquer la position comme modifiée - modifiedPositions.add(position); } } return modifiedPositions; } - public boolean contains(List<Position> positions) { return positions.contains(this.getPosition()); diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java index c136eb4e8128ebfd698231ff642c61f8bed053d1..139a030f7a0f149840b749ce7a35e062ca262118 100644 --- a/src/main/java/model/FireFighter.java +++ b/src/main/java/model/FireFighter.java @@ -41,6 +41,4 @@ public class FireFighter extends Extinguisher { return modifiedPositions; } - - } \ No newline at end of file diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index ab4b6a7bef1ca2d639cdcc7b6d0a7af3cdd6fc31..1aaa4f23fa21611a66e1ab44b58d1124bd6ed7e3 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -14,7 +14,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int initialCloudCount; private final int initialRoadCount; - private List<Element> elements; + + private Map<Position, Fire> fires = new HashMap<>(); + private Map<Position, Extinguisher> extinguishers = new HashMap<>(); + private Map<Position, Obstacle> obstacles = new HashMap<>(); + private final Map<Position, List<Position>> neighbors = new HashMap<>(); private final Position[][] positions; private int step = 0; @@ -48,38 +52,49 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } } - + private List<Position> calculateNeighbors(int row, int column) { + 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]); + return list; + } public void initializeElements() { - elements = new ArrayList<>(); + + + fires.clear(); + extinguishers.clear(); + obstacles.clear(); + + for (int index = 0; index < initialFireCount; index++) { + Position position = randomPosition(); + fires.put(position,new Fire(position)); + - elements.add(new Fire(randomPosition())); } for (int index = 0; index < initialFirefighterCount; index++) { - elements.add(new FireFighter(randomPosition())); + Position position = randomPosition(); + extinguishers.put(position,new FireFighter(position)); + } for (int index = 0; index < initialCloudCount; index++) { + Position position = randomPosition(); + extinguishers.put(position,new Cloud(position)); - elements.add(new Cloud(randomPosition())); } for (int index = 0; index < initialRoadCount; index++) { - elements.add(new Road(randomPosition())); - } + Position position = randomPosition(); + obstacles.put(position,new Road(position)); - } + } - private List<Position> calculateNeighbors(int row, int column) { - 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]); - return list; } private Position randomPosition() { @@ -89,67 +104,81 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @Override public List<ModelElement> getState(Position position) { List<ModelElement> result = new ArrayList<>(); + if (fires.containsKey(position)) result.add(ModelElement.FIRE); + + + for (Extinguisher extinguisher : extinguishers.values()) { + if (extinguisher.getPosition().equals(position)) result.add(extinguisher.getElement()); + } - for(Element element : elements){ - if(element.getPosition().equals(position))result.add(element.getElement()); + for (Obstacle obstacle : obstacles.values()) { + if (obstacle.getPosition().equals(position)) result.add(obstacle.getElement()); } + return result; } + Position randomNeighbor(Position position) { + List<Position> neighborPositions = neighbors.get(position); + return neighborPositions.get(randomGenerator.nextInt(neighborPositions.size())); + } + @Override + public int rowCount() { + return rowCount; + } - public List<Position> updateElements() { - List<Position> modifiedPositions = new ArrayList<>(); + @Override + public int columnCount() { + return columnCount; + } + public List<Position> updateToNextGeneration() { + + Fire fire = new Fire(randomPosition()); + List<Position> modifiedPositions = new ArrayList<>(); - for (Element element : new ArrayList<>(elements)) { + for(Extinguisher element : extinguishers.values()){ modifiedPositions.addAll(element.update(this)); } + + modifiedPositions.addAll(fire.update(this)); + + + step++; return modifiedPositions; } - public List<Element> getElements() { - return elements; - } - public boolean containsFireAt(Position position) { - return elements.stream() - .anyMatch(e -> e instanceof Fire && e.getPosition().equals(position)); + public Map<Position, List<Position>> getNeighbors() { + return neighbors; } - public Position randomNeighbor(Position position) { - List<Position> neighborPositions = neighbors.get(position); - return neighborPositions.get(randomGenerator.nextInt(neighborPositions.size())); + @Override + public int stepNumber() { + return step; } - public List<Position> updateToNextGeneration() { - List<Position> modifiedPositions = updateElements(); - - step++; - return modifiedPositions; - } + public Map<Position,Fire>getFires(){ + return this.fires; - @Override - public int stepNumber() { - return step; } @Override - public int rowCount() { - return rowCount; + public Map<Position, Extinguisher> getExtinguishers() { + return extinguishers; } - @Override - public int columnCount() { - return columnCount; + public Map<Position, Obstacle> getObstacles() { + return obstacles; } @Override @@ -159,52 +188,33 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } public void extinguish(Position position) { - - for(Fire fire : new HashSet<>(getFires().values())){ - if(fire.getPosition().equals(position)){ - elements.remove(fire); - } + if (this.fires.containsKey(position)) { + this.fires.remove(position); } - } - - - public Map<Position,Fire> getFires(){ - Map<Position,Fire>fires = new HashMap<>(); - for(Element element : elements){ - if(element.getClass().equals(Fire.class)){ - fires.put(element.getPosition(), (Fire) element); - } - } - return fires; - } - - public Map<Position, List<Position>> getNeighbors() { - return neighbors; - } - public List<Position> getRoadsPosition(){ - List<Position>roadPosition = new ArrayList<>(); - for(Element road: elements){ - if(road.getClass().equals(Road.class)){ - roadPosition.add(road.getPosition()); - } - } - return roadPosition; } @Override public void setState(List<ModelElement> state, Position position) { extinguish(position); - elements.removeIf(element -> element.getPosition().equals(position)); + if(extinguishers.containsKey(position)){ + extinguishers.remove(position); + } for (ModelElement element : state) { switch (element) { - case FIRE -> elements.add(new Fire(position)); - case FIREFIGHTER -> elements.add(new FireFighter(position)); - case CLOUD -> elements.add(new Cloud(position)); + case FIRE -> fires.put(position, new Fire(position)); + case FIREFIGHTER -> extinguishers.put(position,new FireFighter(position)); + case CLOUD -> extinguishers.put(position,new Cloud(position)); } } } + + + + + } + diff --git a/src/main/java/model/Obstacle.java b/src/main/java/model/Obstacle.java new file mode 100644 index 0000000000000000000000000000000000000000..b9347496ea1b97ab06493d0f376b0ff33fcfc6d2 --- /dev/null +++ b/src/main/java/model/Obstacle.java @@ -0,0 +1,35 @@ +package model; + +import util.Position; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Obstacle implements Element{ + protected ModelElement element; + protected final Position position; + public Obstacle(Position position){ + this.position = position; + } + public boolean contains(List<Position> positions) { + return positions.contains(this.getPosition()); + + } + @Override + public Position getPosition() { + return this.position; + } + + @Override + public ModelElement getElement() { + return this.element; + } + + @Override + public List<Position> update(FirefighterBoard firefighterBoard) { + List<Position>positionList = new ArrayList<>(); + return positionList; + } + + +} diff --git a/src/main/java/model/Road.java b/src/main/java/model/Road.java index bd9d09d39a3188ac4adeb525d0b69e21db3e585b..41f0d28014993bd401c6d7ab32786382ab9f4ba6 100644 --- a/src/main/java/model/Road.java +++ b/src/main/java/model/Road.java @@ -5,32 +5,15 @@ import util.Position; import java.util.ArrayList; import java.util.List; -public class Road implements Element { +public class Road extends Obstacle{ - private ModelElement element = ModelElement.ROAD; - private final Position position; public Road(Position position){ - this.position = position; + super(position); + element = ModelElement.ROAD; } - public Position getPosition(){ - return this.position; - } - - public boolean contains(List<Position> positions) { - return positions.contains(this.getPosition()); - - } - public ModelElement getElement() { - return element; - } - - @Override - public List<Position> update(FirefighterBoard firefighterBoard) { - return List.of(); - } } diff --git a/src/main/java/util/Neighbour.java b/src/main/java/util/Neighbour.java new file mode 100644 index 0000000000000000000000000000000000000000..c2a6225a91c8def70f8e5b3a4bef2c29640fe0f0 --- /dev/null +++ b/src/main/java/util/Neighbour.java @@ -0,0 +1,46 @@ +package util; + +import model.Board; + +import java.util.*; + +public class Neighbour { + private final Random randomGenerator = new Random(); + + private final Map<Position, List<Position>> neighbors = new HashMap<>(); + Board board; + public Neighbour(Board board){ + this.board = board; + initializeNeighbour(); + } + + + private void initializeNeighbour(){ + + for (int column = 0; column < board.columnCount(); column++) { + for (int row = 0; row < board.rowCount(); row++) { + neighbors.put(new Position(row,column), calculateNeighbors(row, column)); + } + } + } + + + public List<Position> calculateNeighbors(int row, int column) { + List<Position> list = new ArrayList<>(); + if (row > 0) list.add(new Position(row-1,column)); + if (column > 0) list.add(new Position(row,column-1)); + if (row < board.rowCount() - 1) list.add(new Position(row+1,column)); + if (column < board.columnCount() - 1) list.add(new Position(row,column+1)); + return list; + } + + public Position randomNeighbor(Position position) { + List<Position> neighborPositions = neighbors.get(position); + return neighborPositions.get(randomGenerator.nextInt(neighborPositions.size())); + } + + + public Map<Position, List<Position>> getNeighbors() { + return neighbors; + } +}