Skip to content
Snippets Groups Projects
Select Git revision
  • 39f46b80d8b9c78a07f78ae3071e1adecaf2789a
  • main default protected
  • correction_video
  • going_further
  • ImprovedMouseInteraction
  • final2023
  • template
  • ModifGUI
8 results

SeedsState.java

Blame
  • Forked from YAGOUBI Rim / Game of life Template
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Doctor.java 5.05 KiB
    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;
    import model.Board;
    import model.Entity;
    import model.Square;
    import model.firefighterscenario.Cloud;
    import util.Position;
    import util.PositionUtil;
    import view.ViewElement;
    
    public class Doctor implements Entity {
        private final int priority = 1;
        private Position position;
        private int age;
        private final Color viewColor = Color.RED;
        private static javafx.scene.image.Image cloudImage;
    
        static {
            try {
                cloudImage = new javafx.scene.image.Image(Cloud.class.getResource("/view/icons/virus/docteur.png").toExternalForm());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        // 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;
        }
    
        public Doctor(Position p, int age) {
            this.position = p;
            this.age = age;
        }
    
        @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);
            }
    
            // 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);
            }
        }
    
        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() {
            return this.position;
        }
    
        @Override
        public void setPosition(Position p) {
            this.position = p;
        }
    
        @Override
        public int getAge() {
            return this.age;
        }
    
        @Override
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public void incrementAge() {
            this.age += 1;
        }
    
        @Override
        public Color getViewColor() {
            return this.viewColor;
        }
    
        @Override
        public int getPriority() {
            return this.priority;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (obj instanceof Doctor) {
                Doctor other = (Doctor) obj;
                return this.position.equals(other.getPosition());
            } else {
                return false;
            }
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(position);
        }
    
        @Override
        public ViewElement getViewElement() {
            return new ViewElement (cloudImage);
        }
    
    
    }