Exemplo n.º 1
0
        /// <summary>
        /// Constructeur de copie. Le chemin (s'il existe) n'est cependant pas copier mais sera
        /// de toute façon automatiquement reconstruit au besoin.
        /// </summary>
        /// <param name="grille">Grille à recopier dans this.</param>
        public PFGrille(PFGrille grille)
        {
            this.Monde = grille.Monde;

            // Copier les noeuds de grille dans ceux de this.
            for (int row = 0; row < this.NombreRangees; row++)
            {
                for (int col = 0; col < this.NombreColonnes; col++)
                {
                    this.grille[row, col].Franchissable = grille[row, col].Franchissable;
                }
            }

            // Déterminer les noeuds de départ et de destination (s'ils existent).
            try
            {
                this.Depart = grille.Depart;
                this.Destination = grille.Destination;
            }
            catch (NullReferenceException)
            {
                this.depart = this.destination = null;
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Fonction retournant une liste des noeuds franchissables adjacents à celui donné en paramètre.
        /// Les huit noeuds adjacents sont considérés:
        ///    +-----------+  
        ///    | 1 | 2 | 3 |  Les noeuds 2, 4, 5 et 7 sont validés uniquement s'ils sont franchissables.
        ///    |---+---+---|  
        ///    | 4 |   | 5 |  Les noeuds en diagonal (1, 3, 6 et 8) sont validés s'ils sont
        ///    |---+---+---|  franchissables et que leurs deux noeuds adjacents le sont aussi. Par exemple
        ///    | 6 | 7 | 8 |  le noeud 6 est valide si les noeuds 4, 6 et 7 sont franchissables.
        ///    +-----------+
        /// </summary>
        /// <param name="noeud">Noeud dont on doit déterminer les noeuds adjacents franchissables.</param>
        /// <returns>Liste des noeuds franchissables adjacents au noeud fourni en paramètre.</returns>
        private List<PFNoeud> NoeudsVoisinsFranchissables(PFNoeud noeud)
        {
            // Liste où stocker les voisins franchissables.
            List<PFNoeud> liste = new List<PFNoeud>();

            // Valider le noeud adjacent #2.
            if (noeud.Rangee > 0)
            {
                if (this.grille[noeud.Rangee - 1, noeud.Colonne].Franchissable)
                {
                    // Noeud adjacent #2 valide.
                    liste.Add(this.grille[noeud.Rangee - 1, noeud.Colonne]);
                }
            }

            // Valider le noeud adjacent #7.
            if (noeud.Rangee < this.NombreRangees - 1)
            {
                if (this.grille[noeud.Rangee + 1, noeud.Colonne].Franchissable)
                {
                    // Noeud adjacent #7 valide.
                    liste.Add(this.grille[noeud.Rangee + 1, noeud.Colonne]);
                }
            }

            // Valider le noeud adjacent #4.
            if (noeud.Colonne > 0)
            {
                if (this.grille[noeud.Rangee, noeud.Colonne - 1].Franchissable)
                {
                    // Noeud adjacent #4 valide.
                    liste.Add(this.grille[noeud.Rangee, noeud.Colonne - 1]);
                }
            }

            // Valider le noeud adjacent #5.
            if (noeud.Colonne < this.NombreColonnes - 1)
            {
                if (this.grille[noeud.Rangee, noeud.Colonne + 1].Franchissable)
                {
                    // Noeud adjacent #5 valide.
                    liste.Add(this.grille[noeud.Rangee, noeud.Colonne + 1]);
                }
            }

            // Valider le noeud adjacent #1.
            if (noeud.Rangee > 0 && noeud.Colonne > 0)
            {
                if (this.grille[noeud.Rangee - 1, noeud.Colonne].Franchissable &&
                    this.grille[noeud.Rangee, noeud.Colonne - 1].Franchissable &&
                    this.grille[noeud.Rangee - 1, noeud.Colonne - 1].Franchissable)
                {
                    // Noeud adjacent #1 valide.
                    liste.Add(this.grille[noeud.Rangee - 1, noeud.Colonne - 1]);
                }
            }

            // Valider le noeud adjacent #3.
            if (noeud.Rangee > 0 && noeud.Colonne < this.NombreColonnes - 1)
            {
                if (this.grille[noeud.Rangee - 1, noeud.Colonne].Franchissable &&
                    this.grille[noeud.Rangee, noeud.Colonne + 1].Franchissable &&
                    this.grille[noeud.Rangee - 1, noeud.Colonne + 1].Franchissable)
                {
                    // Noeud adjacent #3 valide.
                    liste.Add(this.grille[noeud.Rangee - 1, noeud.Colonne + 1]);
                }
            }

            // Valider le noeud adjacent #6.
            if (noeud.Rangee < this.NombreRangees - 1 && noeud.Colonne > 0)
            {
                if (this.grille[noeud.Rangee + 1, noeud.Colonne].Franchissable &&
                    this.grille[noeud.Rangee, noeud.Colonne - 1].Franchissable &&
                    this.grille[noeud.Rangee + 1, noeud.Colonne - 1].Franchissable)
                {
                    // Noeud adjacent #6 valide.
                    liste.Add(this.grille[noeud.Rangee + 1, noeud.Colonne - 1]);
                }
            }

            // Valider le noeud adjacent #8.
            if (noeud.Rangee < this.NombreRangees - 1 && noeud.Colonne < this.NombreColonnes - 1)
            {
                if (this.grille[noeud.Rangee + 1, noeud.Colonne].Franchissable &&
                    this.grille[noeud.Rangee, noeud.Colonne + 1].Franchissable &&
                    this.grille[noeud.Rangee + 1, noeud.Colonne + 1].Franchissable)
                {
                    // Noeud adjacent #8 valide.
                    liste.Add(this.grille[noeud.Rangee + 1, noeud.Colonne + 1]);
                }
            }

            return liste;
        }
Exemplo n.º 3
0
        /// <summary>
        /// Constructeur paramétré initialisant les attributs de this. Les étiquettes H et G sont
        /// initialisés à 0, et la tuile correspondant au noeud est considérée comme franchissable.
        /// </summary>
        /// <param name="r">Rangée (dans le monde) de la tuile associée au noeud.</param>
        /// <param name="c">Colonne (dans le monde) de la tuile associée au noeud.</param>
        /// <param name="pos">Coordonnées (dans le monde) du pixel au centre de la tuile associée au noeud.</param>
        public PFNoeud(int r, int c, Vector2 pos)
        {
            this.h = this.g = 0;
            this.parent = null;

            this.rangee = r;
            this.colonne = c;
            this.positionTuile = pos;
            this.franchissable = true;
        }