//                                  //

        // gestion ouverture portes         //
        public void ouvrirPorte(Cellule celluleCourante, SoundEffect bruitPorte, String code)
        {
            //on cherche le mur correspondant à la porte, et on l'ouvre... Puis on fait pareil pour le mur opposé dans la cellule voisine
            foreach (var mur in celluleCourante.murs)
            {
                //on regarde si le mur est une porte et si le code entré par le joueur est le bon
                if (mur.Value.state.Equals(Etat.PORTE) && mur.Value.convertir(code))
                {
                    mur.Value.ouvrir();
                    foreach (var vois in celluleCourante.voisins)
                    {
                        if (vois.Item2.Equals(mur.Key))
                        {
                            bruitPorte.Play();
                            vois.Item1.murs[this.laby.opposes[mur.Key]].ouvrir();
                            //Et on complète les listes d'adjacence
                            celluleCourante.addAdjacent(vois);
                            vois.Item1.addAdjacent(new Tuple <Cellule, Direction>(celluleCourante, this.laby.opposes[mur.Key]));
                            break;
                        }
                    }
                    break;
                }
            }

            dessin_ConstrBuffersMursPortes(); //on actualise le buffer pour ne plus afficher la porte
        }
 /// <summary>
 /// créé une grille avec murs pleins
 /// </summary>
 private void initMaze()
 {
     for (int x = 0; x < tailleL; x++)
     {
         for (int y = 0; y < tailleC; y++)
         {
             maze[x, y] = new Cellule();
         }
     }
 }
        /// <summary>
        /// renvoie une liste des directions valides pour creuserChemins
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        private List <Direction> initDirectionsValides(Cellule c)
        {
            List <Direction> directionsValides = new List <Direction>();

            foreach (var voisin in c.voisins)
            {
                if (!voisin.Item1.visited)
                {
                    directionsValides.Add(voisin.Item2);
                }
            }
            directionsValides.shuffle();
            return(directionsValides);
        }
 /// <summary>
 /// ouvre le mur de la cellule donnée puis de sa cellule voisine / peut être utilisé pour ouvrir une porte
 /// </summary>
 /// <param name="c"></param>
 /// <param name="d"></param>
 private void ouvrirMur(Cellule c, Direction d)
 {
     c.murs[d].ouvrir();          //on ouvre le mur de la cellule c
     foreach (var t in c.voisins) //on cherche la cellule voisine à c correspondant à d
     {
         if (t.Item2.Equals(d))
         {
             t.Item1.murs[opposes[d]].ouvrir(); //on ouvre le mur à l'opposé de d dans la cellule voisine t.Item1
             c.addAdjacent(t);                  //on l'ajoute aux adjacents pour dire qu'on peut y aller physiquement depuis c
             Tuple <Cellule, Direction> cd = new Tuple <Cellule, Direction>(c, opposes[d]);
             t.Item1.addAdjacent(cd);           //et on ajoute c aux adjacents de t.Item1
             break;                             //il ne peut y en avoir qu'un
         }
     }
 }
        /// <summary>
        /// Recursive backtracking pour créer le labyrinthe
        /// Methode inspirée de http://weblog.jamisbuck.org/2010/12/27/maze-generation-recursive-backtracking
        /// </summary>
        /// <param name="posCouranteL"></param>
        /// <param name="posCouranteC"></param>
        private void creuserChemins(int posCouranteL, int posCouranteC)
        {
            Cellule c = this.maze[posCouranteL, posCouranteC];

            c.visited = true;
            List <Direction> directionsValides = initDirectionsValides(c);
            Direction        d;

            //foreach (Direction d in directionsValides)
            while (directionsValides.Count > 0)
            {
                d = Direction.INVALIDE;
                directionsValides = initDirectionsValides(c); //on actualise les directions valides
                if (directionsValides.Count > 1)              //on va vers un des voisins valide pris aléatoirement
                {
                    d = directionsValides.ElementAt(Game1.r.Next(directionsValides.Count));
                }
                else if (directionsValides.Count == 1)
                {
                    d = directionsValides.ElementAt(0);
                }
                foreach (var t in c.voisins) //on cherche la cellule voisine à c correspondant à d
                {
                    if (t.Item2.Equals(d))
                    {
                        if (d.Equals(Direction.NORD))
                        {
                            posCouranteL--;
                        }
                        else if (d.Equals(Direction.SUD))
                        {
                            posCouranteL++;
                        }
                        else if (d.Equals(Direction.EST))
                        {
                            posCouranteC++;
                        }
                        else if (d.Equals(Direction.OUEST))
                        {
                            posCouranteC--;
                        }
                        ouvrirMur(c, d);
                        creuserChemins(posCouranteL, posCouranteC);
                    }
                }
            }
        }
Пример #6
0
 /// <summary>
 /// Allows the game to run logic such as updating the world,
 /// checking for collisions, gathering input, and playing audio.
 /// </summary>
 /// <param name="gameTime">Provides a snapshot of timing values.</param>
 protected override void Update(GameTime gameTime)
 {
     this.celluleCourante = labyrinthe.laby.maze[((int)this.camera3D.position.X / this.tailleMurs), ((int)this.camera3D.position.Z / this.tailleMurs)];
     this.ks = Keyboard.GetState();
     // Allows the game to exit
     if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || ks.IsKeyDown(Keys.Escape))
     {
         this.Exit();
     }
     if (ks.IsKeyDown(Keys.R)) //efface le code a l'appui sur R
     {
         this.code = "";
     }
     entreesClavierCode();
     camera3D.Update(gameTime);
     if (this.celluleCourante.Equals(labyrinthe.laby.maze[this.tailleLabyL - 1, this.tailleLabyC - 1]))
     {
         loadMap2();
     }
     this.hud.Update(gameTime);
     base.Update(gameTime);
 }