Esempio n. 1
0
        public static MazeWall Generate(MazeWall wall)
        {
            mazeWall = wall;
            walls.Clear();

            //封闭全部墙壁
            mazeWall.ClosedAllWall();

            //初始化并查集
            UnionFindSet set = new UnionFindSet
                                   (mazeWall.RowLength * mazeWall.ColLength);

            Init();


            while (walls.Count > 0)
            {
                int randomIndex = Random.Range(0, walls.Count);
                var _wall       = walls[randomIndex];



                if (set.Union(
                        GetUnionSetIndex(_wall.Key),
                        GetUnionSetIndex(_wall.Value)))
                {
                    mazeWall.OpenArea(_wall.Key, _wall.Value);
                }

                walls.RemoveAt(randomIndex);
            }



            //随机选择迷宫起点终点
            mazeWall.RandomOpenStartAndPoint();
            mazeWall.RandomOpenStartAndPoint();

            return(mazeWall);
        }
Esempio n. 2
0
        public static MazeWall Generate(MazeWall wall)
        {
            mazeWall = wall;
            walls.Clear();

            //封闭全部墙壁
            mazeWall.ClosedAllWall();

            //随机选择一个开始区域
            WallArea fistArea = RandChooseBeginArea();

            AddNerabyWall(fistArea);

            while (walls.Count > 0)
            {
                int randomIndex = Random.Range(0, walls.Count);
                var _wall       = walls[randomIndex];
                if (checkWall(_wall))
                {
                    mazeWall.OpenArea(_wall.Key, _wall.Value);
                    if (checkArea(_wall.Key))
                    {
                        AddNerabyWall(_wall.Key);
                    }
                    if (checkArea(_wall.Key))
                    {
                        AddNerabyWall(_wall.Value);
                    }
                }
                walls.Remove(_wall);
            }

            //随机选择迷宫起点终点
            mazeWall.RandomOpenStartAndPoint();
            mazeWall.RandomOpenStartAndPoint();

            return(mazeWall);
        }
        /// <summary>
        /// 分割
        /// </summary>
        private static void RecursiveDivision(
            int rowstart,
            int rowend,
            int colstart,
            int colend)
        {
            if (rowend < rowstart)
            {
                return;
            }
            if (colend < colstart)
            {
                return;
            }

            //条件不允许再分成四块了
            if (1 >= rowend - rowstart)
            {
                WallArea preArea = new WallArea(rowstart, colstart);
                for (int i = colstart + 1; i < colend; ++i)
                {
                    WallArea curArea = new WallArea(rowstart, i);
                    mazeWall.OpenArea(preArea, curArea);
                    preArea = curArea;
                }
                return;
            }
            if (1 >= colend - colstart)
            {
                WallArea preArea = new WallArea(rowstart, colstart);
                for (int i = rowstart + 1; i < rowend; ++i)
                {
                    WallArea curArea = new WallArea(i, colstart);
                    mazeWall.OpenArea(preArea, curArea);
                    preArea = curArea;
                }
                return;
            }

            //分块
            int randomRow = UnityEngine.Random.Range(rowstart + 1, rowend);
            int randomCol = UnityEngine.Random.Range(colstart + 1, colend);

            //随机找到四个分界线上四个洞
            List <KeyValuePair <WallArea, WallArea> > FourHoles = new List <KeyValuePair <WallArea, WallArea> >();
            int index = Random.Range(colstart, randomCol);

            FourHoles.Add(new KeyValuePair <WallArea, WallArea>(
                              new WallArea(randomRow - 1, index),
                              new WallArea(randomRow, index)
                              ));
            index = Random.Range(randomCol, colend);
            FourHoles.Add(new KeyValuePair <WallArea, WallArea>(
                              new WallArea(randomRow - 1, index),
                              new WallArea(randomRow, index)
                              ));
            index = Random.Range(rowstart, randomRow);
            FourHoles.Add(new KeyValuePair <WallArea, WallArea>(
                              new WallArea(index, randomCol - 1),
                              new WallArea(index, randomCol)
                              ));
            index = Random.Range(randomRow, rowend);
            FourHoles.Add(new KeyValuePair <WallArea, WallArea>(
                              new WallArea(index, randomCol - 1),
                              new WallArea(index, randomCol)
                              ));

            //打通其中三个洞
            index = Random.Range(0, 4);
            FourHoles.RemoveAt(index);
            for (int i = 0; i < 3; ++i)
            {
                mazeWall.OpenArea(FourHoles[i].Key, FourHoles[i].Value);
            }


            //递归分割
            RecursiveDivision(rowstart, randomRow, colstart, randomCol);
            RecursiveDivision(randomRow, rowend, colstart, randomCol);
            RecursiveDivision(rowstart, randomRow, randomCol, colend);
            RecursiveDivision(randomRow, rowend, randomCol, colend);
        }