Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • main
  • variant
2 results

Target

Select target project
  • m19023837/firefighter-starter-mansour-chadi-chahine-rami
  • r24025701/firefighterstarter
  • n24026202/firefighterstarter
  • couetoux.b/firefighterstarter
  • b23027938/firefighterstarter
  • z20039716/fire-fighter
  • a18023913/firefighterstarter
  • o22010261/firefighterstarter
  • b22015516/firefighterstarter
  • alaboure/firefighter-template
  • p21211679/firefighter-luis-parra-yanis-lounadi
  • v23014723/firefighter-project
  • k20014011/firefighter-template
  • m23022217/firefighter-template
  • p20006624/firefighter-template
  • l21221596/firefighter-template
  • s21232465/firefighter-template
  • y21224754/firefighter-template
  • w21225935/firefighter-template
  • h22023886/firefighter-template
  • b21221604/firefighter-template-boucenna-yacine-zeghar-mohamed-lamine
  • c23025119/firefighterstarter
  • b20031964/firefighterstarter
23 results
Select Git revision
  • main
  • variant
2 results
Show changes
Commits on Source (42)
Showing
with 654 additions and 164 deletions
File added
File added
File added
......@@ -17,8 +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 = 3;
public static final int INITIAL_FIREFIGHTER_COUNT = 6;
private Stage primaryStage;
private Parent view;
......@@ -43,8 +42,7 @@ public class SimulatorApplication extends javafx.application.Application {
loader.setLocation(location);
view = loader.load();
Controller controller = loader.getController();
controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT,
INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT);
controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT);
}
private void showScene() {
......
......@@ -12,9 +12,9 @@ import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.util.Duration;
import javafx.util.Pair;
import model.Board;
import model.ModelElement;
import model.FirefighterBoard;
import model.Board.Board;
import model.Elements.ModelElement;
import model.Board.FirefighterBoard;
import util.Position;
import view.Grid;
import view.ViewElement;
......@@ -88,9 +88,25 @@ public class Controller {
if (squareState.contains(ModelElement.FIRE)) {
return ViewElement.FIRE;
}
if (squareState.contains(ModelElement.CLOUD)) {
return ViewElement.CLOUD;
}
if (squareState.contains(ModelElement.ROAD)) {
return ViewElement.ROAD;
}
if (squareState.contains(ModelElement.MOUNTAIN)) {
return ViewElement.MOUNTAIN;
}
if (squareState.contains(ModelElement.ROCAILLE)) {
return ViewElement.ROCAILLE;
}
if (squareState.contains(ModelElement.MOTORIZEDFIREFIGHTER)) {
return ViewElement.MOTORIZEDFIREFIGHTER;
}
return ViewElement.EMPTY;
}
private void initializeTimeline() {
Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
EventHandler<ActionEvent> eventHandler =
......@@ -124,9 +140,9 @@ public class Controller {
}
public void initialize(int squareWidth, int squareHeight, int columnCount,
int rowCount, int initialFireCount, int initialFirefighterCount) {
int rowCount) {
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount));
this.setModel(new FirefighterBoard(columnCount, rowCount));
repaintGrid();
}
......
package model;
package model.Board;
import model.Elements.Fire;
import model.Elements.Obstacle.Obstacle;
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 +14,8 @@ import java.util.List;
*/
public interface Board<S> {
/**
* Get the state of the board at a specific position.
*
......@@ -27,6 +32,14 @@ public interface Board<S> {
*/
void setState(S state, Position position);
Map<Position, Obstacle> getObstacles();
Map<Position, Fire> getFires();
/**
* Get the number of rows in the board.
*
......
package model.Board;
import model.Elements.Extinguisher.Cloud;
import model.Elements.Extinguisher.Extinguisher;
import model.Elements.Extinguisher.FireFighter;
import model.Elements.Fire;
import model.Elements.ModelElement;
import model.Elements.Obstacle.Obstacle;
import util.Position;
import java.util.*;
public class FirefighterBoard implements Board<List<ModelElement>> {
private final int columnCount;
private final int rowCount;
private final Map<Position, Fire> fires = new HashMap<>();
private final Map<Position, Extinguisher> extinguishers = new HashMap<>();
private final Map<Position, Obstacle> obstacles = new HashMap<>();
private final Position[][] positions;
private int step = 0;
private final Random randomGenerator = new Random();
public FirefighterBoard(int columnCount, int rowCount) {
this.columnCount = columnCount;
this.rowCount = rowCount;
this.positions = new Position[rowCount][columnCount];
initializePositions();
initializeElements();
}
private void initializePositions() {
for (int column = 0; column < columnCount; column++) {
for (int row = 0; row < rowCount; row++) {
positions[row][column] = new Position(row, column);
}
}
}
public void initializeElements() {
for(ModelElement modelElement : ModelElement.values()){
for(int elementCount = 0; elementCount< modelElement.getInitialNumber();elementCount++){
Position position = randomPosition();
if(modelElement.isObstacle()){
obstacles.put(position, (Obstacle) modelElement.getModelElementClass(position));
} else if (modelElement.isExtinguisher()) {
extinguishers.put(position, (Extinguisher) modelElement.getModelElementClass(position));
}
else{
fires.put(position, (Fire) modelElement.getModelElementClass(position));
}
}
}
}
private Position randomPosition() {
return positions[randomGenerator.nextInt(rowCount)][randomGenerator.nextInt(columnCount)];
}
@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 (Obstacle obstacle : obstacles.values()) {
if (obstacle.getPosition().equals(position)) result.add(obstacle.getElement());
}
return result;
}
@Override
public int rowCount() {
return rowCount;
}
@Override
public int columnCount() {
return columnCount;
}
public List<Position> updateToNextGeneration() {
Fire fire = new Fire(null);
List<Position> modifiedPositions = new ArrayList<>();
for(Extinguisher element : extinguishers.values()){
modifiedPositions.addAll(element.update(this));
}
modifiedPositions.addAll(fire.update(this));
step++;
return modifiedPositions;
}
@Override
public int stepNumber() {
return step;
}
public Map<Position,Fire>getFires(){
return this.fires;
}
public Map<Position, Obstacle> getObstacles() {
return obstacles;
}
@Override
public void reset() {
step = 0;
obstacles.clear();
extinguishers.clear();
fires.clear();
initializeElements();
}
@Override
public void setState(List<ModelElement> state, Position position) {
if(extinguishers.containsKey(position)){
extinguishers.remove(position);
extinguishers.get(position).extinguish(this,position);
}
for (ModelElement element : state) {
switch (element) {
case FIRE -> fires.put(position, new Fire(position));
case FIREFIGHTER -> extinguishers.put(position,new FireFighter(position));
case CLOUD -> extinguishers.put(position,new Cloud(position));
}
}
}
}
package model.Elements;
import model.Board.Board;
import util.Position;
import java.util.List;
public interface Element {
Position getPosition();
ModelElement getElement();
List<Position> update(Board<List<ModelElement>> firefighterBoard);
}
package model.Elements.Extinguisher;
import model.Board.Board;
import model.Elements.ModelElement;
import util.Neighbour;
import util.Position;
import java.util.ArrayList;
import java.util.List;
public class Cloud extends Extinguisher {
public Cloud(Position position) {
super(position);
element = ModelElement.CLOUD;
}
public List<Position>update(Board<List<ModelElement>> firefighterBoard){
this.neighbour = new Neighbour(firefighterBoard);
List<Position> modifiedPositions = new ArrayList<>();
Position currentPosition = this.getPosition();
Position newPosition = this.neighbour.randomNeighbor(currentPosition);
this.setPosition(newPosition);
modifiedPositions.add(currentPosition);
modifiedPositions.add(newPosition);
extinguish(firefighterBoard,newPosition);
for (Position neighbor : this.neighbour.getNeighbors().get(newPosition)) {
extinguish(firefighterBoard,neighbor);
modifiedPositions.add(neighbor);
}
return modifiedPositions;
}
}
package model.Elements.Extinguisher;
import model.Board.Board;
import model.Elements.Element;
import model.Elements.ModelElement;
import util.Neighbour;
import util.Position;
import util.TargetStrategy;
import java.util.List;
public abstract class Extinguisher implements Element {
protected final TargetStrategy targetStrategy = new TargetStrategy();
protected Neighbour neighbour;
protected Position position;
protected ModelElement element;
public Extinguisher(Position position){
this.position = position;
}
public Position getPosition() {
return position;
}
public void setPosition(Position position) {
this.position = position;
}
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(Board<List<ModelElement>> firefighterBoard);
}
package model.Elements.Extinguisher;
import model.Board.Board;
import model.Elements.ModelElement;
import model.Elements.Obstacle.Mountain;
import model.Elements.Obstacle.Obstacle;
import util.Neighbour;
import util.Position;
import java.util.ArrayList;
import java.util.List;
public class FireFighter extends Extinguisher {
public FireFighter(Position position) {
super(position);
element = ModelElement.FIREFIGHTER;
}
public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
this.neighbour = new Neighbour(firefighterBoard);
List<Position> modifiedPositions = new ArrayList<>();
Position currentPosition = this.getPosition();
Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), this.neighbour.getNeighbors());
this.setPosition(newPosition);
modifiedPositions.add(currentPosition);
modifiedPositions.add(newPosition);
extinguish(firefighterBoard,newPosition);
for (Position neighbor : this.neighbour.getNeighbors().get(newPosition)) {
extinguish(firefighterBoard,neighbor);
modifiedPositions.add(neighbor);
}
for(Obstacle obstacle : firefighterBoard.getObstacles().values()){
if(obstacle instanceof Mountain){
modifiedPositions.remove(obstacle.getPosition());
}
}
return modifiedPositions;
}
}
package model.Elements.Extinguisher;
import model.Board.Board;
import model.Elements.ModelElement;
import model.Elements.Obstacle.Mountain;
import model.Elements.Obstacle.Obstacle;
import util.Neighbour;
import util.Position;
import java.util.ArrayList;
import java.util.List;
public class MotorizedFireFighter extends Extinguisher {
public MotorizedFireFighter(Position position) {
super(position);
this.element = ModelElement.MOTORIZEDFIREFIGHTER;
}
@Override
public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
this.neighbour = new Neighbour(firefighterBoard);
List<Position> modifiedPositions = new ArrayList<>();
Position currentPosition = this.getPosition();
Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), this.neighbour.getNeighbors());
Position DoublenewPosition = targetStrategy.neighborClosestToFire(newPosition, firefighterBoard.getFires().keySet(), this.neighbour.getNeighbors());
this.setPosition(DoublenewPosition);
modifiedPositions.add(currentPosition);
modifiedPositions.add(DoublenewPosition);
extinguish(firefighterBoard, newPosition);
extinguish(firefighterBoard, DoublenewPosition);
for (Position neighbor : this.neighbour.getNeighbors().get(DoublenewPosition)) {
extinguish(firefighterBoard, neighbor);
modifiedPositions.add(neighbor);
}
for (Obstacle obstacle : firefighterBoard.getObstacles().values()) {
if (obstacle instanceof Mountain) {
modifiedPositions.remove(obstacle.getPosition());
}
}
return modifiedPositions;
}
}
package model.Elements;
import model.Board.Board;
import model.Elements.Obstacle.Mountain;
import model.Elements.Obstacle.Obstacle;
import model.Elements.Obstacle.Road;
import util.Neighbour;
import util.Position;
import java.util.*;
public class Fire implements Element {
private Position position;
private Neighbour neighbour;
private final ModelElement modelElement;
public Fire(Position position){
this.position = position;
modelElement = ModelElement.FIRE;
}
public Position getPosition() {
return position;
}
@Override
public ModelElement getElement() {
return modelElement;
}
public void setPosition(Position position) {
this.position = position;
}
public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
this.neighbour = new Neighbour(firefighterBoard);
List<Position> modifiedPositions = new ArrayList<>();
if (firefighterBoard.stepNumber() % 2 == 0) {
Set<Position> newFirePositions = new HashSet<>();
for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) {
newFirePositions.addAll(removeMountainAndRoads(firefighterBoard,fire));
}
for (Position position : newFirePositions) {
if (!firefighterBoard.getFires().containsKey(position)) {
firefighterBoard.getFires().put(position, new Fire(position));
modifiedPositions.add(position);
}
}
}
return modifiedPositions;
}
private List<Position>removeMountainAndRoads(Board<List<ModelElement>> firefighterBoard,Position position){
List<Position>neighboursAvailable;
neighboursAvailable = this.neighbour.getNeighbors().get(position);
if(firefighterBoard.stepNumber()%4==0){
List<Position>MountainAndRoadsPositions = new ArrayList<>();
for(Obstacle obstacle : firefighterBoard.getObstacles().values()){
if(obstacle instanceof Road || obstacle instanceof Mountain){
MountainAndRoadsPositions.add(obstacle.getPosition());
neighboursAvailable.removeAll(MountainAndRoadsPositions);
}
}
}
else{
neighboursAvailable.removeAll(firefighterBoard.getObstacles().keySet());
}
return neighboursAvailable;
}
}
\ No newline at end of file
package model.Elements;
import model.Elements.Extinguisher.Cloud;
import model.Elements.Extinguisher.Extinguisher;
import model.Elements.Extinguisher.FireFighter;
import model.Elements.Extinguisher.MotorizedFireFighter;
import model.Elements.Obstacle.Mountain;
import model.Elements.Obstacle.Obstacle;
import model.Elements.Obstacle.Road;
import model.Elements.Obstacle.Rocaille;
import util.Position;
public enum ModelElement {
FIREFIGHTER(5),
FIRE(25),
CLOUD(10),
ROAD(5),
MOUNTAIN(5),
ROCAILLE(3),
MOTORIZEDFIREFIGHTER(3);
private final int initialNumber;
ModelElement(int initialNumber) {
this.initialNumber = initialNumber;
}
public int getInitialNumber(){
return this.initialNumber;
}
public Element getModelElementClass(Position position){
return switch (this){
case FIRE -> new Fire(position);
case ROAD -> new Road(position);
case FIREFIGHTER -> new FireFighter(position);
case CLOUD -> new Cloud(position);
case MOUNTAIN -> new Mountain(position);
case ROCAILLE -> new Rocaille(position);
case MOTORIZEDFIREFIGHTER -> new MotorizedFireFighter(position);
default -> throw new IllegalArgumentException("Unknown ModelElement: " + this);
};
}
public boolean isObstacle() {
return this.getModelElementClass(null) instanceof Obstacle;
}
public boolean isExtinguisher(){
return this.getModelElementClass(null) instanceof Extinguisher;
}
}
package model.Elements.Obstacle;
import model.Elements.ModelElement;
import util.Position;
public class Mountain extends Obstacle {
public Mountain(Position position) {
super(position);
element = ModelElement.MOUNTAIN;
}
}
package model.Elements.Obstacle;
import model.Board.Board;
import model.Elements.Element;
import model.Elements.ModelElement;
import util.Position;
import java.util.List;
public abstract class Obstacle implements Element {
protected ModelElement element;
protected final Position position;
public Obstacle(Position position){
this.position = position;
}
@Override
public Position getPosition() {
return this.position;
}
@Override
public ModelElement getElement() {
return this.element;
}
public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
return null;
}
}
package model.Elements.Obstacle;
import model.Elements.ModelElement;
import util.Position;
public class Road extends Obstacle {
public Road(Position position){
super(position);
element = ModelElement.ROAD;
}
}
package model.Elements.Obstacle;
import model.Elements.ModelElement;
import util.Position;
public class Rocaille extends Obstacle {
public Rocaille(Position position) {
super(position);
this.element = ModelElement.ROCAILLE;
}
}
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 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();
}
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
package model;
public enum ModelElement {
FIREFIGHTER, FIRE
}