在本教程中,我将讨论用于描述过程生成器的两个术语:
生成空间和
可能性空间 。 我们将定义这两个术语,然后考虑交互示例以了解它们之间的区别。 这些术语对于描述过程生成器以及理解两个生成器之间的区别非常有用。 让我们开始吧!
想象一本巨大的书,其中提供了每个Minecraft世界的屏幕截图。 每个屏幕截图都标记有一个
随机种子 ,您可以输入一个唯一的数字来进入Minecraft并生成这个世界。 第一页显示了种子= 0生成的世界,下一页显示了种子= 1生成的世界,依此类推。 总的来说,《我的世界》世界生成器包含2
64个随机生成值,这是一个巨大的数字:游戏可以生成18 446 744 073 073 709 551 616世界。 每次您单击“新世界”时,都会基于这些种子之一创建一个世界。 2
64是Minecraft
生成空间的大小
,游戏可以生成很多东西。
现在想象一下,《我的世界》世界仅由普通草组成,无休止地向各个方向扩散。 在它下面没有洞穴,没有石头,没有树木和丘陵,没有动物。 只有一层草砖。 除了非常无聊之外,Minecraft绝不会产生这样的世界(除非使用了装饰)。 我们可以想象,可以描述它,甚至可以打开Minecraft并手动创建它-但Minecraft无法生成它。
我们怎么知道呢? 您可以通过许多不同的方式证明这一点,但是记住Minecraft生物群落的最简单方法是在遍布世界的沙漠或丛林地区。 因此,在我们的草世界示例中,它们不是,因此,我们知道无法使用标准生成器创建它们。
草世界位于我们所谓的Minecraft世界
机会空间中 ,即我们可以想象,想象或描述的所有Minecraft世界的集合。 但是草世界
不在 Minecraft
生成空间中 ,因为它不能由游戏的程序生成器创建。 我们可以想象Minecraft的世界与波斯波利斯的精确复制品成比例,或者以坐着阅读本文的石雕形式出现的世界-所有这些都是Minecraft的
可能世界,但它们不是由游戏产生的。
上面显示的图让我们对它们的外观有了一个想法。 Minecraft生成空间中的所有事物也都必须在其可能性空间中,因为如果Minecraft可以生成某些东西,那么应该可以在Minecraft中创建它! 但是,并非所有可能的空间都在世代空间中,包括我们在一个由草组成的世界中的例子。 但是此方案不考虑规模。 实际上,Minecraft的可能性空间比其生成空间大得多。
要了解它的大小,让我们计算一个Minecraft世界的大小。 体积是宽度乘以高度,再乘以深度。 默认情况下,Minecraft世界的高度为256个图块,并且它们从起点开始在各个方向上分为大约30,000,000个图块,即,世界的大致体积为:
256 x 60 000 000 x 60 000 000 = 921 600 000 000 000 000
这些块中的每一个都可以是任何元素:石头,草,水,空气。 为了进行评估,我们将很慷慨,并且仅使用“世界方块”,根据Minecraft Wiki,它是
64种 。 这意味着Minecraft世界中的每个区块都有64种可能的状态。 计算可能世界的数量的公式等于将每个块的状态选项的数量提高到块数量的幂:
64 921 600 000 000 000 000 Minecraft
这个数字太大,以至于我在互联网上找不到可以计算出来的计算器。
为了更深入地研究生成和可能性的空间,我们需要一个可以更好地融入我们头脑的例子。 因此,在本教程的其余部分中,我们将研究适用于
Super Mario Bros等游戏的2D平台游戏的等级。 或
Spelunky 。 我们将研究2D平台游戏的多个关卡生成器。 在原始文章中,它们都是交互式的,因此您可以生成自己的关卡。 在研究它们的过程中,我们将询问有关它们的生成空间的问题。
所有示例都可以在我们的GitHub上找到,它是用Processing编写的开源草图 。
在学习过程中,我将以粗体提出一些问题,例如:
这些平台化平台的机会空间有多大? 如果您只想阅读本文并尝试使用示例,则可以安全地跳过它们。 我有时还会添加提示以帮助回答问题,例如:
提示:关卡的宽度为40个图块,高度为10个图块,每个图块可以是以下三个元素之一:空,地面或奖励块。如果您不想阅读完成的答案,则可以在提示处暂停,而不必向下滚动页面。 因此,让我们看一下我们的第一个生成器。
算法1:随机性
我们的第一级生成器非常简单-它是完全随机的。 每张卡都有一个左起始图块和一个右出口图块。 所有其他地图图块都有33%的机会被清空,33%的正忙和33%的奖金块。
您可能已经注意到,这不是一个很好的级别生成器。 实际上,这些级别中的大多数甚至都无法玩,更不用说他们的兴趣了。 再生成几个级别并思考以下问题:
与可能性空间相比,这种生成器的生成空间有多大?提示:您能否提出一种可能性范围内的水平,而不是世代空间中的水平? 您能否提出该生成器无法创建的级别?正确的答案是,该生成器的生成空间与可能性的空间
相同 。 地图上的任何图块都可以取任何值,因此我们可以想象的任何级别都在生成空间中。 在这个世代空间中,最迷人,最有趣的关卡,甚至是将SUPER MARIO IS AWESOME绘制在地图上的奖励块。 不幸的是,生成空间如此之大,以至于很难找到一个好的水平。 正如您通过单击生成器所看到的,大多数级别只是垃圾。
算法2:绘制随机形状
我们的下一个算法稍微复杂一点,它创建的关卡更像您可以在游戏中应用的关卡。 从一个空的水平开始,他在某处选择一个随机点,然后画出奖金或土地块的直线或正方形。 他执行了20次此操作,创建了一些在关卡上随机绘制的形状。 和以前一样,您可以单击原始文章中的示例以再次启动算法并生成新级别。
这已经开始类似于平台游戏的水平了,对吧? 生成关卡时,请仔细考虑如何玩(如果需要,请大方-如果需要,可以添加双跳功能,或者可以跳出地图的上限)。
在找到至少一个可以通过的级别之前,需要生成多少个级别?不要在心得体会中争取绝对的准确性,只需做出一个粗略的估计即可。
当我与听众进行此练习时,通常平均需要大约10次尝试才能找到该水平。 您需要多少钱? 记住这个数字,现在看看下面显示的同一生成器的变体。 生成器与我们刚刚看到的相同,但是现在它的绘制级别不是20,而是10。 现在再数一遍:
在找到可以通过的关卡之前,您需要生成多少个关卡?找到可玩的关卡可能花费了您较少的时间。 让我们暂停片刻,考虑一下两个生成器之间的差异,除了参数略有不同之外,它们几乎是相同的。
哪个生成器具有更大的生成空间-生成20位数字还是生成10位数字的生成器?提示:考虑由10位数字生成器创建的关卡-可以由20位数字生成器创建的关卡吗? 然后考虑相反的例子。正确的答案是,具有20位数字的生成器具有更大的生成空间。 实际上,它包含了10位数字的生成器的整个生成空间。 为了说明这一点,请想象一下具有10个数字的生成器中的任何级别。 我们的具有20个图形的生成器可以通过不小心渲染相同的十个图形,然后不小心将它们第二次相互叠加来创建它。 但是,使用具有10个图形的生成器无法绘制具有20个独立图形的级别。
这意味着具有20个数字的生成器具有更多的级别,包括有趣的级别。 但是值得记住的是,使用10位数字的生成器来找到可玩的关卡要容易得多。
如果您必须为视频游戏选择一种生成器,那么您将使用哪一种? 没有正确的答案,但这是一个非常重要的决定,在使用过程生成器时通常必须这样做。 一个生成器可以产生更多的可变性并具有更多的惊喜,而另一个生成器则更加可靠并且对玩家的压力较小。
算法3:片段级别
该算法基于Spelunky中使用的级别生成器。 您可以
在此处了解更多信息。 级别生成器随机选择一个人(我)创建的级别的片段,并将其插入到级别中。 然后,他选择该级别的另一个随机片段,并将其并排插入,依此类推,直到完成该级别。 这是生成器,背景变暗,因此片段的边界清晰可见:
现在需要多少时间才能生成可玩关卡? 您会发现几乎每个级别都可以玩。 我们确切知道每个片段中的内容,也就是说,我们可以保证在您可以跳转到的级别上有一些有趣的对象以及需要避免的障碍。 同时,它比静态级别更具动态性-我们不知道哪些片段会以什么顺序出现在其中。 Spelunky算法甚至比此算法更丰富,它考虑了垂直运动,并且向每个片段添加了随机变化。 Darius Casemi创建了很棒的Spelunky交互式关卡生成器,可以在
这里找到。
这样的生成器是令人惊喜的惊喜和控制能力之间的良好折衷。 当生成器从元素目录中进行选择并将它们连接在一起时(有时根据特殊规则,例如Spelunky),我们称其
为基于语法的生成器 。 语法使我们可以决定过程生成器应使用哪些构建块,但对于如何连接它们则不那么严格。 但是这种控制和安全是有代价的。 再次查看生成器,然后考虑前面的示例。
这样的液位发生器会多久使我们感到惊讶?最初,生成器充满了惊喜,因为我们是第一次遇到每个片段。 但是,如果您玩的更多,那么您很快就会开始注意到一个结束,另一个片段开始。 即使此生成器中有成百上千个片段的组合,在仅仅几个级别中,您仍会感觉好像全部看到了它们。 对于开发人员而言,片段语法的简单性和易懂性非常好,但是对于玩家来说,这可能是一个缺点。
算法4:人为设计
作为最后一个示例,我们将不考虑算法,而是考虑一种非常不同的创造过程:关卡设计人员的工作。 单击原始文章中的生成器,您将获得超级马里奥兄弟的前两个级别之一。 (更确切地说,是他们的开始)。
从绝对的巧合开始,到此为止,这是历史上最著名的2D平台设计示例之一。 当然,这不是生成器,但从某种意义上讲,可以将这些级别视为仅创建一个高质量级别的生成器。 控制和质量之间的最大折衷。 从这个级别来看,考虑一下我们今天检查的所有生成器,并思考一个问题:
这些生成器中的哪些包含其生成空间中的这些著名级别? 。
只有第一个生成器才能创建此类关卡。 如果我们增加要绘制的可能形状的数量,则形状生成器可以创建它们,但也会显着增加不良或奇怪等级的数量。 如果我们给它一个不同的片段集,一个关卡片段生成器可以做到这一点,但是这些片段的所有其他组合是否可以播放?
这向我们展示了创建过程生成器有多么困难。 我们希望将生成器视为游戏的常规内容,以想象玩家如何度过特定的水平并享受游戏。 但是作为一代的设计师,我们应该考虑一代的整个空间,而不仅仅是其中的一个例子。 空间有多大? 惊喜有多丰富? 它多久会产生一些无聊或不好的东西? 我们是否可以检测和过滤这些情况,还是需要寻找解决方法? 这些只是在创建用于生成的东西时需要考虑的一些问题。
总结一下
今天,我们了解了以下概念:
产生空间
程序内容生成器(例如,Minecraft世界生成器)
的生成空间是它可以生成的所有结果的集合。 如果我们更改算法或为变量设置其他值,则生成空间将发生变化。
机会空间
某种
类型的内容(例如,Minecraft世界)
的可能性空间是我们可以呈现或描述的此类内容的所有示例的集合。 通常但并非总是如此,它比过程生成器的生成空间大得多。
更多并不总是更好
具有较大生成空间的生成器通常具有更多的好内容,更多的意外内容和更多样化的内容。 但通常他有更多垃圾内容,更多无聊内容和更多不适当内容。
生成空间较小的生成器更易于控制,更易于测试且更易于理解。 但这可以使它更可预测,也就不那么令人惊讶了。
找到平衡这两个对立的优点和缺点的方法是创建用于一代的软件的艺术!
补充阅读和感谢
我的教程到此结束! 感谢您的阅读。
在我们研究过的有关该主题的有趣材料中,我建议以下内容: