// // // 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); } } } }
/// <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); }