【问题标题】:Best logic for creating a (true) random labyrinth创建(真正的)随机迷宫的最佳逻辑
【发布时间】:2010-06-28 16:30:45
【问题描述】:

我一直在尝试制作一个简单的游戏来测试我的逻辑,它是一个简单的迷宫,它很丑陋,而且到目前为止很烂。

引擎工作得很好,考虑到迷宫已经存在(一个矩阵),它甚至可能很有趣,但我无意绘制一堆地图,这可能是在 400 (20x20) 字段上设置值一个矩阵。不好笑。

然后我创建了一个函数来随机化它,为每个字段设置地板/墙壁,并且(我预计)并非每张地图都是可赢的。然后我创建了另一个函数来检查地图是否可播放(接收两个点,并检查它们之间是否存在有效路径,然后我只传递开始和结束。非常漂亮)并且它起作用了。

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

1 - 它可能很容易出现(巨大的地板小岛,或一堆墙壁在一起,只形成一条非常明显的路径,创建一个愚蠢的(虽然有效)迷宫
2 - 这可能是创建完美随机迷宫的最快方法,但同时它也可能是最慢的,只要...无限长。当我将网格设置为 30x30 或更大(当某些东西没有溢出时)
3 - 这很愚蠢,并且违反了逻辑本身。

在我的辩护中,我并没有从一开始就打算这样做,如上所述,一件事导致另一件事。

所以我开始考虑如何制作一个漂亮的(充满路径、棘手且可赢的)迷宫,然后我考虑制作带有预先设计的入口的微小(比方说)5x5 块并将它们安装在一起它适合的方式,但它会违背我的真正随机愿望,以及我不愿意用手画它。

然后我想了一个函数来创建一条随机路径,运行一次到最后,然后运行几次到接近尽头的某个地方,还有一些交叉路口之类的东西,一些创建死胡同,这似乎更好对我来说,但我无法想象它创造了一个像样的迷宫。

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

注意:我无意用任何东西伤害任何人的电脑。
第一个打开它的人,请在此处评论说它是安全的。 - 完成(谢谢,Jonno_FTW )

如果您仍然不信任它,请使用虚拟机。

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

【问题讨论】:

  • 问题是什么?另外,你有没有研究过maze generation algorithms
  • 我宁愿说,这不是特定于语言的问题...
  • 虽然我不喜欢游戏设计,但让你在这样的原则上挑战自己的精神还是值得称赞的。拥有“黑匣子”很好,但如果你能经历这些场景而不是总是有一个“给定的”,那么建立在你的知识基础上的未来发展将带你走得更远......恕我直言......祝你好运。
  • 我不怀疑有人会从某个随机来源下载可执行文件。
  • 可执行文件是合法的。虽然,当您单击新地图时,它会从您离开上一张地图的位置开始,而不是从原来的左上角开始。计步器也不错。我还想要一张更大的地图,至少让它具有挑战性。

标签: c# language-agnostic random logic


【解决方案1】:

我已经完成了迷宫生成。您不想随机放置东西并进行验证。相反,您从一个起点生成它。

选择一个起点,沿随机方向移动。有选择新方向的随机概率。永远不要进入一个被占领的广场,如果你撞到一个当前的小径就结束了。如果当前路径结束,请选择一个您已经访问过的广场并选择一个新方向并像第一个一样随机行走。重复直到迷宫填满为止。

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

【讨论】:

    【解决方案2】:

    这是一个专门用于迷宫的大型网站: http://www.astrolog.org/labyrnth/algrithm.htm

    解释迷宫有哪些类型,复习生成算法和解算法,有很多很酷的图片。

    【讨论】:

      【解决方案3】:

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

      Code for Dungeon.java

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

      1. 从一张空白地图开始
      2. 在地图中随机创建一个房间/开放空间
      3. 在当前开放区域的边缘随机选择一个图块
      4. 尝试从该空间中随机“扩展”一条走廊或房间(如果不适合,则不执行任何操作)
      5. 根据需要多次循环返回步骤 3,以创建一个像样的迷宫
      6. 最后,遍历整个地图并将剩余的空白区域转换为墙壁

      这是你得到的东西类型的屏幕截图(查看迷宫结构中的小地图):

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

      【讨论】:

        【解决方案4】:

        你的问题让我想到了XScreensaver Maze 程序。看看它的screenshots 看看这是否是你想要的效果。

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

        【讨论】:

          【解决方案5】:

          维基百科在Maze generation algorithms上有一篇很棒的文章

          【讨论】:

            【解决方案6】:

            如何创建随机迷宫取决于您希望它的外观。如果您正在创建一些设计为有很多死胡同的东西,那么您可以“随机”跟踪从起点到终点的路径,然后随机填充空白处,基本上将路径雕刻出来一块坚固的材料。例如。想象你有一块石碑。第一步是开辟“解决方案”路径。然后你就会进去,走完所有的死胡同。

            如果您想要的东西更像是“玩”而不是“拼图”,那么创建一堆以不同方式组合在一起的拼贴块可能是可行的方法。据我所知,暗黑破坏神游戏就是这样做的;许多预先设计的“集合”和关于它们如何组合在一起的规则。你可以用诸如“三个空位,两个闭口”之类的标记块的四个边,然后如果另一块也有匹配的描述,它们可以放在一起。

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

            【讨论】:

            • 这有利于制作更好的地形,但代价是远不及灵活性。细节会有所不同,但瓷砖生成的关卡的基本性质是相同的。你需要大量的瓷砖来避免这个问题。
            • 好吧,OP 是提出联锁瓷砖想法的人。图形保真度和地图复杂性之间需要权衡取舍。
            【解决方案7】:

            实际上,Al Lowe 在他的 Leisure Suit Larry 游戏中使用了一个技巧(我相信 LSL 3)可能会有所帮助。

            基本上,他制作了一个玩家必须导航的竹林“迷宫”。然而,他并没有为每个屏幕创建一个单独的“正方形”迷宫,而是简单地“翻转”了他已经创建的一个屏幕,并通过一个单一的“竹墙”图形堵住了各个入口,从而造成了死胡同。

            也许你也可以这样做:让生成器雕刻出一个有效的迷宫,然后让它沿着一些路径放置死胡同。这将确保始终有至少一条有效的、开放的通往“终点线”的路径,并防止玩家只是在超级简单的布局中漫步。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-07-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-06-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多