From 79d86b7bf444b66ed6c45b6d751dab7e9c26c3f3 Mon Sep 17 00:00:00 2001
From: Yanis O <oualanyanis01@gmail.com>
Date: Wed, 27 Nov 2024 19:11:44 +0100
Subject: [PATCH] =?UTF-8?q?Ajout=20de=20variants=20pour=20les=20Virus,=20q?=
 =?UTF-8?q?ui=20rendent=20la=20gu=C3=A9rison=20par=20les=20m=C3=A9decin=20?=
 =?UTF-8?q?plus=20compliqu=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/model/doctorviruspatient/Doctor.java | 91 ++++++++++++++-----
 .../java/model/doctorviruspatient/Virus.java  | 12 ++-
 2 files changed, 78 insertions(+), 25 deletions(-)

diff --git a/src/main/java/model/doctorviruspatient/Doctor.java b/src/main/java/model/doctorviruspatient/Doctor.java
index 0b8bd43..e84b6ab 100644
--- a/src/main/java/model/doctorviruspatient/Doctor.java
+++ b/src/main/java/model/doctorviruspatient/Doctor.java
@@ -1,7 +1,9 @@
 package model.doctorviruspatient;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 import javafx.scene.paint.Color;
@@ -13,9 +15,13 @@ import util.PositionUtil;
 
 public class Doctor implements Entity {
     private final int priority = 1;
-    Position position;
+    private Position position;
     private int age;
     private final Color viewColor = Color.RED;
+    
+    // Statique car les médecins partagent les connaissances et les recherches
+    private static List<Integer> knownVirusVariant = new ArrayList<Integer>();
+    private static Map<Integer, Double> currentResearch = new HashMap<>(); // Map<variantId, % de recherche>
 
     public Doctor(Position p) {
         this.position = p;
@@ -28,32 +34,73 @@ public class Doctor implements Entity {
 
     @Override
     public List<Position> nextTurn(Board<Square> board) {
+        // Mettre à jour les recherches en cours
+        updateCurrentResearch();
+
+        // Interagir avec les positions adjacentes
         interactWithAdjacentPositions(PositionUtil.generateAllAdjacentPositions(position, board), board);
+        
         return List.of();
     }
 
+    /**
+     * Met à jour toutes les recherches en cours en augmentant leur avancement de x%.
+     * Si une recherche atteint ou dépasse 100%, elle est terminée.
+     */
+    private void updateCurrentResearch() {
+        List<Integer> completedResearch = new ArrayList<>();
+        
+        for (Map.Entry<Integer, Double> entry : currentResearch.entrySet()) {
+            int variantId = entry.getKey();
+            double progress = entry.getValue() + 2.0;
+            if (progress >= 100.0) {
+                progress = 100.0;
+                completedResearch.add(variantId);
+            }
+            currentResearch.put(variantId, progress);
+        }
 
-
-
-private List<Position> interactWithAdjacentPositions(List<Position> adjacentPositions, Board<Square> board) {
-    List<Position> result = new ArrayList<>();
-    for (Position p : adjacentPositions) {
-        if (board.doesSquareContainEntity(p, Patient.class)) {
-            handleEncounterWithPatient(p, board);
+        // Traiter les recherches complétées
+        for (int variantId : completedResearch) {
+            currentResearch.remove(variantId);
+            knownVirusVariant.add(variantId);
+            System.out.println("Recherche terminée pour le variant ID: " + variantId);
         }
     }
-    return result;
-}
 
-private void handleEncounterWithPatient(Position p, Board<Square> board) {
-    if(board.doesSquareContainEntity(p, Patient.class)){
-         Patient patient = (Patient) board.getStates(p).getEntities().stream().filter(e -> e instanceof Patient).findFirst().get();
-         if(patient.isInfected()){
-            patient.cure();
-         }
+    private List<Position> interactWithAdjacentPositions(List<Position> adjacentPositions, Board<Square> board) {
+        List<Position> result = new ArrayList<>();
+        for (Position p : adjacentPositions) {
+            if (board.doesSquareContainEntity(p, Patient.class)) {
+                handleEncounterWithPatient(p, board);
+            }
+        }
+        return result;
     }
-}
 
+    private void handleEncounterWithPatient(Position p, Board<Square> board) {
+        if (board.doesSquareContainEntity(p, Patient.class)) {
+            Patient patient = (Patient) board.getStates(p).getEntities().stream()
+                    .filter(e -> e instanceof Patient)
+                    .findFirst()
+                    .orElse(null);
+            if (patient != null && patient.isInfected()) {
+                Virus virus = patient.getVirus();
+                if (virus != null) {
+                    int variantId = virus.getVariantId();
+                    if (knownVirusVariant.contains(variantId)) {
+                        patient.cure();
+                    } else {
+                        // Si la variante n'est pas connue et pas en cours de recherche, l'ajouter à la recherche
+                        if (!currentResearch.containsKey(variantId)) {
+                            currentResearch.put(variantId, 0.0);
+                            System.out.println("Nouvelle variante détectée! Variant ID: " + variantId + ". Recherche commencée.");
+                        }
+                    }
+                }
+            }
+        }
+    }
 
     @Override
     public Position getPosition() {
@@ -63,7 +110,6 @@ private void handleEncounterWithPatient(Position p, Board<Square> board) {
     @Override
     public void setPosition(Position p) {
         this.position = p;
-
     }
 
     @Override
@@ -91,20 +137,19 @@ private void handleEncounterWithPatient(Position p, Board<Square> board) {
         return this.priority;
     }
 
-
     @Override
     public boolean equals(Object obj) {
-        if(obj instanceof Doctor){
+        if (obj instanceof Doctor) {
             Doctor other = (Doctor) obj;
-            return this.position == other.getPosition();
-        }else{
+            return this.position.equals(other.getPosition());
+        } else {
             return false;
         }
-        
     }
 
     @Override
     public int hashCode() {
         return Objects.hash(position);
     }
+
 }
diff --git a/src/main/java/model/doctorviruspatient/Virus.java b/src/main/java/model/doctorviruspatient/Virus.java
index 5bf9f69..73bb433 100644
--- a/src/main/java/model/doctorviruspatient/Virus.java
+++ b/src/main/java/model/doctorviruspatient/Virus.java
@@ -2,6 +2,7 @@ package model.doctorviruspatient;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 
 import javafx.scene.paint.Color;
 import model.Board;
@@ -42,7 +43,7 @@ public class Virus implements Entity {
 
     @Override
     public List<Position> nextTurn(Board<Square> board) {
-        if(board.getStepNumber() % 50 == 0){
+        if(board.getStepNumber() % 100 == 0){
             evolve();
         }
         // Génère un nouveau chemin si nécessaire
@@ -94,8 +95,15 @@ public class Virus implements Entity {
 
     // Les autres méthodes restent inchangées
     private void evolve(){
-        
+        this.variantId++;
+        Random r = new Random();
+        this.health = r.nextInt(100);
     }
+
+    public int getVariantId(){
+        return this.variantId;
+    }
+
     @Override
     public Position getPosition() {
         return this.position;
-- 
GitLab