diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index 8be93fae98fd8c3c21df08d6339858c661a20902..99663c3b3a8d152d1fa123db550d79421fd51c0d 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 37c6a8aeac22526aed03e11e7f498cc44e25cc69..04e212b1d7037487d524af5107a77093686928e8 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 0000000000000000000000000000000000000000..2c1323ac606fb4266cb5c97856b51f69a170787f --- /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 ae6f52ac49d53f37474a29beb8c1ffdf81ece152..98cee1b10366b21c9a83bb8853168cf11ce78d7d 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 90c1e6f3113f23662cb1fd81b6847d99451fb574..b0360d50d6fc21f14631a59d32e4e570f22a27b3 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 1b157b97efe0d216321a511a0c26c2cec5fca18f..e528cf8f3564635d125d1a24430b2af88ffa6666 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 46b10c13df1b87677385460cbb207b455385efec..68ce7fa79dfae85446b7df4bbe51056cf6bf5d5a 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 874881bba9c319ff64d5b631f6e17c925aacf479..883f13cfff6737bec1d4a3cba887fd8592c3537c 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 0000000000000000000000000000000000000000..00dacc5fd4a10b09510743853a91668ab135f44d --- /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 634423ecc762c904932a893e424a01d46da00a0d..8e2b5cbb6d14ff44e0c29ad5d05edca626c5015b 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 f66b7f3e3d70e9b368211ab09ccc71987196e6fc..228b1240405a9a32bc15491624072c23ae2801f4 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 eb56dad97d1663d90f48a544764413b9dcc802d4..83c41b0de851064bf61086f8828bf0365d4a77a9 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 efd19f59e56d0e7eb260decf7aff96d2090794fa..1cd146fd646dc11895e09064cab733de2e93c73e 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 b2f55e41a633b41236a1b9cbfdeacc444ecf5020..d01bc1fa83df86d247422304865f7a1252c5e080 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 0000000000000000000000000000000000000000..cc8c25c92bd681b4aaec92983c95fcfac5fc720e --- /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; + } +}