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