Skip to content
Snippets Groups Projects
Commit bc08f70b authored by CHAHINE Rami's avatar CHAHINE Rami
Browse files

added the Diagram img and text anf fixed the problem of initialize the element

parent 6a49a5b5
No related branches found
No related tags found
No related merge requests found
Pipeline #41463 passed
Showing
with 202 additions and 158 deletions
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
@startuml
' Enum: ModelElement
enum ModelElement {
FIREFIGHTER
FIRE
CLOUD
ROAD
EMPTY
MOUNTAIN
FIRETRUCK
ROCKS
}
' Class: Position
class Position {
- row: int
- column: int
+ Position(row: int, column: int)
+ getRow(): int
+ getColumn(): int
}
' Interface: Strategy
interface Strategy {
+ update(): List<Position>
+ getModelPositions(): List<Position>
+ getFirePositions(): Set<Position>
}
' Class: FireTruckMovementStrategy
class FireTruckMovementStrategy {
- targetStrategy: TargetStrategy
- fireTruckPositions: List<Position>
- firePositions: Set<Position>
- neighbors: Map<Position, List<Position>>
+ FireTruckMovementStrategy(firefighterPositions: List<Position>, firePositions: Set<Position>, neighbors: Map<Position, List<Position>>)
+ update(): List<Position>
+ nextValidPosition(currentPosition: Position): Position
+ extinguishNearbyFires(position: Position, modifiedPositions: List<Position>)
+ extinguishAll(positions: List<Position>)
}
' Class: SimpleFireSpreadStrategy
class SimpleFireSpreadStrategy {
- firePositions: Set<Position>
- neighbors: Map<Position, List<Position>>
- mountainPositions: Set<Position>
- roadPositions: Set<Position>
- rocksPositions: Set<Position>
- step: int
+ SimpleFireSpreadStrategy(firePositions: Set<Position>, neighbors: Map<Position, List<Position>>, mountainPositions: Set<Position>, roadPositions: Set<Position>, rocksPositions: Set<Position>, step: int)
+ update(): List<Position>
+ spreadFire(firePosition: Position, newFirePositions: Set<Position>)
+ canPropagateTo(newPosition: Position): boolean
}
' Class: Initializer
class Initializer {
- columnCount: int
- rowCount: int
- initialFireCount: int
- initialFirefighterCount: int
- initialRoadCount: int
- initialCloudCount: int
- initialMountainCount: int
- initialFireTruckCount: int
- initialRocksCount: int
- positions: Position[][]
- neighbors: Map<Position, List<Position>>
- firePositions: Set<Position>
- firefighterPositions: List<Position>
- RoadPositions: List<Position>
- cloudPositions: List<Position>
- mountainsPositions: Set<Position>
- FireTruckPositions: List<Position>
- rocksPositions: Set<Position>
- randomGenerator: Random
+ Initializer(columnCount: int, rowCount: int, initialFireCount: int, initialFirefighterCount: int, initialRoadCount: int, initialCloudCount: int, initialMountainCount: int, initialRocksCount: int, initialFireTruckCount: int)
+ initializePositions(): void
+ initializeNeighbors(): void
+ initializeElements(): void
+ addRandomPositions(targetCollection: Collection<Position>, count: int)
}
' Class: NeighborManager
class NeighborManager {
- neighbors: Map<Position, List<Position>>
+ NeighborManager(rowCount: int, columnCount: int)
+ getNeighbors(): Map<Position, List<Position>>
+ getAdjacentPositions(position: Position): List<Position>
}
' Class: TargetStrategy
class TargetStrategy {
+ calculateTarget(fireTruckPosition: Position, firePositions: Set<Position>): Position
}
' Class: Board
class Board {
- positions: Position[][]
- modelElements: Map<Position, ModelElement>
+ Board(rowCount: int, columnCount: int)
+ setModelElement(position: Position, element: ModelElement): void
+ getModelElement(position: Position): ModelElement
}
' Class: BoardManager
class BoardManager {
- board: Board
- initializer: Initializer
+ BoardManager(board: Board, initializer: Initializer)
+ initializeBoard(): void
+ updateBoard(): void
}
' Class: CloudStrategy
class CloudStrategy {
- cloudPositions: Set<Position>
+ CloudStrategy(cloudPositions: Set<Position>)
+ updateCloud(): Set<Position>
+ addCloudPosition(position: Position): void
}
' Class: FirefighterBoard
class FirefighterBoard {
- firefighterPositions: List<Position>
+ FirefighterBoard(firefighterPositions: List<Position>)
+ updateFirefighterPositions(): void
+ addFirefighter(position: Position): void
}
' Class: FirefighterMovementStrategy
class FirefighterMovementStrategy {
- firefighterPositions: List<Position>
- neighbors: Map<Position, List<Position>>
+ FirefighterMovementStrategy(firefighterPositions: List<Position>, neighbors: Map<Position, List<Position>>)
+ update(): List<Position>
+ nextValidPosition(currentPosition: Position): Position
+ moveToNextPosition(): Position
}
' Relationship: FireTruckMovementStrategy implements Strategy
FireTruckMovementStrategy -|> Strategy : implements
' Relationship: SimpleFireSpreadStrategy implements Strategy
SimpleFireSpreadStrategy -|> Strategy : implements
' Relationship: Initializer uses NeighborManager
Initializer --> NeighborManager : uses
' Relationship: FireTruckMovementStrategy and SimpleFireSpreadStrategy depend on Position
FireTruckMovementStrategy --> Position : depends on
SimpleFireSpreadStrategy --> Position : depends on
' Relationship: FireTruckMovementStrategy and SimpleFireSpreadStrategy depend on neighbors
FireTruckMovementStrategy --> Map : depends on
SimpleFireSpreadStrategy --> Map : depends on
' Relationship: FireTruckMovementStrategy uses TargetStrategy
FireTruckMovementStrategy --> TargetStrategy : uses
' Relationship: ModelElement is an enum
ModelElement ..> FireTruckMovementStrategy : used by
ModelElement ..> SimpleFireSpreadStrategy : used by
' Relationship: Position used by Initializer for grid setup
Position --> Initializer : used by
' Relationship: Position used by FireTruckMovementStrategy and SimpleFireSpreadStrategy
Position --> FireTruckMovementStrategy : used by
Position --> SimpleFireSpreadStrategy : used by
' Relationship: Board is used by BoardManager
Board --> BoardManager : used by
' Relationship: CloudStrategy uses Position
CloudStrategy --> Position : uses
' Relationship: BoardManager uses Board and Initializer
BoardManager --> Board : uses
BoardManager --> Initializer : uses
' Relationship: FirefighterMovementStrategy uses Position
FirefighterMovementStrategy --> Position : uses
' Relationship: FirefighterMovementStrategy and FirefighterBoard use Board
FirefighterBoard --> Board : uses
FirefighterMovementStrategy --> Board : uses
@enduml
File deleted
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
......@@ -20,10 +20,10 @@ public class SimulatorApplication extends javafx.application.Application {
public static final int INITIAL_FIRE_COUNT = 5;
public static final int INITIAL_FIREFIGHTER_COUNT = 4;
public static final int INITIAL_ROAD_COUNT = 10;
public static final int INITIAL_CLOUD_COUNT = 5;
public static final int INITIAL_CLOUD_COUNT = 3;
public static final int INITIAL_MOUTAIN_COUNT = 5;
public static final int INITIAL_FIRE_TRUCK_COUNT = 3;
public static final int INITIAL_ROCKS_COUNT = 5;
public static final int INITIAL_FIRE_TRUCK_COUNT = 2;
public static final int INITIAL_ROCKS_COUNT = 3;
private Stage primaryStage;
private Parent view;
......
......@@ -4,7 +4,7 @@ import util.Position;
import javafx.util.Pair;
import java.util.*;
import static model.ModelElement.CLOUD;
public class FirefighterBoard implements Board<List<ModelElement>> {
private final int columnCount;
......@@ -19,7 +19,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
private List<Position> firefighterPositions;
private Set<Position> firePositions;
private Set<Position> roadPositions;
private final Set<Position> roadPositions;
private final Map<Position, List<Position>> neighbors;
private final Position[][] positions;
private List<Position> cloudPositions;
......@@ -242,7 +242,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
public List<Pair<Position, ModelElement>> getUpdatedElements() {
List<Pair<Position, ModelElement>> updatedElements = new ArrayList<>();
System.out.println(initialFireCount);
// Add fire positions
for (Position firePosition : firePositions) {
updatedElements.add(new Pair<>(firePosition, ModelElement.FIRE));
......@@ -280,149 +280,3 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
/*
import util.*;
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
......@@ -32,7 +32,8 @@ public class Initializer {
private final Random randomGenerator = new Random();
public Initializer(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialRoadCount,int initialcloudCount, int initialMoutainCount, int initialRocksCount,int initialFireTruckCount) {
public Initializer(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialRoadCount,
int initialcloudCount, int initialMoutainCount, int initialRocksCount,int initialFireTruckCount) {
this.columnCount = columnCount;
this.rowCount = rowCount;
this.initialFireCount = initialFireCount;
......@@ -52,9 +53,7 @@ public class Initializer {
this.mountainsPositions = new HashSet<>();
this.FireTruckPositions = new ArrayList<>();
this.rocksPositions = new HashSet<>();
initializePositions();
initializeNeighbors();
initializeElements();
}
private void initializePositions() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment