diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java index 52ad4a1846097b7cb9a99325dd94ccbdd77761e9..baf7b0a09f5ea5047a3a4cfd1238b59cf4c36c4a 100644 --- a/src/main/java/model/Cloud.java +++ b/src/main/java/model/Cloud.java @@ -45,7 +45,7 @@ public class Cloud implements Entity{ if (b.getStates(next_position).getEntities().stream().anyMatch(element -> element instanceof Fire) ){ extinguish(next_position, b); } - + Position old_position = this.position; this.position = next_position; b.addEntityAtSquare(this, next_position); @@ -101,4 +101,5 @@ public class Cloud implements Entity{ @Override public int getPriority(){ return this.priority;} + } diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java index 3bb763e26843898c634ea8ee3ade0af9963c9316..c3814b3ad3648fb6f6da919292301b8ba227276c 100644 --- a/src/main/java/model/Fire.java +++ b/src/main/java/model/Fire.java @@ -6,7 +6,7 @@ import java.util.List; import javafx.scene.paint.Color; import util.Position; import util.PositionUtil; -import util.PositionUtil; + public class Fire implements Entity { Board<Square> b; @@ -82,4 +82,26 @@ public class Fire implements Entity { @Override public int getPriority(){ return this.priority;} + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Fire fire = (Fire) obj; + return age == fire.age && + priority == fire.priority && + (position == null ? fire.position == null : position.equals(fire.position)) && + (b == null ? fire.b == null : b.equals(fire.b)) && + (viewColor == null ? fire.viewColor == null : viewColor.equals(fire.viewColor)); + } + + @Override + public int hashCode() { + int result = (b == null ? 0 : b.hashCode()); + result = 31 * result + (position == null ? 0 : position.hashCode()); + result = 31 * result + (viewColor == null ? 0 : viewColor.hashCode()); + result = 31 * result + age; + result = 31 * result + priority; + return result; + } } diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java index e206765c44f675019cb90fc054c926e0d36e170c..bd7ffb6c77a267675a00947a6ac41eae9a70fc2d 100644 --- a/src/main/java/model/FireFighter.java +++ b/src/main/java/model/FireFighter.java @@ -31,7 +31,6 @@ public class FireFighter implements Entity { // Vérifier s'il y a du feu dans une des positions adjacentes boolean hasFire = adjacentPositions.stream() .anyMatch(p -> b.doesSquareContainEntity(p, Fire.class)); - if (hasFire) { // Si du feu est trouvé, on éteint les feux adjacents positions.addAll(extinguish(adjacentPositions, b)); @@ -59,7 +58,7 @@ public class FireFighter implements Entity { return positions; } - private List<Position> extinguish(List<Position> adjacentPositions, Board<Square> b) { + protected List<Position> extinguish(List<Position> adjacentPositions, Board<Square> b) { List<Position> extinguishedPositions = new ArrayList<>(); for (Position p : adjacentPositions) { extinguishedPositions.addAll(adjacentPositions); @@ -76,7 +75,7 @@ public class FireFighter implements Entity { return extinguishedPositions; } - private Position getNextPositionTowards(Position currentPos, Position targetPos, Board<Square> b) { + protected Position getNextPositionTowards(Position currentPos, Position targetPos, Board<Square> b) { // Générer les 8 positions adjacentes possibles List<Position> possibleMoves = PositionUtil.generateAllAdjacentPositions(currentPos, b); diff --git a/src/main/java/model/FireFighterScenario.java b/src/main/java/model/FireFighterScenario.java index d0dc3442a2c61acd65e3da672de76834715d6cac..58d37043dbde2935604c9453caffb18a7f8f0b4a 100644 --- a/src/main/java/model/FireFighterScenario.java +++ b/src/main/java/model/FireFighterScenario.java @@ -3,16 +3,12 @@ package model; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; -import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Random; -import java.util.Random; import util.Matrix; import util.Position; import util.PositionUtil; -import util.PositionUtil; public class FireFighterScenario extends EntityScenario implements Board<Square> { @@ -48,7 +44,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> positions.add(new Position(x, y)); } } - + setSquare(new Square(new Position(0,0), new MotorizedFireFighter(new Position(0,0), this))); while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount || cloudCount < intialCloudCount) { Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire @@ -166,9 +162,8 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> } List<Entity> entities = new ArrayList<>(s.getEntities()); for (Entity e : entities) { - List<Position> entityUpdatedPositions = e.nextTurn(this); e.incrementAge(); - changedPositions.addAll(entityUpdatedPositions); + changedPositions.addAll(e.nextTurn(this)); } } @@ -184,7 +179,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> // Définir la distance maximale possible int maxDistance = rows + cols; - // Parcourir les distances croissantes à partir de 1 for (int distance = 1; distance < maxDistance; distance++) { List<Position> positionsAtDistance = PositionUtil.getPositionsAtManhattanDistance(fromPos, distance, rows, cols); diff --git a/src/main/java/model/MotorizedFireFighter.java b/src/main/java/model/MotorizedFireFighter.java new file mode 100644 index 0000000000000000000000000000000000000000..4ad3f74f1885bdd39a9ba676048b0b565226c88f --- /dev/null +++ b/src/main/java/model/MotorizedFireFighter.java @@ -0,0 +1,52 @@ +package model; + +import java.util.*; +import javafx.scene.paint.Color; +import util.*; + +public class MotorizedFireFighter extends FireFighter { + private final Color viewColor = Color.CYAN; + public MotorizedFireFighter(Position position, Board<Square> b){ + super(position, b); + } + public List<Position> nextTurn(Board<Square> b) { + List<Position> positions = new ArrayList<>(); + + // Générer les positions adjacentes + List<Position> adjacentPositions = PositionUtil.generateAdjacentPositions(getPosition(), b); + adjacentPositions.removeIf( p -> b.doesSquareContainEntity(p, Mountain.class)); + + // Vérifier s'il y a du feu dans une des positions adjacentes + boolean hasFire = adjacentPositions.stream() + .anyMatch(p -> b.doesSquareContainEntity(p, Fire.class)); + if (hasFire) { + // Si du feu est trouvé, on éteint les feux adjacents + positions.addAll(extinguish(adjacentPositions, b)); + } else { + // Chercher la position du feu le plus proche + Position nearestFirePos = b.getNearestEntity(getPosition(), Fire.class); + + if (nearestFirePos != null && !nearestFirePos.equals(getPosition())) { + // Trouver la meilleure position pour se rapprocher du feu + Position nextPos = getNextPositionTowards(getNextPositionTowards(getPosition(), nearestFirePos, b),nearestFirePos, b); + if (nextPos != null) { + // Mettre à jour la position du pompier + b.clearCaseFrom(this, getPosition()); // Vider l'ancienne case + positions.add(new Position(getPosition().x(), getPosition().y())); + setPosition(nextPos); + b.addEntityAtSquare(this, nextPos); // Mettre à jour la nouvelle case + positions.add(nextPos); + adjacentPositions = PositionUtil.generateAdjacentPositions(nextPos, b); + positions.addAll(extinguish(adjacentPositions, b)); + } + // Aucun déplacement possible = le pompier reste sur place + } + } + + return positions; + } + public Color getViewColor(){ + return this.viewColor; + } + +} diff --git a/src/main/java/util/PositionUtil.java b/src/main/java/util/PositionUtil.java index ce415d5dd41791b18dfaca170f9df06700de521c..4fa64089a07b7f9477750b77a40db3bf60e2f4c9 100644 --- a/src/main/java/util/PositionUtil.java +++ b/src/main/java/util/PositionUtil.java @@ -74,6 +74,18 @@ public class PositionUtil { .collect(Collectors.toList()); } + public static List<Position> generateAdjacentPositions(Position position, Board<Square> board, int distance) { + int x = position.x(); + int y = position.y(); + + List<Position> positions = new ArrayList<Position>(); + for(int i = 0; i < 4; i++){ + + } + return positions; + } + + // Méthode pour générer toutes les positions adjacentes (y compris les // diagonales) public static List<Position> generateAllAdjacentPositions(Position position, Board<Square> board) {