diff --git a/src/main/java/model/doctorviruspatient/Doctor.java b/src/main/java/model/doctorviruspatient/Doctor.java index 0b8bd43efce39cee9ff2d7cafeacd50260f77493..e84b6ab140944ebaa39ef62c5c137524286616b3 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 5bf9f69ea54046b7d834bf49452ef6772ef8747b..73bb433f50fdaf2d250da63418fd62104ecebbdb 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;