创建(真正的)随机迷宫的最佳逻辑

时间:2010-06-28 16:30:46

标签: c# language-agnostic random logic

我一直试图制作一个简单的游戏来测试我的逻辑,它是一个简单的迷宫,它很难看,而且到目前为止很糟糕。

引擎工作得非常好,因为迷宫已经存在(矩阵),它甚至可能令人愉快,但我无意绘制一堆地图,这可能是在400(20x20)个字段上设置值矩阵。不好笑。

然后我创建了一个函数来随机化它,为每个字段设置floor / wall,并且(我预期)不是每个map都可以winnable。然后我做了另一个函数来检查地图是否可以播放(接收两个点,并检查它们之间是否存在有效路径,然后我只是通过开始和结束。非常漂亮)并且它有效。

如果您没有注意到,由于以下原因,这是创建我的随机迷宫的一种非常愚蠢的方式:

1 - 它可能很容易出现(地板的巨大岛屿,或一堆墙壁在一起,只有一条非常明显的路径,创造一个stupit(虽然有效)迷宫 2 - 这可能是创造一个完美的随机迷宫EVER的最快方式,但与此同时它也可能是最慢的,只要......无限。当我将网格设置为30x30或更高(当某些东西没有溢出时)时,会注意到这种差异 3 - 这是逻辑本身的愚蠢和冒犯。

在我的意图中,我没有计划从一开始就这样做,如上所述,有一件事导致了另一件事。

所以我开始考虑如何做一个美丽的(充满路径,狡猾和可赢)迷宫,然后我想到制作带有预先设计的入口的小型(比方说)5x5块并将它们安装在一起它适合的方式,但它会违背我的 真正的 随机欲望,以及我不愿意手工绘制它。

然后我想到了一个函数来创建一个随机路径,运行它一次到最后,并运行它几次到接近结束的地方,一些交叉和东西,一些创建死角,这似乎更好对我来说,但我无法想象它会创造一个像样的迷宫。

You can check what I've done so far in this link.

注意:我无意用任何东西伤害任何人的电脑 第一个打开它,请在这里评论说它是安全的。 - 完成(谢谢你,Jonno_FTW)
如果您仍然不信任它,请使用虚拟机。

OBS:我知道这不是开发任何东西的最佳方式。我应该得到一个不错的游戏引擎,bla bla bla,这对我自己来说是一种挑战。

7 个答案:

答案 0 :(得分:4)

我做了迷宫一代。您不想随意放置内容并进行验证。相反,你从起点开始生成它。

选择一个起点,随机移动。有随机概率选择新方向。如果碰到一条当前的小道结束,切勿进入占用的广场。如果当前路径结束,则选择一个已经访问过的方块并选择一个新方向并像第一个那样随机行走。重复,直到迷宫充满你希望的那样。

方向改变的概率应该是一个输入参数,因为它会产生很大的不同。请注意,如果您正在进行3D迷宫,则垂直转弯的几率应远低于水平移动的几率。

答案 1 :(得分:4)

这是一个致力于迷宫的广阔网站: http://www.astrolog.org/labyrnth/algrithm.htm

解释有哪些类型的迷宫,通过生成算法和解决方案算法,有很多很酷的图片。

答案 2 :(得分:3)

看看我的Roguelike游戏中的源代码,暴君:

Code for Dungeon.java

有许多不同的地图生成技术用于生成不同的关卡类型。但最基本的模式是迭代以下内容:

  1. 以空白地图开始
  2. 在地图中创建一个随机房间/开放空间
  3. 在当前开放区域的边缘随机选择一个图块
  4. 尝试从该空间随机“走出”走廊或房间(如果它不适合,什么都不做)
  5. 根据需要多次循环回到步骤3以创建一个像样的迷宫
  6. 最后,对整个地图进行传递并将剩余的空白空间转换为墙
  7. 这是你得到的东西的截图(从迷宫结构看迷你地图):

    Tyrant screenshot http://www.freeimagehosting.net/uploads/af45502c9c.png

答案 3 :(得分:2)

您的问题让我想起了XScreensaver Maze计划。看看它的screenshots,看看是否有预期效果。

它看起来像是来自维基百科的maze generation algorithm

答案 4 :(得分:2)

维基百科有一篇关于Maze generation algorithms

的精彩文章

答案 5 :(得分:1)

如何创建随机迷宫将取决于您希望它看起来像什么。如果您正在创建一些设计为具有大量死角的东西,那么您可以“随机”跟踪从起点到终点的路径,然后随机填充空白区域,基本上将路径划分为坚固的材料块。例如。想象你有一块石碑。第一步是雕刻“解决方案”路径。然后你就进去做出所有死路一条。

如果你想要一些比“谜题”更“玩”的东西,那么创建一堆以不同方式组合在一起的瓷砖片可能就是要走的路。就我所知,暗黑破坏神游戏就是这样做的。一些预先设计的“套装”和关于它们如何组合在一起的规则。你要用“三个开放空间后跟两个封闭的”标记块的四边,然后如果另一块也有匹配的描述,它们可以组合在一起。

之后,您所要做的就是弄清楚如何始终如一地呈现“随机”行为。

答案 6 :(得分:1)

实际上,Al Lowe用于他的休闲套装Larry游戏(LSL 3,我相信)可能会有所帮助。

基本上,他制作了一个竹林迷宫,玩家不得不导航。然而,他不是为每个屏幕创建一个单独的迷宫“正方形”,而是简单地“翻转”他已经创建的一个屏幕,并通过用一个“竹墙”图形阻挡各种入口来制作死角。

也许你也可以这样做:让发生器雕刻一个有效的迷宫,然后告诉它在一些路径上放置死端块。这将确保始终至少有一条有效的,开放的“终点线”路径,以及阻止玩家漫步超级简单的布局。

它还可以使30x30的迷宫更加可行,因为计算机无需测试900平方网格的每个方格的有效性。