From e40292aa4dca99afa18a9ce701523600e546ce3e Mon Sep 17 00:00:00 2001
From: Yanis O <oualanyanis01@gmail.com>
Date: Wed, 27 Nov 2024 17:44:20 +0100
Subject: [PATCH] Ajout de l'infection Virus-Patient et Patient-Patient

---
 src/main/java/app/SimulatorApplication.java   |  4 +-
 src/main/java/controller/Controller.java      |  6 +-
 src/main/java/model/Scenario.java             |  5 +-
 .../model/doctorviruspatient/Patient.java     |  7 +-
 .../java/model/doctorviruspatient/Virus.java  | 62 +++++++++++++++--
 .../FireFighterScenario.java                  | 11 ++-
 src/main/java/model/virus/Doctor.java         | 61 -----------------
 src/main/java/model/virus/Patient.java        | 67 -------------------
 src/main/java/model/virus/Virus.java          | 61 -----------------
 src/main/java/util/Matrix.java                |  8 ++-
 src/main/java/util/PathGenerator.java         |  6 +-
 11 files changed, 92 insertions(+), 206 deletions(-)
 delete mode 100644 src/main/java/model/virus/Doctor.java
 delete mode 100644 src/main/java/model/virus/Patient.java
 delete mode 100644 src/main/java/model/virus/Virus.java

diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java
index a2d7b95..bbd2117 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 7ad1c20..8fed944 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 e58abb8..92af675 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 0d17595..3d1c90e 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 8ea8b6b..1dd4399 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 259c69f..675d548 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 81469f4..0000000
--- 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 204d18a..0000000
--- 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 cf558b1..0000000
--- 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 36a06da..5ed290f 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 149c4ca..1481162 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();
-- 
GitLab