// 对网格初始化 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; } } } }
// 深度优先遍历法生成迷宫形状 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; } } } }