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 (29)
Showing
with 486 additions and 84 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,16 @@ 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;
}
return ViewElement.EMPTY;
}
private void initializeTimeline() {
Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
EventHandler<ActionEvent> eventHandler =
......@@ -124,9 +131,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 util.Neighbour;
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 +13,8 @@ import java.util.List;
*/
public interface Board<S> {
/**
* Get the state of the board at a specific position.
*
......@@ -27,6 +31,14 @@ public interface Board<S> {
*/
void setState(S state, Position position);
Map<Position, Obstacle> getObstacles();
Map<Position, Extinguisher> getExtinguishers();
Map<Position, Fire> getFires();
Neighbour getNeighbor();
/**
* Get the number of rows in the board.
*
......
package model;
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){
List<Position> modifiedPositions = new ArrayList<>();
Position currentPosition = this.getPosition();
Position newPosition = firefighterBoard.getNeighbor().randomNeighbor(currentPosition);
this.setPosition(newPosition);
modifiedPositions.add(currentPosition);
modifiedPositions.add(newPosition);
extinguish(firefighterBoard,newPosition);
return modifiedPositions;
}
}
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;
import util.Position;
import java.util.List;
public abstract class Extinguisher implements Element{
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;
import util.Position;
import java.util.*;
public class Fire implements Element {
private Position position;
private 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) {
List<Position> modifiedPositions = new ArrayList<>();
if (firefighterBoard.stepNumber() % 2 == 0) {
Set<Position> newFirePositions = new HashSet<>();
for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) {
List<Position> neighboursAvaiable = firefighterBoard.getNeighbor().getNeighbors().get(fire);
neighboursAvaiable.removeAll(firefighterBoard.getObstacles().keySet());
newFirePositions.addAll(firefighterBoard.getNeighbor().getNeighbors().get(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());
}
}
\ No newline at end of file
package model;
import util.Position;
import util.TargetStrategy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FireFighter extends Extinguisher {
private final TargetStrategy targetStrategy = new TargetStrategy();
public FireFighter(Position position){
super(position);
element = ModelElement.FIREFIGHTER;
}
public List<Position> update(Board<List<ModelElement>> firefighterBoard){
List<Position> modifiedPositions = new ArrayList<>();
Position currentPosition = this.getPosition();
Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), firefighterBoard.getNeighbor().getNeighbors());
this.setPosition(newPosition);
modifiedPositions.add(currentPosition);
modifiedPositions.add(newPosition);
extinguish(firefighterBoard,newPosition);
for (Position neighbor : firefighterBoard.getNeighbor().getNeighbors().get(newPosition)) {
extinguish(firefighterBoard,neighbor);
modifiedPositions.add(neighbor);
}
return modifiedPositions;
}
}
\ No newline at end of file
package model;
import util.Neighbour;
import util.Position;
import java.util.*;
......@@ -8,58 +9,68 @@ 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 Neighbour neighbour;
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;
this.neighbour = new Neighbour(this);
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());
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;
}
......@@ -73,25 +84,25 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
return columnCount;
}
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));
}
modifiedPositions.addAll(fire.update(this));
step++;
return modifiedPositions;
}
public Neighbour getNeighbor() {
return neighbour;
}
@Override
......@@ -99,49 +110,50 @@ 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;
}
@Override
public Map<Position, Extinguisher> getExtinguishers() {
return extinguishers;
}
firefighterPositions = firefighterNewPositions;
return modifiedPosition;
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 util.Position;
import java.util.ArrayList;
import java.util.List;
public enum ModelElement {
FIREFIGHTER, FIRE
FIREFIGHTER(10),
FIRE(10),
CLOUD(10),
ROAD(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);
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;
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;
import util.Position;
import java.util.ArrayList;
import java.util.List;
public class Road extends Obstacle{
public Road(Position position){
super(position);
element = ModelElement.ROAD;
}
}
......@@ -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;
}
}
package util;
import model.Board;
import model.FirefighterBoard;
import java.util.Random;
public record Position(int row, int column) {
}
package model;
package util;
import util.Position;
......@@ -12,7 +12,7 @@ public class TargetStrategy {
* @param targets positions that are targeted.
* @return the position next to the current position that is on the path to the closest target.
*/
Position neighborClosestToFire(Position position, Collection<Position> targets,
public Position neighborClosestToFire(Position position, Collection<Position> targets,
Map<Position,List<Position>>neighbors) {
Set<Position> seen = new HashSet<Position>();
HashMap<Position, Position> firstMove = new HashMap<Position, Position>();
......
......@@ -10,8 +10,10 @@ import java.util.List;
public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
private void paintElementAtPosition(ViewElement element, Position position) {
System.out.println("Painting " + element + " at " + position);
paintBox(position.row(), position.column(), element.color);
}
private int boxWidth;
private int boxHeight;
private int columnCount;
......