From 22c131e8ecd46a05b9b1ddf09ef15d0a752fd2c0 Mon Sep 17 00:00:00 2001 From: hadiz <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr> Date: Fri, 8 Nov 2024 11:27:59 +0100 Subject: [PATCH 1/6] FirefighterBoard correction --- src/main/java/model/FirefighterBoard.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index c0bd67c..30376bf 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -10,7 +10,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int rowCount; private final int initialFireCount; private final int initialFirefighterCount; - private final TargetStrategy targetStrategy = new TargetStrategy(); + private final model.TargetStrategy targetStrategy = new model.TargetStrategy(); private List<Position> firefighterPositions; private Set<Position> firePositions; private Map<Position, List<Position>> neighbors = new HashMap(); -- GitLab From 87f62bbedadbce5f3d5160c042cb60d61c8c0d92 Mon Sep 17 00:00:00 2001 From: hadiz <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr> Date: Fri, 8 Nov 2024 12:05:45 +0100 Subject: [PATCH 2/6] Firefighter --- src/main/java/model/Firefighter.java | 45 ++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/model/Firefighter.java diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java new file mode 100644 index 0000000..5d08fa2 --- /dev/null +++ b/src/main/java/model/Firefighter.java @@ -0,0 +1,45 @@ +package model; + +import util.Position; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Cette classe est responsable des actions des pompiers : se déplacer vers le feu + * le plus proche et éteindre les feux voisins + * + */ + +public class Firefighter { + private Position position; + private final model.TargetStrategy targetStrategy; + + public Firefighter(Position position, model.TargetStrategy targetStrategy){ + this.position = position; + this.targetStrategy = targetStrategy; + } + + public Position getPosition(){ + return position; + } + + public void moveTowardsFire(Set<Position> firePositions, Map<Position, List<Position>> neighbors){ + Position newPosition = targetStrategy.neighborClosestToFire(position, firePositions, neighbors); + if (newPosition != null){ + this.position = newPosition; + } + } + + public void extinguishFiresAround(Set<Position> firePositions, Map<Position, List<Position>> neighbors) { + // Éteint le feu à la position actuelle du pompier, s'il y en a un + firePositions.remove(position); + + // Éteint les feux dans les positions adjacentes + List<Position> adjacentPositions = neighbors.get(position); + for (Position neighbor : adjacentPositions) { + firePositions.remove(neighbor); + } + } +} -- GitLab From 6ab4faab3ed2aab3b49e01cb7a5314c80a5d14ec Mon Sep 17 00:00:00 2001 From: BACHIR ABDOU <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr> Date: Tue, 19 Nov 2024 11:07:48 +0100 Subject: [PATCH 3/6] Modification de Firefighter : ajout de setter --- src/main/java/model/Firefighter.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java index 5d08fa2..65fc321 100644 --- a/src/main/java/model/Firefighter.java +++ b/src/main/java/model/Firefighter.java @@ -12,9 +12,9 @@ import java.util.Set; * */ -public class Firefighter { +public abstract class Firefighter { private Position position; - private final model.TargetStrategy targetStrategy; + final model.TargetStrategy targetStrategy; public Firefighter(Position position, model.TargetStrategy targetStrategy){ this.position = position; @@ -25,6 +25,10 @@ public class Firefighter { return position; } + public void setPosition(Position position){ + this.position = position; + } + public void moveTowardsFire(Set<Position> firePositions, Map<Position, List<Position>> neighbors){ Position newPosition = targetStrategy.neighborClosestToFire(position, firePositions, neighbors); if (newPosition != null){ -- GitLab From 79ca5fcce7a2c2e5b450fb3cc015bd2bc0669de4 Mon Sep 17 00:00:00 2001 From: BACHIR ABDOU <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr> Date: Tue, 19 Nov 2024 11:08:33 +0100 Subject: [PATCH 4/6] =?UTF-8?q?Pompiers=20motoris=C3=A9s=20:=20MotorizedFi?= =?UTF-8?q?reFighter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/MotorizedFireFighter.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/model/MotorizedFireFighter.java diff --git a/src/main/java/model/MotorizedFireFighter.java b/src/main/java/model/MotorizedFireFighter.java new file mode 100644 index 0000000..e96749a --- /dev/null +++ b/src/main/java/model/MotorizedFireFighter.java @@ -0,0 +1,34 @@ +package model; + +import util.Position; + + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class MotorizedFireFighter extends Firefighter{ + + public MotorizedFireFighter(Position position, model.TargetStrategy targetStrategy) { + super(position, targetStrategy); + } + + @Override + public void moveTowardsFire(Set<Position> firePositions, Map<Position, List<Position>> neighbors) { + Position current = getPosition(); + + //Premier mouvement + Position firstMove = targetStrategy.neighborClosestToFire(current, firePositions, neighbors); + if (firstMove != null) { + current = firstMove; + } + + //DEuxieme mouvement + Position secondMove = targetStrategy.neighborClosestToFire(current, firePositions, neighbors); + if (secondMove != null) { + current = secondMove; + } + + setPosition(current); + } +} -- GitLab From efbad21fcd8801496c5cdfd8b5375552465c77ec Mon Sep 17 00:00:00 2001 From: hadiz <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr> Date: Fri, 22 Nov 2024 11:41:45 +0100 Subject: [PATCH 5/6] =?UTF-8?q?Affichage=20des=20pompiers=20motoris=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/Controller.java | 29 +++---- src/main/java/model/Firefighter.java | 2 +- src/main/java/model/FirefighterBoard.java | 99 ++++++++++++++++++----- src/main/java/model/ModelElement.java | 2 +- src/main/java/view/ViewElement.java | 2 +- 5 files changed, 97 insertions(+), 37 deletions(-) diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 2a60897..0c6251b 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -49,7 +49,7 @@ public class Controller { } private void initializePlayAndPauseToggleButtons() { - ToggleGroup toggleGroup = new PersistentToggleGroup(); + ToggleGroup toggleGroup = new ToggleGroup(); toggleGroup.getToggles().addAll(playToggleButton, pauseToggleButton); pauseToggleButton.setSelected(true); } @@ -58,10 +58,10 @@ public class Controller { this.board = requireNonNull(firefighterBoard, "firefighter.model is null"); } - private void updateBoard(){ + private void updateBoard() { List<Position> updatedPositions = board.updateToNextGeneration(); List<Pair<Position, ViewElement>> updatedSquares = new ArrayList<>(); - for(Position updatedPosition : updatedPositions){ + for (Position updatedPosition : updatedPositions) { List<ModelElement> squareState = board.getState(updatedPosition); ViewElement viewElement = getViewElement(squareState); updatedSquares.add(new Pair<>(updatedPosition, viewElement)); @@ -70,22 +70,25 @@ public class Controller { updateGenerationLabel(board.stepNumber()); } - private void repaintGrid(){ + private void repaintGrid() { int columnCount = board.columnCount(); int rowCount = board.rowCount(); ViewElement[][] viewElements = new ViewElement[rowCount][columnCount]; - for(int column = 0; column < columnCount; column++) - for(int row = 0; row < rowCount; row++) + for (int column = 0; column < columnCount; column++) + for (int row = 0; row < rowCount; row++) viewElements[row][column] = getViewElement(board.getState(new Position(row, column))); grid.repaint(viewElements); updateGenerationLabel(board.stepNumber()); } private ViewElement getViewElement(List<ModelElement> squareState) { - if(squareState.contains(ModelElement.FIREFIGHTER)){ + if (squareState.contains(ModelElement.MOTORIZED_FIREFIGHTER)) { + return ViewElement.MOTORIZED_FIREFIGHTER; + } + if (squareState.contains(ModelElement.FIREFIGHTER)) { return ViewElement.FIREFIGHTER; } - if (squareState.contains(ModelElement.FIRE)){ + if (squareState.contains(ModelElement.FIRE)) { return ViewElement.FIRE; } return ViewElement.EMPTY; @@ -93,8 +96,7 @@ public class Controller { private void initializeTimeline() { Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS); - EventHandler<ActionEvent> eventHandler = - event -> updateBoard(); + EventHandler<ActionEvent> eventHandler = event -> updateBoard(); KeyFrame keyFrame = new KeyFrame(duration, eventHandler); timeline = new Timeline(keyFrame); timeline.setCycleCount(Animation.INDEFINITE); @@ -123,8 +125,7 @@ public class Controller { repaintGrid(); } - public void initialize(int squareWidth, int squareHeight, int columnCount, - int rowCount, int initialFireCount, int initialFirefighterCount) { + public void initialize(int squareWidth, int squareHeight, int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount)); repaintGrid(); @@ -135,7 +136,7 @@ public class Controller { updateBoard(); } - private void updateGenerationLabel(int value){ + private void updateGenerationLabel(int value) { generationNumberLabel.setText(Integer.toString(value)); } -} \ No newline at end of file +} diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java index 65fc321..6ecfbfd 100644 --- a/src/main/java/model/Firefighter.java +++ b/src/main/java/model/Firefighter.java @@ -12,7 +12,7 @@ import java.util.Set; * */ -public abstract class Firefighter { +public class Firefighter { private Position position; final model.TargetStrategy targetStrategy; diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 30376bf..1b2859c 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 model.TargetStrategy targetStrategy = new model.TargetStrategy(); private List<Position> firefighterPositions; + private List<Firefighter> firefighters; private Set<Position> firePositions; private Map<Position, List<Position>> neighbors = new HashMap(); private final Position[][] positions; @@ -22,6 +23,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { this.columnCount = columnCount; this.rowCount = rowCount; this.positions = new Position[rowCount][columnCount]; + this.firefighters = new ArrayList<>(); for (int column = 0; column < columnCount; column++) for (int row = 0; row < rowCount; row++) positions[row][column] = new Position(row, column); @@ -42,10 +44,24 @@ public class FirefighterBoard implements Board<List<ModelElement>> { 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()); + + int motorizedCount = initialFirefighterCount / 2; + + for (int i = 0; i < motorizedCount; i++) { + MotorizedFireFighter motorizedFireFighter = new MotorizedFireFighter(randomPosition(), targetStrategy); + firefighters.add(motorizedFireFighter); + firefighterPositions.add(motorizedFireFighter.getPosition()); + } + + // Initialisation des pompiers réguliers + for (int i = 0; i < initialFirefighterCount - motorizedCount; i++) { + Firefighter firefighter = new Firefighter(randomPosition(), targetStrategy); + firefighters.add(firefighter); + firefighterPositions.add(firefighter.getPosition()); + } } private Position randomPosition() { @@ -55,14 +71,24 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @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)) + + // Vérifie le type de chaque pompier + for (Firefighter firefighter : firefighters) { + if (firefighter.getPosition().equals(position)) { + if (firefighter instanceof MotorizedFireFighter) { + result.add(ModelElement.MOTORIZED_FIREFIGHTER); + } else { + result.add(ModelElement.FIREFIGHTER); + } + } + } + if (firePositions.contains(position)) { result.add(ModelElement.FIRE); + } return result; } + @Override public int rowCount() { return rowCount; @@ -100,24 +126,50 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } private List<Position> updateFirefighters() { - List<Position> modifiedPosition = new ArrayList<>(); + List<Position> modifiedPositions = new ArrayList<>(); List<Position> firefighterNewPositions = new ArrayList<>(); - for (Position firefighterPosition : firefighterPositions) { - Position newFirefighterPosition = - targetStrategy.neighborClosestToFire(firefighterPosition, - firePositions, neighbors); + + for (Firefighter firefighter : firefighters) { + Position originalPosition = firefighter.getPosition(); + Position newFirefighterPosition = originalPosition; + + // Déplacer le pompier vers le feu le plus proche + if (firefighter instanceof MotorizedFireFighter) { + // Premier mouvement + Position firstMove = targetStrategy.neighborClosestToFire(newFirefighterPosition, firePositions, neighbors); + if (firstMove != null) { + newFirefighterPosition = firstMove; + } + + // Deuxième mouvement + Position secondMove = targetStrategy.neighborClosestToFire(newFirefighterPosition, firePositions, neighbors); + if (secondMove != null) { + newFirefighterPosition = secondMove; + } + } else { + newFirefighterPosition = targetStrategy.neighborClosestToFire(newFirefighterPosition, firePositions, neighbors); + } + + // Mettre à jour la position du pompier + firefighter.setPosition(newFirefighterPosition); firefighterNewPositions.add(newFirefighterPosition); + + // Éteindre les feux autour de la nouvelle position extinguish(newFirefighterPosition); - modifiedPosition.add(firefighterPosition); - modifiedPosition.add(newFirefighterPosition); List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() .filter(firePositions::contains).toList(); - for (Position firePosition : neighborFirePositions) + for (Position firePosition : neighborFirePositions) { extinguish(firePosition); - modifiedPosition.addAll(neighborFirePositions); + } + + // Ajouter les positions modifiées à la liste + modifiedPositions.add(originalPosition); + modifiedPositions.add(newFirefighterPosition); + modifiedPositions.addAll(neighborFirePositions); } + firefighterPositions = firefighterNewPositions; - return modifiedPosition; + return modifiedPositions; } @Override @@ -134,13 +186,20 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @Override public void setState(List<ModelElement> state, Position position) { firePositions.remove(position); - for (; ; ) { - if (!firefighterPositions.remove(position)) break; - } + firefighterPositions.remove(position); for (ModelElement element : state) { switch (element) { case FIRE -> firePositions.add(position); - case FIREFIGHTER -> firefighterPositions.add(position); + case FIREFIGHTER -> { + Firefighter firefighter = new Firefighter(position, targetStrategy); + firefighters.add(firefighter); + firefighterPositions.add(position); + } + case MOTORIZED_FIREFIGHTER -> { + MotorizedFireFighter motorizedFireFighter = new MotorizedFireFighter(position, targetStrategy); + firefighters.add(motorizedFireFighter); + firefighterPositions.add(position); + } } } } diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java index 759eee5..77942c1 100644 --- a/src/main/java/model/ModelElement.java +++ b/src/main/java/model/ModelElement.java @@ -1,5 +1,5 @@ package model; public enum ModelElement { - FIREFIGHTER, FIRE + FIREFIGHTER, MOTORIZED_FIREFIGHTER, FIRE } diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java index ffb7611..482767a 100644 --- a/src/main/java/view/ViewElement.java +++ b/src/main/java/view/ViewElement.java @@ -3,7 +3,7 @@ package view; import javafx.scene.paint.Color; public enum ViewElement { - FIREFIGHTER(Color.BLUE), FIRE(Color.RED), EMPTY(Color.WHITE); + FIREFIGHTER(Color.BLUE), FIRE(Color.RED), MOTORIZED_FIREFIGHTER(Color.BLACK), EMPTY(Color.WHITE); final Color color; ViewElement(Color color) { this.color = color; -- GitLab From 0959f9fb7f7dd73827e91383f2a5d4d4c097be64 Mon Sep 17 00:00:00 2001 From: hadiz <nana-hadiza.BACHIR-ABDOU@etu.univ-amu.fr> Date: Fri, 22 Nov 2024 12:10:14 +0100 Subject: [PATCH 6/6] Propagation de feux --- src/main/java/model/FirefighterBoard.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index 1b2859c..d865134 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -45,10 +45,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> { firefighterPositions = new ArrayList<>(); firePositions = new HashSet<>(); - for (int index = 0; index < initialFireCount; index++) + for (int index = 0; index < initialFireCount*2; index++) firePositions.add(randomPosition()); - int motorizedCount = initialFirefighterCount / 2; + int motorizedCount = initialFirefighterCount/2; for (int i = 0; i < motorizedCount; i++) { MotorizedFireFighter motorizedFireFighter = new MotorizedFireFighter(randomPosition(), targetStrategy); -- GitLab