diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index a2d7b95bdd1335ff818e23b64d4d5cf1b574323e..bbd21177c5517a1dc4bc9761b70892cca494217a 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -13,8 +13,8 @@ import javafx.stage.Stage; public class SimulatorApplication extends javafx.application.Application { private static final String VIEW_RESOURCE_PATH = "/view/view.fxml"; private static final String APP_NAME = "Firefighter simulator"; - private static final int ROW_COUNT = 40; - private static final int COLUMN_COUNT = 40; + private static final int ROW_COUNT = 50; + private static final int COLUMN_COUNT = 50; private static final int BOX_WIDTH = 15; private static final int BOX_HEIGHT = 15; public static final int INITIAL_FIRE_COUNT = 8; diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 7ad1c207ee06150b7fd108898b18f952abf8e6a8..8fed944ea6595e898a761957b448121a1ac51670 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -25,7 +25,7 @@ import model.Model; import model.Square; import model.doctorviruspatient.DoctorVirusPatientScenario; import model.doctorviruspatient.Patient; -import model.virus.Virus; +import model.doctorviruspatient.Virus; import util.Position; import view.Grid; import view.ViewElement; @@ -137,13 +137,17 @@ public class Controller { entityCounts.put((pos, b) -> new Mountain(pos), initialmountaincount); entityCounts.put((pos, b) -> new Rockery(pos), 3); */ + /* entityCounts.put((pos, b) -> new Rock(pos), 10); entityCounts.put((pos, b) -> new Cisor(pos), 10); entityCounts.put((pos, b) -> new Paper(pos), 10); */ + + entityCounts.put((pos, b) -> new Patient(pos), 10); entityCounts.put((pos, b) -> new Virus(pos), 1); + Model model = new DoctorVirusPatientScenario(columnCount, rowCount, entityCounts); this.setModel(model); repaintGrid(); diff --git a/src/main/java/model/Scenario.java b/src/main/java/model/Scenario.java index e58abb80c903b97b5aa327a11a1f94ee4238eb5e..92af675cd0b5b43370b8511c2e1ebfd1c18e6653 100644 --- a/src/main/java/model/Scenario.java +++ b/src/main/java/model/Scenario.java @@ -15,7 +15,7 @@ public class Scenario implements Board<Square>{ protected int step; protected int turnsToSpawnAirTanker; - private Map<EntityFactory, Integer> initialMap; + protected Map<EntityFactory, Integer> initialMap; public Scenario(int columns, int rows, Map<EntityFactory, Integer> initialMap) { this.matrix = new Matrix<Square>(columns, rows); @@ -91,6 +91,9 @@ public class Scenario implements Board<Square>{ public Position getNearestEntity(Position fromPos, Class<?> entityType, List<Entity> exclusionList) { int rows = matrix.getRows(); int cols = matrix.getColumns(); + if(exclusionList == null){ + exclusionList = List.of(); + } // Définir la distance maximale possible int maxDistance = rows + cols; // Parcourir les distances croissantes à partir de 1 diff --git a/src/main/java/model/doctorviruspatient/Patient.java b/src/main/java/model/doctorviruspatient/Patient.java index 0d1759512892a85fd6a02c902148aa38deaf7af6..3d1c90efa13cd92986f563f782d809404e250920 100644 --- a/src/main/java/model/doctorviruspatient/Patient.java +++ b/src/main/java/model/doctorviruspatient/Patient.java @@ -168,7 +168,9 @@ private void handleEncounterWithPatient(Position p, Board<Square> board) { .filter(entity -> entity instanceof Patient) .findFirst() .orElse(null); - + if(isInfected()){ + patient.infect(carriedVirus); + } if (patient != null) { this.ennemy = patient.getPosition(); visitedPatients.add(patient); @@ -204,7 +206,7 @@ private void handleEncounterWithPatient(Position p, Board<Square> board) { @Override public Color getViewColor() { - return this.viewColor; + return isInfected() ? Color.CYAN : this.viewColor; } @Override @@ -217,6 +219,7 @@ private void handleEncounterWithPatient(Position p, Board<Square> board) { } public void infect(Virus virus){ + if(this.carriedVirus != null) return; this.carriedVirus = virus; } diff --git a/src/main/java/model/doctorviruspatient/Virus.java b/src/main/java/model/doctorviruspatient/Virus.java index 8ea8b6b765017246f953b2a89e999a8e0a8e43f9..1dd4399ce65aa8257e022046f69d9bccea4db623 100644 --- a/src/main/java/model/doctorviruspatient/Virus.java +++ b/src/main/java/model/doctorviruspatient/Virus.java @@ -7,30 +7,85 @@ import javafx.scene.paint.Color; import model.Board; import model.Entity; import model.Square; -import model.rockpapercisor.Rock; +import util.PathGenerator; import util.Position; import util.PositionUtil; public class Virus implements Entity { private final int priority = 0; - Position position; + private Position position; private int age; private final Color viewColor = Color.LIMEGREEN; + private List<Position> path; + private int pathIndex; + private static final int MAX_STEPS_IN_DIRECTION = 5; + private static final int MINIMUM_ROAD_LENGTH = 10; public Virus(Position p) { this.position = p; + this.path = new ArrayList<>(); + this.age = 0; + this.pathIndex = 0; } public Virus(Position p, int age) { this.position = p; this.age = age; + this.path = new ArrayList<>(); + this.pathIndex = 0; } @Override public List<Position> nextTurn(Board<Square> board) { - + // Génère un nouveau chemin si nécessaire + if (path == null || path.isEmpty() || pathIndex >= path.size()) { + generateNewPath(board); + if (path.isEmpty()) { + return List.of(); + } + } + List<Position> adjacentPosition = PositionUtil.generateAllAdjacentPositions(position, board); + for(Position p : adjacentPosition){ + if(board.doesSquareContainEntity(p, Patient.class)){ + Patient patient = (Patient) board.getStates(p).getEntities().stream().filter(e -> e instanceof Patient).findFirst().get(); + patient.infect(this); + } + } + // Se déplace vers la prochaine position du chemin + Position nextPosition = path.get(pathIndex); + if (board.doesPositionExist(nextPosition)) { + // Vérifier si la position est libre + if (board.isPositionFree(nextPosition, priority)) { + Position oldPosition = position; + position = nextPosition; + board.clearCaseFrom(this, oldPosition); + board.addEntityAtSquare(this, position); + pathIndex = pathIndex + 1; + return List.of(oldPosition, position); + } else { + // Si la position n'est pas libre, génère un nouveau chemin + generateNewPath(board); + return List.of(); + } + } else { + // Si la prochaine position n'existe pas, génère un nouveau chemin + generateNewPath(board); + return List.of(); + } } + private void generateNewPath(Board<Square> board) { + PathGenerator pathGenerator = new PathGenerator(board, position, MAX_STEPS_IN_DIRECTION, MINIMUM_ROAD_LENGTH); + this.path = pathGenerator.generate(); + // Supprime la position actuelle du chemin si elle est présente au début + if (!path.isEmpty() && path.get(0).equals(position)) { + path.remove(0); + } + this.pathIndex = 0; // Réinitialise l'index du chemin + } + + // Les autres méthodes restent inchangées + @Override public Position getPosition() { return this.position; @@ -39,7 +94,6 @@ public class Virus implements Entity { @Override public void setPosition(Position p) { this.position = p; - } @Override diff --git a/src/main/java/model/firefighterscenario/FireFighterScenario.java b/src/main/java/model/firefighterscenario/FireFighterScenario.java index 259c69f91105d443da95b9512533dfbf4439a538..675d548bae13f56e45021b56c56862f7eadc3c94 100644 --- a/src/main/java/model/firefighterscenario/FireFighterScenario.java +++ b/src/main/java/model/firefighterscenario/FireFighterScenario.java @@ -25,11 +25,8 @@ public class FireFighterScenario extends Scenario implements Model{ ArrayList<Position> changedPositions = new ArrayList<>(); Iterator<Square> iterator = getMatrix().iterator(); List<Entity> updatedEntities = new ArrayList<Entity>(); - int i = 0; while (iterator.hasNext()) { Square s = iterator.next(); - System.out.println("i : " + i); - i++; if (s.isEmpty()) continue; if (s.getMaxAge() == 0) { @@ -142,4 +139,12 @@ public class FireFighterScenario extends Scenario implements Model{ return this; } + public void reset() { + step = 0; + super.getMatrix().clear(); + initScenario(super.getMatrix()); + placeInitialEntities(initialMap); + generateRoads(); + } + } diff --git a/src/main/java/model/virus/Doctor.java b/src/main/java/model/virus/Doctor.java deleted file mode 100644 index 81469f4000f78e00eb110b4138e55e2ed09eee95..0000000000000000000000000000000000000000 --- a/src/main/java/model/virus/Doctor.java +++ /dev/null @@ -1,61 +0,0 @@ -package model.virus; - -import java.util.List; - -import javafx.scene.paint.Color; -import model.Board; -import model.Entity; -import model.Square; -import util.Position; - -public class Doctor implements Entity{ - - private Position position; - private final Color VIEW_COLOR = Color.RED; - private int age; - private final int PRIORITY = 1; - public Doctor(Position position){ - this.position = position; - this.age = 0; - } - @Override - public List<Position> nextTurn(Board<Square> board) { - return List.of(); - } - - @Override - public Position getPosition() { - return this.position; - } - - @Override - public void setPosition(Position p) { - this.position = p; - } - - @Override - public int getAge() { - return age; - } - - @Override - public void setAge(int age) { - this.age = age; - } - - @Override - public void incrementAge() { - this.age = age + 1; - } - - @Override - public Color getViewColor() { - return this.VIEW_COLOR; - } - - @Override - public int getPriority() { - return this.PRIORITY; - } - -} diff --git a/src/main/java/model/virus/Patient.java b/src/main/java/model/virus/Patient.java deleted file mode 100644 index 204d18abfb94b203ad69e1e1c47a4139247aff98..0000000000000000000000000000000000000000 --- a/src/main/java/model/virus/Patient.java +++ /dev/null @@ -1,67 +0,0 @@ -package model.virus; - -import java.util.List; - -import javafx.scene.paint.Color; -import model.Board; -import model.Entity; -import model.Square; -import util.Position; - -public class Patient implements Entity{ - - private Position position; - private final Color VIEW_COLOR = Color.BLUE; - private int age; - private final int PRIORITY = 1; - private final boolean isSick; - public Patient(Position position){ - this.position = position; - this.age = 0; - this.isSick = false; - } - @Override - public List<Position> nextTurn(Board<Square> board) { - if(isSick){ - return List.of(); - }else{ - return List.of(); - } - } - - @Override - public Position getPosition() { - return this.position; - } - - @Override - public void setPosition(Position p) { - this.position = p; - } - - @Override - public int getAge() { - return age; - } - - @Override - public void setAge(int age) { - this.age = age; - } - - @Override - public void incrementAge() { - this.age = age + 1; - } - - @Override - public Color getViewColor() { - return this.VIEW_COLOR; - } - - @Override - public int getPriority() { - return this.PRIORITY; - } - -} diff --git a/src/main/java/model/virus/Virus.java b/src/main/java/model/virus/Virus.java deleted file mode 100644 index cf558b157a92d88c3d366bf088d5cc2f0a45e44b..0000000000000000000000000000000000000000 --- a/src/main/java/model/virus/Virus.java +++ /dev/null @@ -1,61 +0,0 @@ -package model.virus; - -import java.util.List; - -import javafx.scene.paint.Color; -import model.Board; -import model.Entity; -import model.Square; -import util.Position; - -public class Virus implements Entity{ - - private Position position; - private final Color VIEW_COLOR = Color.LIMEGREEN; - private int age; - private final int PRIORITY = 1; - public Virus(Position position){ - this.position = position; - this.age = 0; - } - @Override - public List<Position> nextTurn(Board<Square> board) { - return List.of(); - } - - @Override - public Position getPosition() { - return this.position; - } - - @Override - public void setPosition(Position p) { - this.position = p; - } - - @Override - public int getAge() { - return age; - } - - @Override - public void setAge(int age) { - this.age = age; - } - - @Override - public void incrementAge() { - this.age = age + 1; - } - - @Override - public Color getViewColor() { - return this.VIEW_COLOR; - } - - @Override - public int getPriority() { - return this.PRIORITY; - } - -} diff --git a/src/main/java/util/Matrix.java b/src/main/java/util/Matrix.java index 36a06da1550e9d89446c4f936d695a8bdab698fe..5ed290f0c31f3134d241fb49e3d716fb3bd0f874 100644 --- a/src/main/java/util/Matrix.java +++ b/src/main/java/util/Matrix.java @@ -6,6 +6,7 @@ import java.util.Iterator; import java.util.NoSuchElementException; import model.Square; +import model.doctorviruspatient.Patient; import model.firefighterscenario.Fire; import model.firefighterscenario.FireFighter; @@ -83,8 +84,11 @@ public class Matrix<E> implements Iterable<E> { else if(s.getEntities().stream().anyMatch(p -> p instanceof FireFighter)){ System.out.print(" ff | "); } - else if(s.getEntities().stream().anyMatch(p -> p instanceof FireFighter)){ - System.out.print(" A | "); + else if(s.getEntities().stream().anyMatch(p -> p instanceof Patient)){ + System.out.print(" P | "); + } + else if(s.getEntities().stream().anyMatch(p -> p instanceof model.doctorviruspatient.Virus)){ + System.out.print(" V | "); }else{ System.out.print(" | "); } diff --git a/src/main/java/util/PathGenerator.java b/src/main/java/util/PathGenerator.java index 149c4ca1633a286e84915cf3c75c7405607470da..148116237eb0cc1ac4c04c91d23be3b5cb836543 100644 --- a/src/main/java/util/PathGenerator.java +++ b/src/main/java/util/PathGenerator.java @@ -10,7 +10,7 @@ import java.util.Set; import model.Board; public class PathGenerator { - private final Board<?> board; + private Board<?> board; private final Random random = new Random(); private final int maxStepsInDirection; private final int minimumRoadLength; @@ -59,7 +59,9 @@ public class PathGenerator { } return roadLength >= minimumRoadLength ? path : regeneratePath(); } - + public void setBoard(Board<?> board){ + this.board = board; + } /** Initialise le chemin avec l'ancre et choisit la première direction. */ private void initializePath() { path.clear();