Пример #1
0
        public override PM_Maze Generate_Maze(
            Random randomness_provider,
            int width,
            int height
            )
        {
            // initialize maze
            PM_Maze maze = new PM_Maze(width, height);

            Vec2i          current_position = maze.RandomCell(randomness_provider);
            List <UEdge2i> expansion_edges  = maze.Cell_ExpansionEdges_List(current_position);

            expansion_edges.Shuffle(randomness_provider);

            while (expansion_edges.Count > 0)
            {
                UEdge2i selected_edge = expansion_edges.Pop_Last_Item(); // select & remove (draw) the last edge
                current_position = selected_edge.exit;
                if (maze.Q_Is_Cell_Unconnected(current_position))
                {
                    maze.OP_AddEdge(selected_edge);
                    List <UEdge2i> newEdges = maze.Cell_ExpansionEdges_List(current_position);
                    newEdges.Shuffle(randomness_provider);
                    expansion_edges.AddRange(newEdges);
                }
            }
            return(maze);
        }
        public static void Fill_Random_DFS(
            this PM_Maze maze,
            Random rand
            )
        {
            if (maze == null)
            {
                return;
            }
            List <UEdge2i> allPossibleEdges = maze.ConnectedCells_ExpansionEdges_List();

            // temporarily commented out
            allPossibleEdges.Shuffle(rand);

            while (allPossibleEdges.Count > 0)
            {
                UEdge2i edge = allPossibleEdges.Pop_Last_Item();
                if (maze.Q_Is_Cell_Unconnected(edge.exit))
                {
                    maze.OP_AddEdge(edge);
                    List <UEdge2i> newEdges = maze.Cell_ExpansionEdges_List(edge.exit);
                    newEdges.Shuffle(rand);
                    allPossibleEdges.AddRange(newEdges);
                }
            }
        }
 public static List <UEdge2i> Cell_ExpansionEdges_List(
     this PM_Maze maze,
     int x,
     int y
     )
 {
     return(maze.Cell_ExpansionEdges_List(new Vec2i(x, y)));
 }
Пример #4
0
        public override PM_Maze Generate_Maze(
            Random rand,
            int width,
            int height
            )
        {
            PM_Maze        maze                     = new PM_Maze(width, height);
            Vec2i          current_position         = new Vec2i(rand.Next(width), rand.Next(height));
            List <UEdge2i> possible_expansion_edges = maze.Cell_ExpansionEdges_List(current_position);

            while (possible_expansion_edges.Count > 0)
            {
                UEdge2i edge = possible_expansion_edges.Pop_Random_Item(rand);
                current_position = edge.exit;
                if (maze.Q_Is_Cell_Unconnected(current_position))
                {
                    maze.OP_AddEdge(edge);
                    List <UEdge2i> newEdges = maze.Cell_ExpansionEdges_List(current_position);
                    possible_expansion_edges.AddRange(newEdges);
                }
            }
            return(maze);
        }
        public static List <UEdge2i> ConnectedCells_ExpansionEdges_List(
            this PM_Maze maze
            )
        {
            List <UEdge2i> expansionEdges = new List <UEdge2i>();
            List <Vec2i>   connectedCells = maze.ConnectedCells_List();

            foreach (var cell in connectedCells)
            {
                if (maze.Q_Is_Cell_Connected(cell))
                {
                    expansionEdges.AddRange(maze.Cell_ExpansionEdges_List(cell));
                }
            }
            return(expansionEdges);
        }
        public static void Fill_RandomBFS(
            this PM_Maze maze,
            Random rand
            )
        {
            if (maze == null)
            {
                return;
            }
            // edges
            List <UEdge2i> edges = maze.ConnectedCells_ExpansionEdges_List();

            while (edges.Count > 0)
            {
                UEdge2i edge = edges.Pop_Random_Item(rand);
                if (maze.Q_Is_Cell_Unconnected(edge.exit))
                {
                    maze.OP_AddEdge(edge);
                    edges.AddRange(maze.Cell_ExpansionEdges_List(edge.exit));
                }
            }
        }