出乎意料的世界:我的第一代程序

游戏中的程序生成总是让我着迷。 创建具有自己的生命,不可预测且独特的事物的想法本身就是一种魔术。 这就像用生命通知您的代码,然后在丛林中发布代码以查看会发生什么。 不会激起您的想象力吗? 它确实是我的。 根据编程的逻辑工作的无数种变体,但是在您没有直接控制或意识的情况下仍然存在。 即使对于您来说,世界也是无法预测的。

当然,程序生成根本不是什么新鲜事物。 最早使用程序生成的游戏出现在70年代后期,当时像流氓这样的游戏使用算法生成地牢。 很好的例子:“流氓”和“在苹果庄园下面”。 从那时起,发生了很多事情。 现在,我们可以找到整个3D地图,甚至可以按程序生成的行星(不是最好的例子,但仍然是:无人的天空)。 甚至故事或角色也可以随机创建。 还有什么? 也许是语言? 法律? 物理? 我们必须发现很多机会,但是今天,我将分享我在创建一个非常简单的程序生成中的第一次经验,该程序用于我的简陋故事驱动的html益智游戏Memo Quantum Terminals。 我不是专业的游戏开发人员,也没有创建巨大3D世界的经验,但是这种小小的经验裂缝为窥视未预料到的世界打开了一个小缺口。

注意:为了生成,我使用了简单的ES6逻辑。

游戏规则很简单。 在5×6的场上,将生成从点A到点B的路径。玩家的目标是记住该路径并重复,将第一个锚点拖动通过所有图块到点B,以保留原始的出现顺序。 听起来很简单,是吗?

路径应随机生成,其长度由玩家的水平决定。 每个锚点必须精确地位于上一个锚点的旁边。 该路径可以水平,垂直或对角线生成。 锚点不得与已经激活的锚点相交(这一点很明显); 并且绝不能将玩家带入死胡同。

开始非常容易,我们选择1到30之间的随机数(30是地图上的总瓷砖数)。 是的,这将是我们的第一个锚点!

然后,我们需要创建一个数组,该数组将存储已选择的锚点数,以免将来出现。 不用担心,在文章结尾,我将提供指向我Codepen上完整代码的链接,请继续阅读。

下一步是选择下一个锚点。 我们该怎么做? 如果看一下地图,您可能会注意到三种情况。

让我们看看它们。

第一种情况-我们的第一个图块位于字段中间的某个位置。 记得? 我们可以水平,垂直和对角线移动。 要选择下一个图块,我们可以考虑以下情况:

放出第一个图块为13。然后下一个图块为:13 + 1、13-1、13 + 5、13 + 6、13-5、13-6、13 + 4或13-4。 我相信您已经知道原因了。 之后,我们随机选择当前方式。

但是,如果第一个图块位于地图的开头,我们将无法遵循此逻辑。 这就是为什么。

假设我们有11个作为第一个图块。 根据以前的变体,我们必须选择以下情形之一:11 + 1、11-1、11 + 5、11 + 6、11-5、11-6、11 + 4、11-4。 如您所见,如果我们选择11–1,我们将得到10,它在地图的另一侧。 它对我们不起作用,因为它根本看起来并不像路径。 它被打破。 所以我们现在有了:11 + 1、11 + 5、11-5、11-6、11 + 4。 酷吧?

最后一种情况是,第一个图块位于地图的末尾。 设为20。再次,由于与第二种情况相同的原因,第一个决定对我们不起作用-在某些情况下,路径已中断。 因此,这里我们可以选择以下方式之一:20-1、20 + 5、20-5、20-6、20 + 4。

很酷,所以我们有三种情况。 我们现在要做的就是教我们的发电机如何确定我们现在处于哪种情况。 这很简单。

位于地图末尾的所有图块都是5的素数。相应地,如果开头的图块是X,那么X-1也将是5的素数。对吗? 也许您会找到另一种方式,这很酷。 也许您有地图的另一个维度。 然后,您需要根据自己的条件实施自己的逻辑。 但是这个解决方案对我来说很好用。

如果x-我们的第一个图块或最终当前的图块不在开头(x-1%5!= 0)而不是在结尾(x%5!= 0),那么它在中间某处,对吗?

好吧,我们快到了。 我们检测到我们的第一个锚点或当前锚点位于何处,并相应地实现了逻辑并选择了一个随机方向。 我们检查了是否尚未选择锚点,为此,我们需要将每个选定的锚点添加到“避免”数组并比较数字。 并且我们需要确保该数字大于0且小于30,以适合地图。 好的!

混合,检查,重复所需的次数,少许盐调味,我们在这里。 当然,如果路径将导致我们陷入僵局,退后一步,或者干脆迫使发电机再次生成路径,直到获得工作结果,我们可以进行改进。 有更好的方法吗? 跟我分享! 我将乐于学习更多生成随机材料的方法! 该游戏的Beta版可在此处获得:www.thememogame.com

正如我所承诺的,这是我简单而谦虚的生成器的完整代码:https://codepen.io/siriusharvey/pen/BGKerR