Skip to content
Snippets Groups Projects
Select Git revision
  • daf3602c64b2d7d6a57ac8292f517252ce1bab08
  • main default protected
  • variant
3 results

FFboardFiller.java

Blame
  • Forked from COUETOUX Basile / FirefighterStarter
    22 commits ahead of the upstream repository.
    user avatar
    BACHTARZI Imed eddine authored
    made the javaDoc for all interfaces and some classes.
    modified the UML diagrams.
    Final commit.
    daf3602c
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    FFboardFiller.java 3.66 KiB
    package model.firefighter;
    
    import model.BoardData;
    import model.elementTokens.ConnexElement;
    import model.Element;
    import util.Position;
    import view.ViewElement;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    /**
     * Classe responsable du remplissage du plateau de jeu avec les éléments spécifiés.
     * <p>
     * Cette classe gère le placement des éléments du jeu sur le plateau en fonction du nombre d'éléments à placer
     * (indiqué par le tableau {@code counter}). Chaque élément est instancié à une position aléatoire parmi les
     * positions disponibles. Certains éléments, comme ceux de type {@link ConnexElement}, influencent les positions
     * où d'autres éléments peuvent être placés.
     * </p>
     */
    public class FFboardFiller {
    
        /** Objet pour générer des positions aléatoires. */
        private Random random = new Random();
    
        /**
         * Remplie le plateau de jeu avec les éléments spécifiés dans {@code counter}.
         * <p>
         * Cette méthode parcourt les éléments définis dans {@link ViewElement}, instancie chaque élément à une position
         * aléatoire parmi les positions disponibles sur le plateau, et les place sur le plateau en utilisant la méthode
         * {@link BoardData#addElement(Element)}.
         * </p>
         * <p>
         * Le tableau {@code counter} spécifie le nombre d'éléments de chaque type à placer. Après chaque placement,
         * le compteur correspondant est décrémenté.
         * </p>
         *
         * @param boardData L'état actuel du plateau de jeu utilisé pour ajouter les éléments.
         * @param counter   Tableau représentant le nombre d'éléments à placer pour chaque type d'élément (indexé par {@link ViewElement#ordinal()} ou :
         *             //roads
         *             //forests
         *             //rocks
         *             //mountains
         *             //firefighter
         *             //motorized firefighter
         *             //motorized firefighter (AKA superman)
         *             //clouds
         *             //fires
         */
        public void fillBoard(BoardData boardData, int[] counter) {
            List<Position> positions = new ArrayList<>(List.copyOf(boardData.getNeighbors().keySet()));
    
            // Parcours de chaque élément possible dans l'énumération ViewElement
            for (ViewElement ve : ViewElement.values()) {
                // On ne place pas d'élément de type EMPTY
                if (ve != ViewElement.EMPTY) {
                    // Tant qu'il y a des éléments à placer pour ce type
                    while (counter[ve.ordinal()] > 0) {
                        Element element;
                        Position p;
                        do {
                            // Choisit une position aléatoire parmi les positions disponibles
                            p = positions.get(random.nextInt(positions.size()));
                            // Crée l'élément correspondant à la position choisie
                            element = ve.instanciate(boardData, p);
                        } while (!boardData.addElement(element)); // Réessaye si la position est invalide
    
                        // Si l'élément est un ConnexElement, retire les positions occupées par ses voisins
                        if (element instanceof ConnexElement) {
                            positions.removeAll(boardData.getElements().get(element.getType().ordinal()).stream()
                                    .map(x -> x.getPosition())
                                    .toList());
                        }
    
                        // Retire la position utilisée
                        positions.remove(p);
    
                        // Décrémente le compteur pour ce type d'élément
                        counter[ve.ordinal()]--;
                    }
                }
            }
        }
    }