我正在尝试在 C++ 中创建一个随机迷宫,但我无法开始,因为我不知道如何创建网格或单元格。我怎么能创造它?而且我还想使用 ASCII 字符来创建它。我怎样才能将它存储在数组中?(任何人都可以提供示例代码和一些解释,以便我更好地理解它)
另一个问题:我需要学习和使用哪些数据结构?我打算使用 Eller 算法或 Kruskal 算法。
谢谢你们帮助我!我是一个初学者程序员,我想了解这个,因为这是我项目的一部分,谢谢你变化很大!
我正在尝试在 C++ 中创建一个随机迷宫,但我无法开始,因为我不知道如何创建网格或单元格。我怎么能创造它?而且我还想使用 ASCII 字符来创建它。我怎样才能将它存储在数组中?(任何人都可以提供示例代码和一些解释,以便我更好地理解它)
另一个问题:我需要学习和使用哪些数据结构?我打算使用 Eller 算法或 Kruskal 算法。
谢谢你们帮助我!我是一个初学者程序员,我想了解这个,因为这是我项目的一部分,谢谢你变化很大!
典型算法的工作原理是将迷宫中的每个“单元”视为图形的一个顶点,从所有“墙”开始,然后删除与生成树相对应的一组墙。(所以为了使其随机化,它们中的许多都从随机权重开始并找到最小生成树。)至少对于小型迷宫,您不需要任何特殊的数据结构来表示单元;您可以将每个单元格视为一对(x,y)
(其坐标)。而且您也不需要任何数据结构(邻接矩阵/邻接列表)来存储图形的边缘,因为 的邻居(x,y)
只是(x,y±1)
和(x±1,y)
(忽略那些落在边界之外的)。
无论如何,一旦你有了生成树,你就会确切地知道哪些墙“存在”,哪些不存在,所以你对迷宫有完整的描述。如果你要画迷宫,你知道要画哪些。
要使用 ASCII 字符绘制,您只需逐行遍历:绘制“上墙”(--
如果墙存在于(x,y)
和之间,则放置一个“” (x,y+1)
),然后绘制实际行(|
如果墙在(x,y)
和之间,则放置一个“”)(x+1,y)
存在)。最后画出底部边界。
您可能希望将迷宫存储在二维字符数组中。您可以声明一个数组,无论是否在 C++ 中对其进行初始化。
char a[30][10]; // declares a char array of 30 rows and 10 columns.
// declare an array with 3 rows and 3 columns, and provide initial values
char ticTacToeBoard[3][3] = {{'x', 'x', 'o'},
{'o', 'o', 'x'},
{'x', 'o', ' '}
};
您可以将迷宫中墙壁的初始值更改为'|'
和,并为通道'-'
使用空格字符 , 。' '
任何一种初始化方法都有效,但您始终以相同的方式使用元素。这是清除上面初始化数组中的板的方法。
// clear the board
for (int row=0; row<3; row++) {
for (int col=0; col<3; col++) {
ticTacToeBoard[row][col] = ' ';
}
}
如果您想读取一个元素的值(在您尝试导航迷宫时很有用),您可以使用与设置其值时相同的下标表示法。
char y = a[2][2]; // reads the character in row 2, column 2
垂直墙:| 水平。墙: _
如果您使用的是固定宽度字体:
_____
| | _
|_ | |
__ | |
|_____|
我不确定该怎么做,但这是我要开始的地方。
确定网格上起点和终点的位置。然后,使用您想要的任何曲线创建一条路径。基本上,它应该是随机移动,每次检查这条路径是否还有办法到达终点。然后,从这条路径上移除一定数量的墙壁,并从这些洞中创建其他路径。继续此操作,直到您的空白空间用完。然后,也许,确保没有创建更短的路径。如果有,请阻止它们。