2008-12-28 48 views
4

我想在C++中创建一个随机迷宫,但我无法启动,因为我不知道如何创建网格或单元格。我怎么能创造它?我也想用ASCII字符创建它。我怎么能将它存储在数组中? (可以给任何一个示例代码和一些解释,所以我可以更好地理解它)如何在C++中为随机迷宫创建单元格或网格?

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

谢谢你们帮助我!我是一个begginer程序员,我想了解这一点,因为这是我的项目的一部分,谢谢你差异很大!

回答

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 
+0

你好,先生!非常感谢您的回答!!现在我明白谢谢你了! – jessemiel 2008-12-29 02:34:59

7

您是否在寻找Maze generation algorithmsmore)?你的问题是算法还是图形?

典型算法通过将迷宫中的每个“单元”视为图的顶点来工作,从所有“墙”开始,并移除与生成树对应的一组墙。 (所以为了随机化它们,很多都是从随机权重开始,找到最小生成树。)至少对于小型的迷宫来说,你不需要任何特殊的数据结构来表示单元;你可以把每个细胞想象成一对(x,y)(它的coördinates)。并且因为(x,y)的邻居只是(x,y±1)(x±1,y)(忽略那些超出边界的那些邻居),所以您不需要任何数据结构(邻接矩阵/邻接列表)来存储图的边缘。

在任何情况下,一旦您拥有生成树,您就会确切地知道哪些墙存在,哪些不存在,因此您可以完整描述迷宫。如果你要绘制迷宫,你知道要绘制哪些。

要使用ASCII字符画,你只是一个穿过每行一个:画“上墙”(把“--”如果(x,y)(x,y+1)存在之间的墙),然后绘制实际行(放如果存在(x,y)(x+1,y)之间的墙壁,则为“|”)。最后画出底部边界。

+0

谢谢先生回答,如果对你没问题,你能给我一个样本代码让我更好地理解它吗?谢谢你somuch先生! – jessemiel 2008-12-28 20:14:18

0

垂直壁:| | Horiz。华尔街:_

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

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

我不知道到底该怎么做,但在这里就是我会开始。

确定网格上的起点和终点将在哪里。然后,创建一个单一的路径,以任何你想要的扭曲。基本上,它应该是随机移动,每次都检查是否还有一条路可以走到最后。然后,从该路径上移除一定数量的墙,并从这些孔创建其他路径。继续操作,直到空间用完。然后,也许,确保没有创建更短的路径。如果他们有,阻止他们。