Skip to content
Snippets Groups Projects
Commit 08532ee2 authored by MEHDI's avatar MEHDI
Browse files

mehdi and mohamed : adding Obstacle abstract class and modifiying FirefighterBoard implementation

parent 0885cdd3
Branches
No related tags found
No related merge requests found
...@@ -17,7 +17,7 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -17,7 +17,7 @@ public class SimulatorApplication extends javafx.application.Application {
private static final int COLUMN_COUNT = 20; private static final int COLUMN_COUNT = 20;
private static final int BOX_WIDTH = 50; private static final int BOX_WIDTH = 50;
private static final int BOX_HEIGHT = 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_FIREFIGHTER_COUNT = 10;
public static final int INITIAL_CLOUD_COUNT = 5; public static final int INITIAL_CLOUD_COUNT = 5;
public static final int INITIAL_ROAD_COUNT = 5; public static final int INITIAL_ROAD_COUNT = 5;
......
...@@ -3,6 +3,7 @@ package model; ...@@ -3,6 +3,7 @@ package model;
import util.Position; import util.Position;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* This interface represents a generic board for modeling various state-based systems. * This interface represents a generic board for modeling various state-based systems.
...@@ -11,6 +12,8 @@ import java.util.List; ...@@ -11,6 +12,8 @@ import java.util.List;
*/ */
public interface Board<S> { public interface Board<S> {
/** /**
* Get the state of the board at a specific position. * Get the state of the board at a specific position.
* *
...@@ -27,6 +30,13 @@ public interface Board<S> { ...@@ -27,6 +30,13 @@ public interface Board<S> {
*/ */
void setState(S state, Position position); 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. * Get the number of rows in the board.
* *
......
...@@ -29,4 +29,6 @@ public class Cloud extends Extinguisher { ...@@ -29,4 +29,6 @@ public class Cloud extends Extinguisher {
} }
} }
...@@ -18,6 +18,7 @@ public abstract class Extinguisher implements Element{ ...@@ -18,6 +18,7 @@ public abstract class Extinguisher implements Element{
public void setPosition(Position position) { public void setPosition(Position position) {
this.position = position; this.position = position;
} }
@Override @Override
public boolean contains(List<Position> positions) { public boolean contains(List<Position> positions) {
...@@ -29,6 +30,12 @@ public abstract class Extinguisher implements Element{ ...@@ -29,6 +30,12 @@ public abstract class Extinguisher implements Element{
public ModelElement getElement(){ public ModelElement getElement(){
return this.element; 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); public abstract List<Position> update(FirefighterBoard firefighterBoard);
......
...@@ -10,11 +10,12 @@ public class Fire implements Element { ...@@ -10,11 +10,12 @@ public class Fire implements Element {
private Position position; private Position position;
private ModelElement modelElement = ModelElement.FIRE; private ModelElement modelElement;
public Fire(Position position){ public Fire(Position position){
this.position = position; this.position = position;
modelElement = ModelElement.FIRE;
} }
...@@ -34,23 +35,25 @@ public class Fire implements Element { ...@@ -34,23 +35,25 @@ public class Fire implements Element {
public List<Position> update(FirefighterBoard firefighterBoard) { public List<Position> update(FirefighterBoard firefighterBoard) {
List<Position> modifiedPositions = new ArrayList<>(); List<Position> modifiedPositions = new ArrayList<>();
Map<Position, List<Position>> neighbors = firefighterBoard.getNeighbors();
// Étendre le feu seulement à chaque étape paire
if (firefighterBoard.stepNumber() % 2 == 0) { if (firefighterBoard.stepNumber() % 2 == 0) {
List<Position> neighborPositions = neighbors.get(this.getPosition()); Set<Position> newFirePositions = new HashSet<>();
for (Position position : neighborPositions) { for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) {
if (!(firefighterBoard.getState(position).contains(modelElement))) { List<Position> neighboursAvaiable = firefighterBoard.getNeighbors().get(fire);
// Ajouter un nouveau feu directement dans la liste des éléments neighboursAvaiable.removeAll(firefighterBoard.getObstacles().keySet());
firefighterBoard.getElements().add(new Fire(position));
newFirePositions.addAll(firefighterBoard.getNeighbors().get(fire));
} }
// Marquer la position comme modifiée
for (Position position : newFirePositions) {
if (!firefighterBoard.getFires().containsKey(position)) {
firefighterBoard.getFires().put(position, new Fire(position));
modifiedPositions.add(position); modifiedPositions.add(position);
} }
} }
}
return modifiedPositions; return modifiedPositions;
} }
public boolean contains(List<Position> positions) { public boolean contains(List<Position> positions) {
return positions.contains(this.getPosition()); return positions.contains(this.getPosition());
......
...@@ -41,6 +41,4 @@ public class FireFighter extends Extinguisher { ...@@ -41,6 +41,4 @@ public class FireFighter extends Extinguisher {
return modifiedPositions; return modifiedPositions;
} }
} }
\ No newline at end of file
...@@ -14,7 +14,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -14,7 +14,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
private final int initialCloudCount; private final int initialCloudCount;
private final int initialRoadCount; 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 Map<Position, List<Position>> neighbors = new HashMap<>();
private final Position[][] positions; private final Position[][] positions;
private int step = 0; private int step = 0;
...@@ -48,38 +52,49 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -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() { public void initializeElements() {
elements = new ArrayList<>();
fires.clear();
extinguishers.clear();
obstacles.clear();
for (int index = 0; index < initialFireCount; index++) { 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++) { 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++) { 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++) { 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() { private Position randomPosition() {
...@@ -89,67 +104,81 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -89,67 +104,81 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
@Override @Override
public List<ModelElement> getState(Position position) { public List<ModelElement> getState(Position position) {
List<ModelElement> result = new ArrayList<>(); List<ModelElement> result = new ArrayList<>();
if (fires.containsKey(position)) result.add(ModelElement.FIRE);
for(Element element : elements){
if(element.getPosition().equals(position))result.add(element.getElement());
}
return result; for (Extinguisher extinguisher : extinguishers.values()) {
if (extinguisher.getPosition().equals(position)) result.add(extinguisher.getElement());
} }
for (Obstacle obstacle : obstacles.values()) {
if (obstacle.getPosition().equals(position)) result.add(obstacle.getElement());
}
return result;
}
public List<Position> updateElements() { Position randomNeighbor(Position position) {
List<Position> modifiedPositions = new ArrayList<>(); List<Position> neighborPositions = neighbors.get(position);
return neighborPositions.get(randomGenerator.nextInt(neighborPositions.size()));
}
for (Element element : new ArrayList<>(elements)) { @Override
modifiedPositions.addAll(element.update(this)); public int rowCount() {
return rowCount;
} }
return modifiedPositions; @Override
public int columnCount() {
return columnCount;
} }
public List<Element> getElements() { public List<Position> updateToNextGeneration() {
return elements;
}
public boolean containsFireAt(Position position) { Fire fire = new Fire(randomPosition());
return elements.stream() List<Position> modifiedPositions = new ArrayList<>();
.anyMatch(e -> e instanceof Fire && e.getPosition().equals(position));
}
public Position randomNeighbor(Position position) { for(Extinguisher element : extinguishers.values()){
List<Position> neighborPositions = neighbors.get(position); modifiedPositions.addAll(element.update(this));
return neighborPositions.get(randomGenerator.nextInt(neighborPositions.size()));
} }
modifiedPositions.addAll(fire.update(this));
public List<Position> updateToNextGeneration() {
List<Position> modifiedPositions = updateElements();
step++; step++;
return modifiedPositions; return modifiedPositions;
} }
public Map<Position, List<Position>> getNeighbors() {
return neighbors;
}
@Override @Override
public int stepNumber() { public int stepNumber() {
return step; return step;
} }
@Override
public int rowCount() {
return rowCount;
public Map<Position,Fire>getFires(){
return this.fires;
} }
@Override @Override
public int columnCount() { public Map<Position, Extinguisher> getExtinguishers() {
return columnCount; return extinguishers;
}
public Map<Position, Obstacle> getObstacles() {
return obstacles;
} }
@Override @Override
...@@ -159,52 +188,33 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -159,52 +188,33 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
} }
public void extinguish(Position position) { public void extinguish(Position position) {
if (this.fires.containsKey(position)) {
for(Fire fire : new HashSet<>(getFires().values())){ this.fires.remove(position);
if(fire.getPosition().equals(position)){
elements.remove(fire);
}
}
}
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 @Override
public void setState(List<ModelElement> state, Position position) { public void setState(List<ModelElement> state, Position position) {
extinguish(position); extinguish(position);
elements.removeIf(element -> element.getPosition().equals(position)); if(extinguishers.containsKey(position)){
extinguishers.remove(position);
}
for (ModelElement element : state) { for (ModelElement element : state) {
switch (element) { switch (element) {
case FIRE -> elements.add(new Fire(position)); case FIRE -> fires.put(position, new Fire(position));
case FIREFIGHTER -> elements.add(new FireFighter(position)); case FIREFIGHTER -> extinguishers.put(position,new FireFighter(position));
case CLOUD -> elements.add(new Cloud(position)); case CLOUD -> extinguishers.put(position,new Cloud(position));
} }
} }
} }
} }
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;
}
}
...@@ -5,32 +5,15 @@ import util.Position; ...@@ -5,32 +5,15 @@ import util.Position;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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){ 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();
}
} }
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;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment