diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index 3c796977333c8a1c7c907f059e4e0161c3f6901e..8be93fae98fd8c3c21df08d6339858c661a20902 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -21,6 +21,8 @@ public class SimulatorApplication extends javafx.application.Application { public static final int INITIAL_FIREFIGHTER_COUNT = 6; 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; + private Stage primaryStage; private Parent view; @@ -46,7 +48,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_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MONTAIN_COUNT,INITIAL_MOTORIZED_FIREFIGHTER_COUNT); } private void showScene() { diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 4d0ca769ec200c76646912b22028fc4bca05bf60..37c6a8aeac22526aed03e11e7f498cc44e25cc69 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -94,6 +94,9 @@ public class Controller { if(model instanceof Montains){ return new MONTAINS(); } + if(model instanceof Motorized_Firefighter){ + return new MOTORIZED_FIREFIGHTER(); + } } @@ -133,9 +136,9 @@ public class Controller { } 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); - this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount,initialCloudsCount, initialMontainsCount)); + this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount,initialCloudsCount, initialMontainsCount,initialMorized_firefighterCount)); repaintGrid(); } diff --git a/src/main/java/model/BoardMethods.java b/src/main/java/model/BoardMethods.java index 9ddf81196593f40de66fbb5b22336aff40e70962..10a0ca2b0f3f9f2fe4f2643540e25371323ba088 100644 --- a/src/main/java/model/BoardMethods.java +++ b/src/main/java/model/BoardMethods.java @@ -2,10 +2,7 @@ package model; import util.Position; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.Set; +import java.util.*; public class BoardMethods { int columnCount; @@ -17,7 +14,7 @@ public class BoardMethods { firPositions.remove(position); } - public List<Position> neighbors(Position position, int rowCount, int columnCount) { + public List<Position> neighbors(Position position) { 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)); @@ -26,6 +23,26 @@ public class BoardMethods { 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() { if (rowCount <= 0 || columnCount <= 0) { throw new IllegalArgumentException("Les limites doivent ĂȘtre positives"); diff --git a/src/main/java/model/FireFighters.java b/src/main/java/model/FireFighters.java index 68127388fceecd8d42e1f9afa1e908c72b80db72..ae6f52ac49d53f37474a29beb8c1ffdf81ece152 100644 --- a/src/main/java/model/FireFighters.java +++ b/src/main/java/model/FireFighters.java @@ -4,13 +4,12 @@ import util.Position; import java.util.*; -public class FireFighters implements ModelElement { +public class FireFighters extends BoardMethods implements ModelElement { private List<Position> fireFightersPositions; - private int rowCount; - private int columnCount; - private final Random randomGenerator = new Random(); + + public FireFighters() { } @@ -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) { this.rowCount=rowCount; @@ -39,29 +34,22 @@ public class FireFighters implements ModelElement { 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) { - 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) { + + public List<Position> updateFirefighters(Set<Position> firePositions, Montains mountains) { List<Position> result = new ArrayList<>(); List<Position> firefighterNewPositions = new ArrayList<>(); for (Position firefighterPosition : fireFightersPositions) { Position newFirefighterPosition = neighborClosestToFire(firefighterPosition,firePositions); - firefighterNewPositions.add(newFirefighterPosition); - extinguish(newFirefighterPosition, 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() @@ -74,29 +62,8 @@ public class FireFighters implements ModelElement { 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; - } + } diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 7022bd7f68b1570ced0f3fbe5e9a8cf67f50edca..90c1e6f3113f23662cb1fd81b6847d99451fb574 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -11,22 +11,25 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int initialFireCount; private final int initialFirefighterCount; private final int initialCloudsCount; + private final int initialMorized_firefighterCount; private final int initialMontainCount; private Fires fires; private FireFighters fireFighters; private Cloud clouds; private Montains Montains; + private Motorized_Firefighter motorized_firefighter; 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.rowCount = rowCount; this.initialFireCount = initialFireCount; this.initialFirefighterCount = initialFirefighterCount; this.initialCloudsCount = initialCloudsCount; this.initialMontainCount = initialMontainCount; + this.initialMorized_firefighterCount = initialMorized_firefighterCount; initializeElements(); } @@ -35,10 +38,12 @@ public class FirefighterBoard implements Board<List<ModelElement>> { this.fireFighters = new FireFighters(); this.clouds = new Cloud(); this.Montains = new Montains(); + this.motorized_firefighter = new Motorized_Firefighter(); 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); } @Override @@ -56,6 +61,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> { if (cloudsPositions.equals(position)) 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)) result.add(new Fires()); return result; @@ -72,10 +81,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } public List<Position> updateToNextGeneration() { - List<Position> result = fireFighters.updateFirefighters(fires.getFirePositions()); - result.addAll(fires.updateFires()); + List<Position> result = fireFighters.updateFirefighters(fires.getFirePositions(),Montains); + result.addAll(fires.updateFires(Montains)); if (!fires.getFirePositions().isEmpty()) { result.addAll(clouds.updateCouds(fires.getFirePositions())); + result.addAll(motorized_firefighter.updateMotorized_firefighter(fires.getFirePositions(),Montains)); step++; fires.incrementStep(); } @@ -119,6 +129,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> { if(element instanceof Montains){ Montains.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 5ee1f2286b619f66debce4b4ee772183ae6c59ed..1b157b97efe0d216321a511a0c26c2cec5fca18f 100644 --- a/src/main/java/model/Fires.java +++ b/src/main/java/model/Fires.java @@ -22,12 +22,17 @@ public class Fires extends BoardMethods implements ModelElement { return firePositions; } - public List<Position> updateFires() { + public List<Position> updateFires(Montains montains) { List<Position> result = new ArrayList<>(); if (step % 2 == 0) { List<Position> newFirePositions = new ArrayList<>(); 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); result.addAll(newFirePositions); diff --git a/src/main/java/model/Motorized_Firefighter.java b/src/main/java/model/Motorized_Firefighter.java new file mode 100644 index 0000000000000000000000000000000000000000..874881bba9c319ff64d5b631f6e17c925aacf479 --- /dev/null +++ b/src/main/java/model/Motorized_Firefighter.java @@ -0,0 +1,67 @@ +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; + } + + +} diff --git a/src/main/java/view/MOTORIZED_FIREFIGHTER.java b/src/main/java/view/MOTORIZED_FIREFIGHTER.java new file mode 100644 index 0000000000000000000000000000000000000000..efd19f59e56d0e7eb260decf7aff96d2090794fa --- /dev/null +++ b/src/main/java/view/MOTORIZED_FIREFIGHTER.java @@ -0,0 +1,10 @@ +package view; + +import javafx.scene.paint.Color; + +public class MOTORIZED_FIREFIGHTER implements ViewElement{ + @Override + public Color getColor() { + return Color.BROWN; + } +}