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