Skip to content
Snippets Groups Projects
Select Git revision
  • e7c9030b63f629c04af7a37ce9b9409da0dd717d
  • main default protected
  • melissa
  • yanis
  • variant
5 results

module-info.java

Blame
  • Forked from COUETOUX Basile / FirefighterStarter
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    BoardFireFighterBehavior.java 3.90 KiB
    package model;
    
    import util.Position;
    import util.TargetStrategy;
    
    import java.util.*;
    
    public class BoardFireFighterBehavior implements BoardBehavior{
        private final TargetStrategy targetStrategy = new TargetStrategy();
        private final Map<Position, List<Position>> neighbors;
        private List<Position> firefighterPositions;
        private Set<Position> firePositions;
        private final ElementFactory<FireFighter> firefighterFactory;
        private final ElementFactory<Fire> fireFactory;
        private int step;
    
        public BoardFireFighterBehavior(Map<Position, List<Position>> neighbors, ElementFactory<Fire> fireFactory ,ElementFactory<FireFighter> firefighterFactory) {
            this.step=0;
            this.neighbors = neighbors;
            this.firefighterFactory = firefighterFactory;
            this.fireFactory = fireFactory;
        }
    
        public void initializeElements(int rowCount, int columnCount) {
            // Utilisation de la factory pour créer les feux
            firePositions = new HashSet<>();
            List<Fire> fires = fireFactory.createElements(rowCount, columnCount);
            for (Fire fire : fires) {
                firePositions.add(fire.getPosition());
            }
    
            // Utilisation de la factory pour créer les pompiers
            firefighterPositions = new ArrayList<>();
            List<FireFighter> firefighters = firefighterFactory.createElements(rowCount, columnCount);
            for (FireFighter firefighter : firefighters) {
                firefighterPositions.add(firefighter.getPosition());
            }
        }
    
        private Position randomPosition(int rowCount, int columnCount, Random randomGenerator) {
            return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
        }
    
        public List<Position> updateFires() {
            List<Position> modifiedPositions = new ArrayList<>();
            if (step % 2 == 0) {
                List<Position> newFirePositions = new ArrayList<>();
                for (Position fire : firePositions) {
                    newFirePositions.addAll(neighbors.get(fire));
                }
                firePositions.addAll(newFirePositions);
                modifiedPositions.addAll(newFirePositions);
            }
            return modifiedPositions;
        }
    
        public List<Position> updateFirefighters() {
            List<Position> modifiedPositions = new ArrayList<>();
            List<Position> newFirefighterPositions = new ArrayList<>();
            for (Position firefighterPosition : firefighterPositions) {
                Position newFirefighterPosition = targetStrategy.neighborClosestToTarget(firefighterPosition, firePositions, neighbors);
                newFirefighterPositions.add(newFirefighterPosition);
                extinguish(newFirefighterPosition);
                modifiedPositions.add(firefighterPosition);
                modifiedPositions.add(newFirefighterPosition);
    
                List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
                        .filter(firePositions::contains).toList();
                for (Position firePosition : neighborFirePositions) {
                    extinguish(firePosition);
                }
                modifiedPositions.addAll(neighborFirePositions);
            }
            firefighterPositions = newFirefighterPositions;
            return modifiedPositions;
        }
    
        private void extinguish(Position position) {
            firePositions.remove(position);
        }
    
    
        public Set<Position> getFirePositions() {
            return firePositions;
        }
    
        public List<Position> getFirefighterPositions() {
            return firefighterPositions;
        }
    
        public void incrementStep() {
            step++;
        }
    
    
        @Override
        public int stepNumber() {
            return step;
        }
    
        @Override
        public List<Position> updateToNextGeneration() {
            List<Position> modifiedPositions = updateFirefighters();
            modifiedPositions.addAll(updateFires());
            incrementStep();
            return modifiedPositions;
        }
    
        @Override
        public void reset() {
            this.step=0;
        }
    
    }