Skip to content
Snippets Groups Projects
Commit 918f13bd authored by YOUSSOUF Ali moussa's avatar YOUSSOUF Ali moussa
Browse files

implementations de la classe MOTORIZED_FIREFIGHTER.java tout en respectant le principe solid

parent ec82c683
No related branches found
No related tags found
No related merge requests found
...@@ -21,6 +21,8 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -21,6 +21,8 @@ public class SimulatorApplication extends javafx.application.Application {
public static final int INITIAL_FIREFIGHTER_COUNT = 6; public static final int INITIAL_FIREFIGHTER_COUNT = 6;
public static final int INITIAL_CLOUD_COUNT = 6; public static final int INITIAL_CLOUD_COUNT = 6;
public static final int INITIAL_MONTAIN_COUNT = 4; public static final int INITIAL_MONTAIN_COUNT = 4;
public static final int INITIAL_MOTORIZED_FIREFIGHTER_COUNT = 4;
private Stage primaryStage; private Stage primaryStage;
private Parent view; private Parent view;
...@@ -46,7 +48,7 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -46,7 +48,7 @@ public class SimulatorApplication extends javafx.application.Application {
view = loader.load(); view = loader.load();
Controller controller = loader.getController(); Controller controller = loader.getController();
controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT, controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT,
INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MONTAIN_COUNT); INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MONTAIN_COUNT,INITIAL_MOTORIZED_FIREFIGHTER_COUNT);
} }
private void showScene() { private void showScene() {
......
...@@ -94,6 +94,9 @@ public class Controller { ...@@ -94,6 +94,9 @@ public class Controller {
if(model instanceof Montains){ if(model instanceof Montains){
return new MONTAINS(); return new MONTAINS();
} }
if(model instanceof Motorized_Firefighter){
return new MOTORIZED_FIREFIGHTER();
}
} }
...@@ -133,9 +136,9 @@ public class Controller { ...@@ -133,9 +136,9 @@ public class Controller {
} }
public void initialize(int squareWidth, int squareHeight, int columnCount, public void initialize(int squareWidth, int squareHeight, int columnCount,
int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainsCount) { int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainsCount,int initialMorized_firefighterCount) {
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount,initialCloudsCount, initialMontainsCount)); this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount,initialCloudsCount, initialMontainsCount,initialMorized_firefighterCount));
repaintGrid(); repaintGrid();
} }
......
...@@ -2,10 +2,7 @@ package model; ...@@ -2,10 +2,7 @@ package model;
import util.Position; import util.Position;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Random;
import java.util.Set;
public class BoardMethods { public class BoardMethods {
int columnCount; int columnCount;
...@@ -17,7 +14,7 @@ public class BoardMethods { ...@@ -17,7 +14,7 @@ public class BoardMethods {
firPositions.remove(position); firPositions.remove(position);
} }
public List<Position> neighbors(Position position, int rowCount, int columnCount) { public List<Position> neighbors(Position position) {
List<Position> list = new ArrayList<>(); List<Position> list = new ArrayList<>();
if (position.row() > 0) list.add(new Position(position.row() - 1, position.column())); if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1)); if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
...@@ -26,6 +23,26 @@ public class BoardMethods { ...@@ -26,6 +23,26 @@ public class BoardMethods {
return list; return list;
} }
public Position neighborClosestToFire(Position position, Set<Position> firePositions) {
Set<Position> seen = new HashSet<>();
HashMap<Position, Position> firstMove = new HashMap<>();
Queue<Position> toVisit = new LinkedList<>(neighbors(position));
for (Position initialMove : toVisit)
firstMove.put(initialMove, initialMove);
while (!toVisit.isEmpty()) {
Position current = toVisit.poll();
if (firePositions.contains(current))
return firstMove.get(current);
for (Position adjacent : neighbors(current)) {
if (seen.contains(adjacent)) continue;
toVisit.add(adjacent);
seen.add(adjacent);
firstMove.put(adjacent, firstMove.get(current));
}
}
return position;
}
public Position randomPosition() { public Position randomPosition() {
if (rowCount <= 0 || columnCount <= 0) { if (rowCount <= 0 || columnCount <= 0) {
throw new IllegalArgumentException("Les limites doivent être positives"); throw new IllegalArgumentException("Les limites doivent être positives");
......
...@@ -4,13 +4,12 @@ import util.Position; ...@@ -4,13 +4,12 @@ import util.Position;
import java.util.*; import java.util.*;
public class FireFighters implements ModelElement { public class FireFighters extends BoardMethods implements ModelElement {
private List<Position> fireFightersPositions; private List<Position> fireFightersPositions;
private int rowCount;
private int columnCount;
private final Random randomGenerator = new Random();
public FireFighters() { public FireFighters() {
} }
...@@ -25,11 +24,7 @@ public class FireFighters implements ModelElement { ...@@ -25,11 +24,7 @@ public class FireFighters implements ModelElement {
} }
/* public void initializeElements(int initialCount, int rowCount, int columnCount) {
this.rowCount=rowCount;
this.columnCount=columnCount;
initializeElements(initialCount);
}*/
public void initializeElements(int initialFirefighterCount, int rowCount, int columnCount) { public void initializeElements(int initialFirefighterCount, int rowCount, int columnCount) {
this.rowCount=rowCount; this.rowCount=rowCount;
...@@ -39,29 +34,22 @@ public class FireFighters implements ModelElement { ...@@ -39,29 +34,22 @@ public class FireFighters implements ModelElement {
fireFightersPositions.add(randomPosition()); fireFightersPositions.add(randomPosition());
} }
@Override
public Position randomPosition() {
if (rowCount <= 0 || columnCount <= 0) {
throw new IllegalArgumentException("Les limites doivent être positives");
}
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
}
private List<Position> neighbors(Position position) { public List<Position> updateFirefighters(Set<Position> firePositions, Montains mountains) {
List<Position> list = new ArrayList<>();
if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column()));
if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
return list;
}
public List<Position> updateFirefighters(Set<Position> firePositions) {
List<Position> result = new ArrayList<>(); List<Position> result = new ArrayList<>();
List<Position> firefighterNewPositions = new ArrayList<>(); List<Position> firefighterNewPositions = new ArrayList<>();
for (Position firefighterPosition : fireFightersPositions) { for (Position firefighterPosition : fireFightersPositions) {
Position newFirefighterPosition = neighborClosestToFire(firefighterPosition,firePositions); Position newFirefighterPosition = neighborClosestToFire(firefighterPosition,firePositions);
if (firefighterNewPositions.contains(newFirefighterPosition) || mountains.getMontainsPositions().contains(newFirefighterPosition)){
firefighterNewPositions.add(firefighterPosition);
extinguish(firefighterPosition, firePositions);
}
else {
firefighterNewPositions.add(newFirefighterPosition); firefighterNewPositions.add(newFirefighterPosition);
extinguish(newFirefighterPosition, firePositions); extinguish(newFirefighterPosition, firePositions);
}
result.add(firefighterPosition); result.add(firefighterPosition);
result.add(newFirefighterPosition); result.add(newFirefighterPosition);
List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream() List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
...@@ -74,29 +62,8 @@ public class FireFighters implements ModelElement { ...@@ -74,29 +62,8 @@ public class FireFighters implements ModelElement {
return result; return result;
} }
private void extinguish(Position position,Set<Position> firePositions ) {
firePositions.remove(position);
}
private Position neighborClosestToFire(Position position, Set<Position> firePositions) {
Set<Position> seen = new HashSet<>();
HashMap<Position, Position> firstMove = new HashMap<>();
Queue<Position> toVisit = new LinkedList<>(neighbors(position));
for (Position initialMove : toVisit)
firstMove.put(initialMove, initialMove);
while (!toVisit.isEmpty()) {
Position current = toVisit.poll();
if (firePositions.contains(current))
return firstMove.get(current);
for (Position adjacent : neighbors(current)) {
if (seen.contains(adjacent)) continue;
toVisit.add(adjacent);
seen.add(adjacent);
firstMove.put(adjacent, firstMove.get(current));
}
}
return position;
}
} }
...@@ -11,22 +11,25 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -11,22 +11,25 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
private final int initialFireCount; private final int initialFireCount;
private final int initialFirefighterCount; private final int initialFirefighterCount;
private final int initialCloudsCount; private final int initialCloudsCount;
private final int initialMorized_firefighterCount;
private final int initialMontainCount; private final int initialMontainCount;
private Fires fires; private Fires fires;
private FireFighters fireFighters; private FireFighters fireFighters;
private Cloud clouds; private Cloud clouds;
private Montains Montains; private Montains Montains;
private Motorized_Firefighter motorized_firefighter;
private int step = 0; private int step = 0;
public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainCount) { public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainCount,int initialMorized_firefighterCount) {
this.columnCount = columnCount; this.columnCount = columnCount;
this.rowCount = rowCount; this.rowCount = rowCount;
this.initialFireCount = initialFireCount; this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount; this.initialFirefighterCount = initialFirefighterCount;
this.initialCloudsCount = initialCloudsCount; this.initialCloudsCount = initialCloudsCount;
this.initialMontainCount = initialMontainCount; this.initialMontainCount = initialMontainCount;
this.initialMorized_firefighterCount = initialMorized_firefighterCount;
initializeElements(); initializeElements();
} }
...@@ -35,10 +38,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -35,10 +38,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
this.fireFighters = new FireFighters(); this.fireFighters = new FireFighters();
this.clouds = new Cloud(); this.clouds = new Cloud();
this.Montains = new Montains(); this.Montains = new Montains();
this.motorized_firefighter = new Motorized_Firefighter();
fires.initializeElements(initialFireCount,rowCount,columnCount); fires.initializeElements(initialFireCount,rowCount,columnCount);
fireFighters.initializeElements(initialFirefighterCount,rowCount,columnCount); fireFighters.initializeElements(initialFirefighterCount,rowCount,columnCount);
clouds.initializeElements(initialCloudsCount,rowCount, columnCount); clouds.initializeElements(initialCloudsCount,rowCount, columnCount);
Montains.initializeElements(initialMontainCount, rowCount,columnCount); Montains.initializeElements(initialMontainCount, rowCount,columnCount);
motorized_firefighter.initializeElements(initialMorized_firefighterCount,rowCount,columnCount);
} }
@Override @Override
...@@ -56,6 +61,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -56,6 +61,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
if (cloudsPositions.equals(position)) if (cloudsPositions.equals(position))
result.add(new Cloud()); result.add(new Cloud());
for(Position motorized_firefighter : motorized_firefighter.getMotorized_fireFightersPositions())
if (motorized_firefighter.equals(position))
result.add(new Motorized_Firefighter());
if(fires.getFirePositions().contains(position)) if(fires.getFirePositions().contains(position))
result.add(new Fires()); result.add(new Fires());
return result; return result;
...@@ -72,10 +81,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -72,10 +81,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
} }
public List<Position> updateToNextGeneration() { public List<Position> updateToNextGeneration() {
List<Position> result = fireFighters.updateFirefighters(fires.getFirePositions()); List<Position> result = fireFighters.updateFirefighters(fires.getFirePositions(),Montains);
result.addAll(fires.updateFires()); result.addAll(fires.updateFires(Montains));
if (!fires.getFirePositions().isEmpty()) { if (!fires.getFirePositions().isEmpty()) {
result.addAll(clouds.updateCouds(fires.getFirePositions())); result.addAll(clouds.updateCouds(fires.getFirePositions()));
result.addAll(motorized_firefighter.updateMotorized_firefighter(fires.getFirePositions(),Montains));
step++; step++;
fires.incrementStep(); fires.incrementStep();
} }
...@@ -119,6 +129,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -119,6 +129,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
if(element instanceof Montains){ if(element instanceof Montains){
Montains.add(position); Montains.add(position);
} }
if (element instanceof Motorized_Firefighter){
motorized_firefighter.add(position);
}
} }
} }
......
...@@ -22,12 +22,17 @@ public class Fires extends BoardMethods implements ModelElement { ...@@ -22,12 +22,17 @@ public class Fires extends BoardMethods implements ModelElement {
return firePositions; return firePositions;
} }
public List<Position> updateFires() { public List<Position> updateFires(Montains montains) {
List<Position> result = new ArrayList<>(); List<Position> result = new ArrayList<>();
if (step % 2 == 0) { if (step % 2 == 0) {
List<Position> newFirePositions = new ArrayList<>(); List<Position> newFirePositions = new ArrayList<>();
for (Position fire : firePositions) { for (Position fire : firePositions) {
newFirePositions.addAll(neighbors(fire, fire.row(), fire.column())); List<Position> neighborsOfFires = neighbors(fire);
for(Position neighbor : neighborsOfFires) {
if (!montains.getMontainsPositions().contains(neighbor)){
newFirePositions.add(neighbor);
}
}
} }
firePositions.addAll(newFirePositions); firePositions.addAll(newFirePositions);
result.addAll(newFirePositions); result.addAll(newFirePositions);
......
package model;
import util.Position;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class Motorized_Firefighter extends BoardMethods implements ModelElement {
private List<Position> Motorized_fireFightersPositions;
public Motorized_Firefighter() {
}
public void add(Position position){
Motorized_fireFightersPositions.add(position);
}
public List<Position> getMotorized_fireFightersPositions() {
return Motorized_fireFightersPositions;
}
public void initializeElements(int initialFirefighterCount, int rowCount, int columnCount) {
this.rowCount=rowCount;
this.columnCount=columnCount;
Motorized_fireFightersPositions = new ArrayList<>();
for (int index = 0; index < initialFirefighterCount; index++)
Motorized_fireFightersPositions.add(randomPosition());
}
public List<Position> updateMotorized_firefighter(Set<Position> firePositions, Montains mountains) {
List<Position> result = new ArrayList<>();
for (int i = 0; i < 2; i++) {
List<Position> firefighterNewPositions = new ArrayList<>();
for (Position firefighterPosition : Motorized_fireFightersPositions) {
Position newFirefighterPosition = neighborClosestToFire(firefighterPosition, firePositions);
if (firefighterNewPositions.contains(newFirefighterPosition) || mountains.getMontainsPositions().contains(newFirefighterPosition)) {
firefighterNewPositions.add(firefighterPosition);
extinguish(firefighterPosition, firePositions);
} else {
firefighterNewPositions.add(newFirefighterPosition);
extinguish(newFirefighterPosition, firePositions);
}
result.add(firefighterPosition);
result.add(newFirefighterPosition);
List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
.filter(firePositions::contains).toList();
for (Position firePosition : neighborFirePositions)
extinguish(firePosition, firePositions);
result.addAll(neighborFirePositions);
}
Motorized_fireFightersPositions = firefighterNewPositions;
}
return result;
}
}
package view;
import javafx.scene.paint.Color;
public class MOTORIZED_FIREFIGHTER implements ViewElement{
@Override
public Color getColor() {
return Color.BROWN;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment