diff --git a/src/main/java/model/FireFighterScenario.java b/src/main/java/model/FireFighterScenario.java index c8df8095a524b1507681a843611b2e675b5f0608..48027ef5cad8e1f284cd2f37d59dd3cd02684bf4 100644 --- a/src/main/java/model/FireFighterScenario.java +++ b/src/main/java/model/FireFighterScenario.java @@ -8,6 +8,7 @@ import java.util.Random; import util.Matrix; import util.Position; +import util.PositionUtil; public class FireFighterScenario extends EntityScenario implements Board<Entity> { @@ -21,7 +22,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> this.step = 0; } -private void placeInitialActors(int initialFireCount, int initialFireFightersCount) { + private void placeInitialActors(int initialFireCount, int initialFireFightersCount) { int fireCount = 0; int fireFighterCount = 0; int chance = 5; // Chance initiale en pourcentage @@ -29,40 +30,39 @@ private void placeInitialActors(int initialFireCount, int initialFireFightersCou List<Position> positions = new ArrayList<>(); for (int x = 0; x < matrix.getRows(); x++) { - for (int y = 0; y < matrix.getColumns(); y++) { - positions.add(new Position(x, y)); - } + for (int y = 0; y < matrix.getColumns(); y++) { + positions.add(new Position(x, y)); + } } while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount) { - Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire - - for (Position pos : positions) { - if (getState(pos) instanceof EmptySquare) { - if (fireCount < initialFireCount && random.nextInt(100) < chance) { - setState(new Fire(pos, this, 1), pos); - fireCount++; - if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) { - return; - } - continue; - } - - if (fireFighterCount < initialFireFightersCount && random.nextInt(100) < chance) { - setState(new FireFighter(pos, this,1), pos); - fireFighterCount++; - if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) { - return; - } - } + Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire + + for (Position pos : positions) { + if (getState(pos) instanceof EmptySquare) { + if (fireCount < initialFireCount && random.nextInt(100) < chance) { + setState(new Fire(pos, this, 1), pos); + fireCount++; + if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) { + return; + } + continue; + } + + if (fireFighterCount < initialFireFightersCount && random.nextInt(100) < chance) { + setState(new FireFighter(pos, this, 1), pos); + fireFighterCount++; + if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) { + return; } + } } + } - // Augmente la chance de placement après chaque parcours complet - chance = Math.min(chance + 5, 100); // Ne dépasse pas 100% + // Augmente la chance de placement après chaque parcours complet + chance = Math.min(chance + 5, 100); // Ne dépasse pas 100% } -} - + } public Entity getState(Position position) { if (position.x() > matrix.size() || position.y() > matrix.size()) { @@ -76,7 +76,7 @@ private void placeInitialActors(int initialFireCount, int initialFireFightersCou if (!(getState(position) instanceof EmptySquare)) { return; } - if(doesPositionExist(position)){ + if (doesPositionExist(position)) { matrix.set(position.x(), position.y(), state); } } @@ -101,24 +101,52 @@ private void placeInitialActors(int initialFireCount, int initialFireFightersCou Iterator<Entity> iterator = matrix.iterator(); while (iterator.hasNext()) { Entity e = iterator.next(); - if(e instanceof EmptySquare) continue; - System.out.println("found age : " + e.getAge() + " current age : " + step); - if(e.getAge() == 0) { + if (e instanceof EmptySquare) + continue; + System.out.println("found age : " + e.getAge() + " current age : " + step); + if (e.getAge() == 0) { e.incrementAge(); continue; - }; + } + ; List<Position> entityUpdatedPositions = e.nextTurn(this); changedPositions.addAll(entityUpdatedPositions); } return changedPositions; } + public Position getNearestEntity(Position fromPos, Class<?> entityType) { + int rows = matrix.getRows(); + int cols = matrix.getColumns(); + Position nearestPosition = null; + + // 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); + + for (Position currentPos : positionsAtDistance) { + Entity currentEntity = matrix.get(currentPos.x(), currentPos.y()); + if (entityType.isInstance(currentEntity)) { + // Dès qu'une entité est trouvée à cette distance, elle est la plus proche + // possible + return currentPos; + } + } + } + + return nearestPosition; // Retourne null si aucune entité n'est trouvée + } + + public void reset() { matrix.clear(); } public int stepNumber() { - this.step = step +1; + this.step = step + 1; return this.step; }