4

我正在尝试在 C++ 中创建一个随机迷宫,但我无法开始,因为我不知道如何创建网格或单元格。我怎么能创造它?而且我还想使用 ASCII 字符来创建它。我怎样才能将它存储在数组中?(任何人都可以提供示例代码和一些解释,以便我更好地理解它)

另一个问题:我需要学习和使用哪些数据结构?我打算使用 Eller 算法或 Kruskal 算法。

谢谢你们帮助我!我是一个初学者程序员,我想了解这个,因为这是我项目的一部分,谢谢你变化很大!

4

3 回答 3

7

您在寻找迷宫生成算法更多)吗?你的问题是算法还是图形?

典型算法的工作原理是将迷宫中的每个“单元”视为图形的一个顶点,从所有“墙”开始,然后删除与生成树相对应的一组墙。(所以为了使其随机化,它们中的许多都从随机权重开始并找到最小生成树。)至少对于小型迷宫,您不需要任何特殊的数据结构来表示单元;您可以将每个单元格视为一对(x,y)(其坐标)。而且您也不需要任何数据结构(邻接矩阵/邻接列表)来存储图形的边缘,因为 的邻居(x,y)只是(x,y±1)(x±1,y)(忽略那些落在边界之外的)。

无论如何,一旦你有了生成树,你就会确切地知道哪些墙“存在”,哪些不存在,所以你对迷宫有完整的描述。如果你要画迷宫,你知道要画哪些。

要使用 ASCII 字符绘制,您只需逐行遍历:绘制“上墙”(--如果墙存在于(x,y)和之间,则放置一个“” (x,y+1)),然后绘制实际行(|如果墙在(x,y)和之间,则放置一个“”)(x+1,y)存在)。最后画出底部边界。

于 2008-12-28T19:56:16.610 回答
2

您可能希望将迷宫存储在二维字符数组中。您可以声明一个数组,无论是否在 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
于 2008-12-28T22:51:54.150 回答
0

垂直墙:| 水平。墙: _

如果您使用的是固定宽度字体:

 _____
| |  _
|_  | |
 __ | |
|_____|

我不确定该怎么做,但这是我要开始的地方。

确定网格上起点和终点的位置。然后,使用您想要的任何曲线创建一条路径。基本上,它应该是随机移动,每次检查这条路径是否还有办法到达终点。然后,从这条路径上移除一定数量的墙壁,并从这些洞中创建其他路径。继续此操作,直到您的空白空间用完。然后,也许,确保没有创建更短的路径。如果有,请阻止它们。

于 2008-12-28T20:01:30.077 回答