diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 577a4d1b61b6549cc40de56754b20fc09414e35a..f1fa00410c6cc4c8f5bf0238482d5eb46bd5305d 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -100,6 +100,9 @@ public class Controller { if (squareState.contains(ModelElement.ROCAILLE)) { return ViewElement.ROCAILLE; } + if (squareState.contains(ModelElement.MOTORIZEDFIREFIGHTER)) { + return ViewElement.MOTORIZEDFIREFIGHTER; + } return ViewElement.EMPTY; } diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java index 4983ad2f2c6f745850b6c2417e242bff742008a0..1d7a630111bee98cdede76a988be83b1c13686ea 100644 --- a/src/main/java/model/Extinguisher.java +++ b/src/main/java/model/Extinguisher.java @@ -2,10 +2,12 @@ package model; import util.Neighbour; import util.Position; +import util.TargetStrategy; import java.util.List; public abstract class Extinguisher implements Element{ + protected final TargetStrategy targetStrategy = new TargetStrategy(); protected Neighbour neighbour; protected Position position; diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java index 994ed1e4557535fd75ea8a5697cd8152dafde74a..798f4c498a75714aa59f33039724e82b7188bc33 100644 --- a/src/main/java/model/Fire.java +++ b/src/main/java/model/Fire.java @@ -40,13 +40,11 @@ public class Fire implements Element { List<Position> modifiedPositions = new ArrayList<>(); if (firefighterBoard.stepNumber() % 2 == 0) { Set<Position> newFirePositions = new HashSet<>(); - for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) { - List<Position> neighboursAvailable = this.neighbour.getNeighbors().get(fire); - neighboursAvailable.removeAll(firefighterBoard.getObstacles().keySet()); - - newFirePositions.addAll(this.neighbour.getNeighbors().get(fire)); + for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) { + newFirePositions.addAll(removeMountainAndRoads(firefighterBoard,fire)); } + for (Position position : newFirePositions) { if (!firefighterBoard.getFires().containsKey(position)) { firefighterBoard.getFires().put(position, new Fire(position)); @@ -62,6 +60,30 @@ public class Fire implements Element { } + public List<Position>removeMountainAndRoads(Board<List<ModelElement>> firefighterBoard,Position position){ + List<Position>neighboursAvailable; + + neighboursAvailable = this.neighbour.getNeighbors().get(position); + if(firefighterBoard.stepNumber()%4==0){ + List<Position>MountainAndRoadsPositions = new ArrayList<>(); + for(Obstacle obstacle : firefighterBoard.getObstacles().values()){ + if(obstacle instanceof Road || obstacle instanceof Montain){ + MountainAndRoadsPositions.add(obstacle.getPosition()); + neighboursAvailable.removeAll(MountainAndRoadsPositions); + } + } + } + else{ + + neighboursAvailable.removeAll(firefighterBoard.getObstacles().keySet()); + } + + + return neighboursAvailable; + } + + + } \ No newline at end of file diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java index b656cf75278d2f5d4067097cad54900cfda5a35e..9e1233e6161f9a44b0b0c69c2761df722eecb3d2 100644 --- a/src/main/java/model/FireFighter.java +++ b/src/main/java/model/FireFighter.java @@ -2,36 +2,33 @@ package model; import util.Neighbour; import util.Position; -import util.TargetStrategy; + import java.util.ArrayList; -import java.util.HashSet; + import java.util.List; public class FireFighter extends Extinguisher { - private final TargetStrategy targetStrategy = new TargetStrategy(); - - public FireFighter(Position position){ + public FireFighter(Position position) { super(position); element = ModelElement.FIREFIGHTER; } - public List<Position> update(Board<List<ModelElement>> firefighterBoard){ + public List<Position> update(Board<List<ModelElement>> firefighterBoard) { this.neighbour = new Neighbour(firefighterBoard); - List<Position> modifiedPositions = new ArrayList<>(); Position currentPosition = this.getPosition(); Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), this.neighbour.getNeighbors()); + this.setPosition(newPosition); - this.setPosition(newPosition); modifiedPositions.add(currentPosition); modifiedPositions.add(newPosition); @@ -53,4 +50,8 @@ public class FireFighter extends Extinguisher { return modifiedPositions; } -} \ No newline at end of file + + + } + + diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java index 4aa440eb68e2a60b35775607c1bb663b766596be..64c839ab48112331a1e727f65c477ab3ed4a248b 100644 --- a/src/main/java/model/ModelElement.java +++ b/src/main/java/model/ModelElement.java @@ -7,12 +7,13 @@ import java.util.List; public enum ModelElement { - FIREFIGHTER(10), + FIREFIGHTER(5), FIRE(10), CLOUD(10), ROAD(5), MOUNTAIN(5), - ROCAILLE(3); + ROCAILLE(3), + MOTORIZEDFIREFIGHTER(5); private final int initialNumber; @@ -34,6 +35,7 @@ public enum ModelElement { case CLOUD -> new Cloud(position); case MOUNTAIN -> new Montain(position); case ROCAILLE -> new Rocaille(position); + case MOTORIZEDFIREFIGHTER -> new MotorizedFireFighter(position); default -> throw new IllegalArgumentException("Unknown ModelElement: " + this); }; diff --git a/src/main/java/model/MotorizedFireFighter.java b/src/main/java/model/MotorizedFireFighter.java new file mode 100644 index 0000000000000000000000000000000000000000..a9dad9454f18f15767fad0da1dc78222de5cbed9 --- /dev/null +++ b/src/main/java/model/MotorizedFireFighter.java @@ -0,0 +1,49 @@ +package model; + +import util.Neighbour; +import util.Position; + +import java.util.ArrayList; +import java.util.List; + +public class MotorizedFireFighter extends Extinguisher { + + public MotorizedFireFighter(Position position) { + super(position); + this.element = ModelElement.MOTORIZEDFIREFIGHTER; + } + + @Override + public List<Position> update(Board<List<ModelElement>> firefighterBoard) { + this.neighbour = new Neighbour(firefighterBoard); + + List<Position> modifiedPositions = new ArrayList<>(); + + Position currentPosition = this.getPosition(); + Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), this.neighbour.getNeighbors()); + Position DoublenewPosition = targetStrategy.neighborClosestToFire(newPosition, firefighterBoard.getFires().keySet(), this.neighbour.getNeighbors()); + this.setPosition(DoublenewPosition); + + modifiedPositions.add(currentPosition); + modifiedPositions.add(newPosition); + modifiedPositions.add(DoublenewPosition); + + extinguish(firefighterBoard, newPosition); + extinguish(firefighterBoard, DoublenewPosition); + + + for (Position neighbor : this.neighbour.getNeighbors().get(DoublenewPosition)) { + extinguish(firefighterBoard, neighbor); + modifiedPositions.add(neighbor); + } + + for (Obstacle obstacle : firefighterBoard.getObstacles().values()) { + if (obstacle instanceof Montain) { + modifiedPositions.remove(obstacle.getPosition()); + } + } + + return modifiedPositions; + + } +} diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java index 57b2b151c0d08426ad375b6e59b88e11ddb304be..a5db13ab91dd52105810b5064e655a1351cbe245 100644 --- a/src/main/java/view/ViewElement.java +++ b/src/main/java/view/ViewElement.java @@ -10,6 +10,7 @@ public enum ViewElement { MOUNTAIN(Color.BROWN), ROCAILLE(Color.GREEN), + MOTORIZEDFIREFIGHTER(Color.PURPLE), EMPTY(Color.WHITE); final Color color; ViewElement(Color color) {