private void CreateGrid() { grid = new MazeNode[sizeX, sizeZ]; for (int i = 0; i < sizeX; i++) { for (int j = 0; j < sizeZ; j++) { grid[i, j] = new MazeNode(); } } }
//Cleans up walls that are on the exact same position(only one of them). This happens because Prim's algorithms only //removes walls to make connections so two adjacent tiles that are not connected will inevitably have two walls between them private void CleanupDuplicates() { foreach (MazeNode currentNode in grid) { foreach (WallNode currentWall in currentNode.Walls) { MazeNode wallNeighbor = currentWall.Neighbor; if (wallNeighbor != null) { int oppositeWall = -(int)currentWall.Orientation; wallNeighbor.RemoveWall(oppositeWall); } } } }
private void GenerateMaze() { MazeNode startingNode = grid[0, 0]; List <WallNode> openSet = new List <WallNode>(); HashSet <MazeNode> closedSet = new HashSet <MazeNode>(); openSet.AddRange(startingNode.Walls); closedSet.Add(startingNode); while (openSet.Count != 0) { int randomIndex = UnityEngine.Random.Range(0, openSet.Count); WallNode currentWall = openSet[randomIndex]; MazeNode neighborOfCurrentWall = currentWall.Neighbor; if (neighborOfCurrentWall != null && !closedSet.Contains(neighborOfCurrentWall)) { currentWall.Parent.RemoveWall(currentWall); int oppositeWallToRemove = -(int)currentWall.Orientation; neighborOfCurrentWall.RemoveWall(oppositeWallToRemove); openSet.AddRange(neighborOfCurrentWall.Walls); closedSet.Add(neighborOfCurrentWall); } openSet.Remove(currentWall); } }