Exemple #1
0
 // 对网格初始化
 private void initGrid(int Columns, int Rows)
 {
     for (int i = 0; i < Columns; i++)
     {
         Maze.ColumnDefinitions.Add(new ColumnDefinition());
     }
     for (int i = 0; i < Rows; i++)
     {
         Maze.RowDefinitions.Add(new RowDefinition());
     }
     g = new Maze_Grid[Columns, Rows];
     for (int i = 0; i < Columns; i++)
     {
         for (int j = 0; j < Rows; j++)
         {
             g[i, j] = new Maze_Grid(i, j);                             // 初始化坐标
             if (i == 0 || j == 0 || i + 1 == Columns || j + 1 == Rows) // 标边界
             {
                 g[i, j].Visited     = true;
                 g[i, j].isConnected = false;
             }
             else if (i % 2 == 0 || j % 2 == 0) // 标记墙
             {
                 g[i, j].Visited     = false;
                 g[i, j].isConnected = false;
             }
             else // 待打通的网格
             {
                 g[i, j].Visited     = false;
                 g[i, j].isConnected = true;
             }
         }
     }
 }
Exemple #2
0
        // 深度优先遍历法生成迷宫形状
        private void DFS(int xi, int yi, int xo, int yo)
        {
            Stack <Maze_Grid> st = new Stack <Maze_Grid>();

            st.Push(g[xi, yi]);
            Random rd = new Random();

            while (st.Count != 0)
            {
                Maze_Grid e         = st.Pop();   // 出栈
                int[]     direction = new int[4]; //  1, 2, 3, 4 分别代表左、上、右、下四个方向
                // 打乱数组
                int  j     = 0;
                bool exist = false;
                while (j < 4)
                {
                    exist = false;
                    int rand = rd.Next(1, 5);
                    foreach (int k in direction)
                    {
                        if (k == rand)
                        {
                            exist = true;
                        }
                    }
                    if (!exist)
                    {
                        direction[j] = rand;
                        j++;
                    }
                }
                foreach (int i in direction)
                {
                    switch (i)
                    {
                    case 1:
                        if (e.X - 2 > 0 && e.X - 2 > 1 && g[e.X - 2, e.Y].Visited == false)
                        {
                            if (e.X - 2 > 0)
                            {
                                g[e.X - 2, e.Y].Visited = true;
                            }
                            st.Push(g[e.X - 2, e.Y]);           //左方网格进栈
                            g[e.X - 1, e.Y].isConnected = true; //打通两个方块
                        }
                        break;

                    case 2:
                        if (e.Y + 2 > 0 && e.Y + 2 < yo && g[e.X, e.Y + 2].Visited == false)
                        {
                            g[e.X, e.Y + 2].Visited = true;
                            st.Push(g[e.X, e.Y + 2]);           //上方网格进栈
                            g[e.X, e.Y + 1].isConnected = true; //打通两个方块
                        }
                        break;

                    case 3:
                        if (e.X + 2 < xo && e.X + 2 < xo && g[e.X + 2, e.Y].Visited == false)
                        {
                            g[e.X + 2, e.Y].Visited = true;
                            st.Push(g[e.X + 2, e.Y]);           // 右方网格进栈
                            g[e.X + 1, e.Y].isConnected = true; //打通两个方块
                        }
                        break;

                    case 4:
                        if (e.Y - 2 > 0 && e.Y - 2 < yo && g[e.X, e.Y - 2].Visited == false)
                        {
                            if (e.Y - 2 > 0)
                            {
                                g[e.X, e.Y - 2].Visited = true;
                            }
                            st.Push(g[e.X, e.Y - 2]);           // 下方网格进栈
                            g[e.X, e.Y - 1].isConnected = true; //打通两个方块
                        }
                        break;

                    default:
                        break;
                    }
                }
            }
            // 去除边缘多余的墙
            if (xo % 2 == 0)
            {
                for (int i = 1; i < yo; i++)
                {
                    if (g[xo - 3, i].isConnected == true)
                    {
                        g[xo - 2, i].isConnected = true;
                    }
                }
            }
            if (yo % 2 == 0)
            {
                for (int i = 1; i < xo; i++)
                {
                    if (g[i, yo - 3].isConnected == true)
                    {
                        g[i, yo - 2].isConnected = true;
                    }
                }
            }
        }