diff --git a/.gradle/8.10.2/executionHistory/executionHistory.lock b/.gradle/8.10.2/executionHistory/executionHistory.lock index 866f8ac5e21dae56dd670743ad8f23dce3fa7855..00af7ad92d473c28e75df256de7082d1905d37a0 100644 Binary files a/.gradle/8.10.2/executionHistory/executionHistory.lock and b/.gradle/8.10.2/executionHistory/executionHistory.lock differ diff --git a/.gradle/8.10.2/fileHashes/fileHashes.lock b/.gradle/8.10.2/fileHashes/fileHashes.lock index d3e85847bd6f477176e3d0b79c7e5df5ba1f10a5..eec55f022194ea4668a5592c880843ef4401710c 100644 Binary files a/.gradle/8.10.2/fileHashes/fileHashes.lock and b/.gradle/8.10.2/fileHashes/fileHashes.lock differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 9737a6e0e59ba50d3225d012aca741ce63966c10..e1618ed68daabe25ab487b4d5282bfbda4d972e2 100644 Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/src/main/java/model/FireManager.java b/src/main/java/model/FireManager.java index 7a8f0b4882120cf79969a55cd2023dfbc0aabfa0..6b47541e0a7a7c79d94e3e896b37f5a6477988d1 100644 --- a/src/main/java/model/FireManager.java +++ b/src/main/java/model/FireManager.java @@ -5,10 +5,13 @@ import util.Position; import java.util.*; public class FireManager { - private Set<Position> firePositions = new HashSet<>(); + private Set<Position> firePositions; + private int turnCounter; private FireSpreadStrategy fireSpreadStrategy; public FireManager(FireSpreadStrategy fireSpread) { + this.firePositions = new HashSet<>(); + this.turnCounter = 0; this.fireSpreadStrategy = fireSpread; } public void initializeFires(int fireCount, int rowCount, int columnCount, Random random) { @@ -17,9 +20,19 @@ public class FireManager { } } public List<Position> fireSpread(Map<Position, List<Position>> neighbors){ - List<Position> newFirePositions = fireSpreadStrategy.spreadFire(firePositions, neighbors); - firePositions.addAll(newFirePositions); - return newFirePositions; + List<Position> newFires = new ArrayList<>(); + if (turnCounter % 2 == 0) { + for (Position fire : firePositions) { + for (Position neighbor : neighbors.get(fire)) { + if (!firePositions.contains(neighbor)) { + newFires.add(neighbor); + } + } + } + } + firePositions.addAll(newFires); + turnCounter++; + return newFires; } public void extinguish(Position position){ firePositions.remove(position); diff --git a/src/main/java/model/FirefighterManager.java b/src/main/java/model/FirefighterManager.java index b057e09ca466002a7e54b8ddbaa57ed2d6047b32..85f97fa6ec2115f9017011f23ec3e7cc832f3264 100644 --- a/src/main/java/model/FirefighterManager.java +++ b/src/main/java/model/FirefighterManager.java @@ -5,10 +5,11 @@ import util.Position; import java.util.*; public class FirefighterManager { - private List<Position> firefighterPositions = new ArrayList<>(); + private List<Position> firefighterPositions; private FirefighterMovementStrategy firefighterMovementStrategy; public FirefighterManager(FirefighterMovementStrategy firefighterMovementStrategy) { + this.firefighterPositions = new ArrayList<>(); this.firefighterMovementStrategy = firefighterMovementStrategy; } public void initializeFireFightersPositions(int count, int rowCount, int columnCount, Random random) { @@ -18,18 +19,64 @@ public class FirefighterManager { } public List<Position> moveFireFighters(Set<Position> firePositions, Map<Position, List<Position>> neighbors) { List<Position> modifiedPositions = new ArrayList<>(); - List<Position> newPositions = new ArrayList<>(); - for( Position currentposition : firefighterPositions) { - Position newPosition = firefighterMovementStrategy.moveToClosestFire(currentposition, firePositions, neighbors); - modifiedPositions.add(currentposition); - modifiedPositions.add(newPosition); - newPositions.add(newPosition); + for (int i = 0; i < firefighterPositions.size(); i++) { + Position firefighter = firefighterPositions.get(i); + + Position closestFire = findClosestFire(firefighter, firePositions); + + if (closestFire != null && !neighbors.get(firefighter).contains(closestFire)) { + Position newPosition = moveTowards(firefighter, closestFire); + firefighterPositions.set(i, newPosition); + modifiedPositions.add(newPosition); + } + + for (Position neighbor : neighbors.get(firefighter)) { + if (firePositions.contains(neighbor)) { + firePositions.remove(neighbor); + modifiedPositions.add(neighbor); + } + } } - firefighterPositions = newPositions; + return modifiedPositions; } public List<Position> getFirefighterPositions() { return firefighterPositions; } + + private Position findClosestFire(Position firefighter, Set<Position> firePositions) { + Position closestFire = null; + int minDistance = Integer.MAX_VALUE; + + for (Position fire : firePositions) { + int distance = Math.abs(fire.getRow() - firefighter.getRow()) + Math.abs(fire.getCol() - firefighter.getCol()); + if (distance < minDistance) { + minDistance = distance; + closestFire = fire; + } + } + + return closestFire; + } + + private Position moveTowards(Position firefighter, Position target) { + int currentRow = firefighter.getRow(); + int currentCol = firefighter.getCol(); + + int targetRow = target.getRow(); + int targetCol = target.getCol(); + + if (currentRow < targetRow) { + return new Position(currentRow + 1, currentCol); // Move down + } else if (currentRow > targetRow) { + return new Position(currentRow - 1, currentCol); // Move up + } else if (currentCol < targetCol) { + return new Position(currentRow, currentCol + 1); // Move right + } else if (currentCol > targetCol) { + return new Position(currentRow, currentCol - 1); // Move left + } + + return firefighter; + } } diff --git a/src/main/java/util/Position.java b/src/main/java/util/Position.java index 8a0d2b66724d1516a82912d4a2d55f37533578fc..02378270620c981a9be8e314becc93703e738407 100644 --- a/src/main/java/util/Position.java +++ b/src/main/java/util/Position.java @@ -1,6 +1,8 @@ package util; public record Position(int row, int column) { + + public int getRow() { return row; }