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 (36)
Showing
with 635 additions and 85 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() {
......
......@@ -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;
import model.Extinguisher.Extinguisher;
import model.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, Extinguisher> getExtinguishers();
Map<Position, Fire> getFires();
/**
* Get the number of rows in the board.
*
......
package model;
import util.Position;
import java.util.List;
public interface Element {
boolean contains(List<Position>positions);
Position getPosition();
ModelElement getElement();
List<Position> update(Board<List<ModelElement>> firefighterBoard);
}
package model.Extinguisher;
import model.Board;
import model.Extinguisher.Extinguisher;
import model.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);
return modifiedPositions;
}
}
package model.Extinguisher;
import model.Board;
import model.Element;
import model.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;
}
@Override
public boolean contains(List<Position> positions) {
return positions.contains(this.getPosition());
}
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.Extinguisher;
import model.Board;
import model.ModelElement;
import model.Obstacle.Montain;
import model.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 Montain){
modifiedPositions.remove(obstacle.getPosition());
}
}
return modifiedPositions;
}
}
package model.Extinguisher;
import model.Board;
import model.ModelElement;
import model.Obstacle.Montain;
import model.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 Montain) {
modifiedPositions.remove(obstacle.getPosition());
}
}
return modifiedPositions;
}
}
package model;
import model.Obstacle.Montain;
import model.Obstacle.Obstacle;
import model.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;
}
public boolean contains(List<Position> positions) {
return positions.contains(this.getPosition());
}
public 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 Montain){
MountainAndRoadsPositions.add(obstacle.getPosition());
neighboursAvailable.removeAll(MountainAndRoadsPositions);
}
}
}
else{
neighboursAvailable.removeAll(firefighterBoard.getObstacles().keySet());
}
return neighboursAvailable;
}
}
\ No newline at end of file
package model;
import model.Extinguisher.Cloud;
import model.Extinguisher.Extinguisher;
import model.Extinguisher.FireFighter;
import model.Obstacle.Obstacle;
import util.Position;
import java.util.*;
......@@ -8,58 +12,70 @@ 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 Map<Position, Fire> fires = new HashMap<>();
private Map<Position, Extinguisher> extinguishers = new HashMap<>();
private 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, int initialFireCount, int initialFirefighterCount) {
public FirefighterBoard(int columnCount, int rowCount) {
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;
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() {
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());
obstacles.clear();
extinguishers.clear();
fires.clear();
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 new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
return positions[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);
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;
}
......@@ -74,24 +90,17 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
}
public List<Position> updateToNextGeneration() {
List<Position> modifiedPositions = updateFirefighters();
modifiedPositions.addAll(updateFires());
step++;
return modifiedPositions;
}
private List<Position> updateFires() {
Fire fire = new Fire(randomPosition());
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);
for(Extinguisher element : extinguishers.values()){
modifiedPositions.addAll(element.update(this));
}
return modifiedPositions;
modifiedPositions.addAll(fire.update(this));
step++;
return modifiedPositions;
}
@Override
......@@ -99,49 +108,45 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
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);
public Map<Position,Fire>getFires(){
return this.fires;
}
firefighterPositions = firefighterNewPositions;
return modifiedPosition;
@Override
public Map<Position, Extinguisher> getExtinguishers() {
return extinguishers;
}
public Map<Position, Obstacle> getObstacles() {
return obstacles;
}
@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;
if(extinguishers.containsKey(position)){
extinguishers.remove(position);
extinguishers.get(position).extinguish(this,position);
}
for (ModelElement element : state) {
switch (element) {
case FIRE -> firePositions.add(position);
case FIREFIGHTER -> firefighterPositions.add(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));
}
}
}
}
package model;
import model.Extinguisher.Cloud;
import model.Extinguisher.Extinguisher;
import model.Extinguisher.FireFighter;
import model.Extinguisher.MotorizedFireFighter;
import model.Obstacle.Montain;
import model.Obstacle.Obstacle;
import model.Obstacle.Road;
import model.Obstacle.Rocaille;
import util.Position;
import java.util.ArrayList;
import java.util.List;
public enum ModelElement {
FIREFIGHTER, FIRE
FIREFIGHTER(5),
FIRE(20),
CLOUD(10),
ROAD(5),
MOUNTAIN(5),
ROCAILLE(3),
MOTORIZEDFIREFIGHTER(5);
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 Montain(position);
case ROCAILLE -> new Rocaille(position);
case MOTORIZEDFIREFIGHTER -> new MotorizedFireFighter(position);
default -> throw new IllegalArgumentException("Unknown ModelElement: " + this);
};
}
public static List<Integer> getInitialNumbers(){
List<Integer>listIninitalNumbers = new ArrayList<>();
for(ModelElement modelElement : ModelElement.values()){
listIninitalNumbers.add(modelElement.getInitialNumber());
}
return listIninitalNumbers;
}
public boolean isObstacle(){
if(this.getModelElementClass(null) instanceof Obstacle){
return true;
}
return false;
}
public boolean isExtinguisher(){
if(this.getModelElementClass(null) instanceof Extinguisher){
return true;
}
return false;
}
}
package model.Obstacle;
import model.ModelElement;
import model.Obstacle.Obstacle;
import util.Position;
public class Montain extends Obstacle {
public Montain(Position position) {
super(position);
element = ModelElement.MOUNTAIN;
}
}
package model.Obstacle;
import model.Board;
import model.Element;
import model.ModelElement;
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;
}
public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
return null;
}
}
package model.Obstacle;
import model.ModelElement;
import model.Obstacle.Obstacle;
import util.Position;
public class Road extends Obstacle {
public Road(Position position){
super(position);
element = ModelElement.ROAD;
}
}
package model.Obstacle;
import model.ModelElement;
import model.Obstacle.Obstacle;
import util.Position;
public class Rocaille extends Obstacle {
public Rocaille(Position position) {
super(position);
this.element = ModelElement.ROCAILLE;
}
}
......@@ -4,5 +4,6 @@ module firefighter {
requires javafx.graphics;
opens controller to javafx.fxml;
exports app;
exports view;
opens app to javafx.fxml;
}
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 this.neighbors;
}
}