Esempio n. 1
0
 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();
         }
     }
 }
Esempio n. 2
0
 //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);
             }
         }
     }
 }
Esempio n. 3
0
        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);
            }
        }