From eba8bac7d1657848a646c0f76ce8fd921ccaedca Mon Sep 17 00:00:00 2001 From: Youssouf <ali-moussa.YOUSSOUF@etu.univ-amu.fr> Date: Thu, 30 Nov 2023 08:56:57 +0100 Subject: [PATCH] implementations des routes avec ses methodes . --- src/main/java/app/SimulatorApplication.java | 4 +- src/main/java/controller/Controller.java | 16 +++++- src/main/java/model/AbstractFighter.java | 57 +++++++++++++++++++ src/main/java/model/FireFighters.java | 7 ++- src/main/java/model/FirefighterBoard.java | 29 +++++++--- src/main/java/model/Fires.java | 11 ++-- src/main/java/model/Montains.java | 37 ++++++++---- .../java/model/Motorized_Firefighter.java | 14 ++++- src/main/java/model/Roads.java | 48 ++++++++++++++++ src/main/java/view/{ => Element}/EMPTY.java | 3 +- src/main/java/view/{ => Element}/FIRE.java | 3 +- .../java/view/{ => Fighters}/FIREFIGHTER.java | 3 +- .../{ => Fighters}/MOTORIZED_FIREFIGHTER.java | 5 +- .../java/view/{ => Obstacles}/MONTAINS.java | 5 +- src/main/java/view/Obstacles/ROADS.java | 11 ++++ 15 files changed, 215 insertions(+), 38 deletions(-) create mode 100644 src/main/java/model/AbstractFighter.java create mode 100644 src/main/java/model/Roads.java rename src/main/java/view/{ => Element}/EMPTY.java (77%) rename src/main/java/view/{ => Element}/FIRE.java (76%) rename src/main/java/view/{ => Fighters}/FIREFIGHTER.java (77%) rename src/main/java/view/{ => Fighters}/MOTORIZED_FIREFIGHTER.java (51%) rename src/main/java/view/{ => Obstacles}/MONTAINS.java (62%) create mode 100644 src/main/java/view/Obstacles/ROADS.java diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index 8be93fa..99663c3 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -22,6 +22,8 @@ public class SimulatorApplication extends javafx.application.Application { public static final int INITIAL_CLOUD_COUNT = 6; public static final int INITIAL_MONTAIN_COUNT = 4; public static final int INITIAL_MOTORIZED_FIREFIGHTER_COUNT = 4; + public static final int INITIAL_ROAD_COUNT = 2; + private Stage primaryStage; @@ -48,7 +50,7 @@ public class SimulatorApplication extends javafx.application.Application { view = loader.load(); Controller controller = loader.getController(); controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT, - INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MONTAIN_COUNT,INITIAL_MOTORIZED_FIREFIGHTER_COUNT); + INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MONTAIN_COUNT,INITIAL_MOTORIZED_FIREFIGHTER_COUNT,INITIAL_ROAD_COUNT); } private void showScene() { diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 37c6a8a..04e212b 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -15,6 +15,12 @@ import javafx.util.Pair; import model.*; import util.Position; import view.*; +import view.Element.EMPTY; +import view.Element.FIRE; +import view.Fighters.FIREFIGHTER; +import view.Fighters.MOTORIZED_FIREFIGHTER; +import view.Obstacles.MONTAINS; +import view.Obstacles.ROADS; import java.util.ArrayList; import java.util.List; @@ -98,6 +104,12 @@ public class Controller { return new MOTORIZED_FIREFIGHTER(); } + if(model instanceof Roads){ + return new ROADS(); + } + + + } return new EMPTY(); @@ -136,9 +148,9 @@ public class Controller { } public void initialize(int squareWidth, int squareHeight, int columnCount, - int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainsCount,int initialMorized_firefighterCount) { + int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainsCount,int initialMorized_firefighterCount,int initialRoadsCount) { grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); - this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount,initialCloudsCount, initialMontainsCount,initialMorized_firefighterCount)); + this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount,initialCloudsCount, initialMontainsCount,initialMorized_firefighterCount,initialRoadsCount)); repaintGrid(); } diff --git a/src/main/java/model/AbstractFighter.java b/src/main/java/model/AbstractFighter.java new file mode 100644 index 0000000..2c1323a --- /dev/null +++ b/src/main/java/model/AbstractFighter.java @@ -0,0 +1,57 @@ +package model; + +import util.Position; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public abstract class AbstractFighter extends BoardMethods implements ModelElement { + private List<Position> fighterPositions; + + + public void add(Position position) { + fighterPositions.add(position); + } + + public List<Position> getFighterPositions() { + return fighterPositions; + } + + + public void initializeElements(int initialfighterCount, int rowCount, int columnCount) { + this.rowCount = rowCount; + this.columnCount = columnCount; + fighterPositions = new ArrayList<>(); + for (int index = 0; index < initialfighterCount; index++) + fighterPositions.add(randomPosition()); + } + + + public List<Position> updatefighters(Set<Position> firePositions, Montains montains) { + List<Position> result = new ArrayList<>(); + List<Position> firefighterNewPositions = new ArrayList<>(); + for (Position firefighterPosition : fighterPositions) { + Position newFirefighterPosition = neighborClosestToFire(firefighterPosition, firePositions); + + if (firefighterNewPositions.contains(newFirefighterPosition) || montains.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); + } + fighterPositions = firefighterNewPositions; + + return result; + } + +} diff --git a/src/main/java/model/FireFighters.java b/src/main/java/model/FireFighters.java index ae6f52a..98cee1b 100644 --- a/src/main/java/model/FireFighters.java +++ b/src/main/java/model/FireFighters.java @@ -4,9 +4,9 @@ import util.Position; import java.util.*; -public class FireFighters extends BoardMethods implements ModelElement { +public class FireFighters extends AbstractFighter implements ModelElement { - private List<Position> fireFightersPositions; + /* private List<Position> fireFightersPositions; @@ -61,6 +61,9 @@ public class FireFighters extends BoardMethods implements ModelElement { fireFightersPositions = firefighterNewPositions; return result; } + */ + public FireFighters() { + } diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 90c1e6f..b0360d5 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -12,6 +12,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int initialFirefighterCount; private final int initialCloudsCount; private final int initialMorized_firefighterCount; + private final int initialRoadsCount; private final int initialMontainCount; private Fires fires; @@ -19,10 +20,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private Cloud clouds; private Montains Montains; private Motorized_Firefighter motorized_firefighter; + private Roads roads; private int step = 0; - public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainCount,int initialMorized_firefighterCount) { + public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudsCount, int initialMontainCount,int initialMorized_firefighterCount,int initialRoadsCount) { this.columnCount = columnCount; this.rowCount = rowCount; this.initialFireCount = initialFireCount; @@ -30,6 +32,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { this.initialCloudsCount = initialCloudsCount; this.initialMontainCount = initialMontainCount; this.initialMorized_firefighterCount = initialMorized_firefighterCount; + this.initialRoadsCount = initialRoadsCount; initializeElements(); } @@ -39,17 +42,19 @@ public class FirefighterBoard implements Board<List<ModelElement>> { this.clouds = new Cloud(); this.Montains = new Montains(); this.motorized_firefighter = new Motorized_Firefighter(); + this.roads = new Roads(); fires.initializeElements(initialFireCount,rowCount,columnCount); fireFighters.initializeElements(initialFirefighterCount,rowCount,columnCount); clouds.initializeElements(initialCloudsCount,rowCount, columnCount); Montains.initializeElements(initialMontainCount, rowCount,columnCount); motorized_firefighter.initializeElements(initialMorized_firefighterCount,rowCount,columnCount); + roads.initializeElements(initialRoadsCount,rowCount,columnCount); } @Override public List<ModelElement> getState(Position position) { List<ModelElement> result = new ArrayList<>(); - for(Position firefighterPosition : fireFighters.getFireFightersPositions()) + for(Position firefighterPosition : fireFighters.getFighterPositions()) if (firefighterPosition.equals(position)) result.add(new FireFighters()); @@ -61,10 +66,16 @@ public class FirefighterBoard implements Board<List<ModelElement>> { if (cloudsPositions.equals(position)) result.add(new Cloud()); - for(Position motorized_firefighter : motorized_firefighter.getMotorized_fireFightersPositions()) + for(Position motorized_firefighter : motorized_firefighter.getFighterPositions()) if (motorized_firefighter.equals(position)) result.add(new Motorized_Firefighter()); + for(Position motorized_firefighter : roads.getRoadsPositions()) + if (motorized_firefighter.equals(position)) + result.add(new Roads()); + + + if(fires.getFirePositions().contains(position)) result.add(new Fires()); return result; @@ -81,11 +92,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } public List<Position> updateToNextGeneration() { - List<Position> result = fireFighters.updateFirefighters(fires.getFirePositions(),Montains); - result.addAll(fires.updateFires(Montains)); + List<Position> result = fireFighters.updatefighters(fires.getFirePositions(),Montains); + result.addAll(fires.updateFires(Montains,roads)); if (!fires.getFirePositions().isEmpty()) { result.addAll(clouds.updateCouds(fires.getFirePositions())); - result.addAll(motorized_firefighter.updateMotorized_firefighter(fires.getFirePositions(),Montains)); + result.addAll(motorized_firefighter.updateMotorizedFirefighters(fires.getFirePositions(),Montains)); step++; fires.incrementStep(); } @@ -112,7 +123,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { public void setState(List<ModelElement> state, Position position) { //fires.extinguish(position); for (;;) { - if (!fireFighters.getFireFightersPositions().remove(position)) break; + if (!fireFighters.getFighterPositions().remove(position)) break; } for(ModelElement element : state){ @@ -129,6 +140,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> { if(element instanceof Montains){ Montains.add(position); } + + if(element instanceof Roads){ + roads.add(position); + } if (element instanceof Motorized_Firefighter){ motorized_firefighter.add(position); } diff --git a/src/main/java/model/Fires.java b/src/main/java/model/Fires.java index 1b157b9..e528cf8 100644 --- a/src/main/java/model/Fires.java +++ b/src/main/java/model/Fires.java @@ -22,16 +22,15 @@ public class Fires extends BoardMethods implements ModelElement { return firePositions; } - public List<Position> updateFires(Montains montains) { + public List<Position> updateFires(Montains montains, Roads roads) { List<Position> result = new ArrayList<>(); if (step % 2 == 0) { List<Position> newFirePositions = new ArrayList<>(); for (Position fire : firePositions) { - List<Position> neighborsOfFires = neighbors(fire); - for(Position neighbor : neighborsOfFires) { - if (!montains.getMontainsPositions().contains(neighbor)){ - newFirePositions.add(neighbor); - } + List<Position> neighbors= neighbors(fire); + for (Position position : neighbors){ + if(!montains.getMontainsPositions().contains(position) || !roads.getRoadsPositions().contains(position)) + newFirePositions.add(position); } } firePositions.addAll(newFirePositions); diff --git a/src/main/java/model/Montains.java b/src/main/java/model/Montains.java index 46b10c1..68ce7fa 100644 --- a/src/main/java/model/Montains.java +++ b/src/main/java/model/Montains.java @@ -6,7 +6,7 @@ import java.util.*; public class Montains extends BoardMethods implements ModelElement { - private Set<Position> MontainsPositions; + private List<Position> MontainsPositions; public Montains() { @@ -16,28 +16,43 @@ public class Montains extends BoardMethods implements ModelElement { MontainsPositions.add(newPositions); } - public Set<Position> getMontainsPositions() { + public List<Position> getMontainsPositions() { return MontainsPositions; } - - - - public void initializeElements(int initialFireCount, int rowCount, int columnCount) { - this.columnCount = columnCount; + public void initializeElements(int initialMontainsCount, int rowCount, int columnCount) { this.rowCount = rowCount; - MontainsPositions = new HashSet<>(); - for (int index = 0; index < initialFireCount; index++) - MontainsPositions.add(randomPosition()); + this.columnCount = columnCount; + MontainsPositions = new ArrayList<>(); + + for (int index = 0; index < initialMontainsCount; index++) { + Position blockStart = randomPosition(); + int blockSize = 3; + for (int rowOffset = 0; rowOffset < blockSize; rowOffset++) { + for (int colOffset = 0; colOffset < blockSize; colOffset++) { + // Ajoutez chaque position du bloc à la liste des positions des montagnes + int newRow = (blockStart.row() + rowOffset) % rowCount; + int newCol = (blockStart.column() + colOffset) % columnCount; + + // Assurez-vous que les résultats sont positifs + newRow = (newRow + rowCount) % rowCount; + newCol = (newCol + columnCount) % columnCount; + + MontainsPositions.add(new Position(newRow, newCol)); + } + } + } } +} + + -} diff --git a/src/main/java/model/Motorized_Firefighter.java b/src/main/java/model/Motorized_Firefighter.java index 874881b..883f13c 100644 --- a/src/main/java/model/Motorized_Firefighter.java +++ b/src/main/java/model/Motorized_Firefighter.java @@ -6,8 +6,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -public class Motorized_Firefighter extends BoardMethods implements ModelElement { - +public class Motorized_Firefighter extends AbstractFighter { +/* private List<Position> Motorized_fireFightersPositions; public Motorized_Firefighter() { @@ -62,6 +62,16 @@ public class Motorized_Firefighter extends BoardMethods implements ModelElement } return result; } + */ + + public List<Position> updateMotorizedFirefighters(Set<Position> firePositions, Montains montains) { + List<Position> result = new ArrayList<>(); + for (int i = 0; i < 2; i++) { + result.addAll(super.updatefighters(firePositions, montains)); + } + return result; + } + } diff --git a/src/main/java/model/Roads.java b/src/main/java/model/Roads.java new file mode 100644 index 0000000..00dacc5 --- /dev/null +++ b/src/main/java/model/Roads.java @@ -0,0 +1,48 @@ +package model; + +import model.BoardMethods; +import model.ModelElement; +import util.Position; + +import java.util.ArrayList; +import java.util.List; + +public class Roads extends BoardMethods implements ModelElement { + private List<Position> roadsPositions; + + public Roads() { + } + + public void add(Position position){ + roadsPositions.add(position); + } + public List<Position> getRoadsPositions() { + return roadsPositions; + } + + + + + public void initializeElements(int initialRoadsCount, int rowCount, int columnCount) { + this.rowCount = rowCount; + this.columnCount = columnCount; + roadsPositions = new ArrayList<>(); + + for (int index = 0; index < initialRoadsCount; index++) { + // Choisir une position aléatoire pour le coin supérieur gauche du bloc + Position blockStart = randomPosition(); + + // Définir la taille du bloc (5x5, par exemple) + int blockSize = 6; + + for (int rowOffset = 0; rowOffset < blockSize; rowOffset++) { + for (int colOffset = 0; colOffset < 2; colOffset++) { + // Ajoutez chaque position du bloc à la liste des positions des montagnes + int newRow = (blockStart.row() + rowOffset) % rowCount; + int newCol = (blockStart.column() + colOffset) % columnCount; + roadsPositions.add(new Position(newRow, newCol)); + } + } + } + } +} diff --git a/src/main/java/view/EMPTY.java b/src/main/java/view/Element/EMPTY.java similarity index 77% rename from src/main/java/view/EMPTY.java rename to src/main/java/view/Element/EMPTY.java index 634423e..8e2b5cb 100644 --- a/src/main/java/view/EMPTY.java +++ b/src/main/java/view/Element/EMPTY.java @@ -1,6 +1,7 @@ -package view; +package view.Element; import javafx.scene.paint.Color; +import view.ViewElement; public class EMPTY implements ViewElement { @Override diff --git a/src/main/java/view/FIRE.java b/src/main/java/view/Element/FIRE.java similarity index 76% rename from src/main/java/view/FIRE.java rename to src/main/java/view/Element/FIRE.java index f66b7f3..228b124 100644 --- a/src/main/java/view/FIRE.java +++ b/src/main/java/view/Element/FIRE.java @@ -1,6 +1,7 @@ -package view; +package view.Element; import javafx.scene.paint.Color; +import view.ViewElement; public class FIRE implements ViewElement { @Override diff --git a/src/main/java/view/FIREFIGHTER.java b/src/main/java/view/Fighters/FIREFIGHTER.java similarity index 77% rename from src/main/java/view/FIREFIGHTER.java rename to src/main/java/view/Fighters/FIREFIGHTER.java index eb56dad..83c41b0 100644 --- a/src/main/java/view/FIREFIGHTER.java +++ b/src/main/java/view/Fighters/FIREFIGHTER.java @@ -1,6 +1,7 @@ -package view; +package view.Fighters; import javafx.scene.paint.Color; +import view.ViewElement; public class FIREFIGHTER implements ViewElement { @Override diff --git a/src/main/java/view/MOTORIZED_FIREFIGHTER.java b/src/main/java/view/Fighters/MOTORIZED_FIREFIGHTER.java similarity index 51% rename from src/main/java/view/MOTORIZED_FIREFIGHTER.java rename to src/main/java/view/Fighters/MOTORIZED_FIREFIGHTER.java index efd19f5..1cd146f 100644 --- a/src/main/java/view/MOTORIZED_FIREFIGHTER.java +++ b/src/main/java/view/Fighters/MOTORIZED_FIREFIGHTER.java @@ -1,8 +1,9 @@ -package view; +package view.Fighters; import javafx.scene.paint.Color; +import view.ViewElement; -public class MOTORIZED_FIREFIGHTER implements ViewElement{ +public class MOTORIZED_FIREFIGHTER implements ViewElement { @Override public Color getColor() { return Color.BROWN; diff --git a/src/main/java/view/MONTAINS.java b/src/main/java/view/Obstacles/MONTAINS.java similarity index 62% rename from src/main/java/view/MONTAINS.java rename to src/main/java/view/Obstacles/MONTAINS.java index b2f55e4..d01bc1f 100644 --- a/src/main/java/view/MONTAINS.java +++ b/src/main/java/view/Obstacles/MONTAINS.java @@ -1,10 +1,11 @@ -package view; +package view.Obstacles; import javafx.scene.paint.Color; +import view.ViewElement; public class MONTAINS implements ViewElement { @Override public Color getColor() { - return Color.BLACK; + return Color.DARKCYAN; } } diff --git a/src/main/java/view/Obstacles/ROADS.java b/src/main/java/view/Obstacles/ROADS.java new file mode 100644 index 0000000..cc8c25c --- /dev/null +++ b/src/main/java/view/Obstacles/ROADS.java @@ -0,0 +1,11 @@ +package view.Obstacles; + +import javafx.scene.paint.Color; +import view.ViewElement; + +public class ROADS implements ViewElement { + @Override + public Color getColor() { + return Color.CORAL; + } +} -- GitLab