递归迷宫生成

3

我无意中将此问题发布到我的另一个帐户上,因此我删除了该帖子并在此帐户上重新发布。

所以我想为了好玩而创建迷宫生成算法,但遇到了一点困难。我写的算法会放入无法到达和没有出口的空格。问题可能是什么?

这就是我的意思:

# # # # # # # # # # # # # # # # # # # # # 
# . . . . . # . # . . . # . # . # . . . # 
# . # # # . # . # # # . # # # . # # # # # 
# . . . # . # . # . . . . . # . . . . . # 
# # # . # . # . # # # # # . # # # . # # # 
# . . . # . # . . . . . # . # . # . # . # 
# . # # # . # # # # # . # # # . # . # . # 
# . # . # . . . . . # . . . . . . . # . # 
# . # . # . # # # # # # # . # # # . # # # 
# . # . # . . . . . . . # . . . # . # . # 
# . # . # # # # # # # . # . # . # # # . # 
# . # . # . . . . . . . # . # . # . . . # 
# # # # # . # # # # # # # . # . # . # # # 
# . # . . . # . . . . . . . # . # . # . # 
# . # # # . # . # # # # # # # # # . # # # 
# . . . # . . . # . # . . . . . . . # . # 
# # # . # # # . # # # # # # # . # # # . # 
# . # . # . . . . . # . . . # . . . . . # 
# # # . # . # # # . # . # # # . # # # . # 
# . # . . . # . # . # . # . . . . . # . # 
# # # # # # # # # # # # # # # # # # # # # 

以下是我的代码
描述:
创建一个完全由连接单元格组成的迷宫。如上所述,0表示向上,1表示向下,2表示向右,3表示向左,orientTo记录dfs是向上/向下/向左/向右移动以到达当前单元格。 在mazeGen函数中:生成您来自的单元格,现在删除当前单元格和上一个单元格之间的墙壁。生成当前单元格的所有邻居,并将它们随机排列成一个数组,该数组包含x、y和dfs移动到此邻居单元格的方向。现在遍历此数组并使用这些邻居值递归调用dfs。


2
你为什么有多个账号? - Blorgbeard
通过删除,您丢失了我的评论。我再说一遍:我没有检查其他错误,但是您的“随机排列”可能会将相同的邻居放入多个插槽中,我怀疑这不是您想要的。请使用Shuffle。 - keshlam
这是一个意外,我在programmers.stackexchange上按了“使用Facebook登录”按钮,结果创建了一个全新的账户,然后帖子被迁移到了这里。所以我只好将其删除并重新发布。 - ultrainstinct
另外,keshlam,它真的这样吗?我问这个问题是因为if(points [j] [0] .....)行确保它不会这样,因为它检查条目是否已经添加到另一个位置。 - ultrainstinct
好的,你可能是对的。这是一种有点内部化的方式来做你想做的事情,但是... - keshlam
请注意,您本来可以并且仍然可以合并账户 - Bernhard Barker
1个回答

2
我认为迷宫空间(非墙壁)应该组成一棵树。这意味着所有的空间都连接在一起,并且每对空间之间只有一条路径。
由于树没有循环,因此可以通过破坏任何发现的循环来创建迷宫。可以通过查找循环(DFS)并将任何位于检测到的循环中的空间设置为墙壁来完成。直到没有循环为止,这可以在一次DFS遍历中完成。选择不同的起始空间和随机选择邻居进行前进来创建不同的迷宫。

所以基本上要填充所有的空格,如果有一些部分没有被填充,就选择一个随机的墙壁单元,并打破它? - ultrainstinct
是的,随机地填充空格,如果填充发现已经被填充的单元格,则在正在填充的单元格上设置一堵墙。 - Ante
这似乎比迷宫生成算法应该做的更多,难道没有一种方法可以将这种逻辑纳入dfs中吗?比如说,它永远不会创建封闭空间。 - ultrainstinct
维基百科有很好的描述和漂亮的视频 - Ante
是的,我明白了,我只是改变了代码的顺序,并删除了记录上一个访问单元格的参数。现在它会生成下一个单元格。 - ultrainstinct

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接