游戏设计左道,复杂系统与涌现(上)

作者:鱼叔叔
2024-05-16
15 5 2

前言

这是一篇关于复杂系统在游戏设计中应用的文章。整篇文章分为三大部分,第一部分介绍复杂系统和涌现,第二部分借由复杂系统提出一种新的度量游戏的方法,第三部分则通过实际的原型设计,来深入探讨复杂系统和涌现在设计中的应用方式。

全文字数较多,预计阅读时间稍长。一家之言,抛砖引玉,也欢迎各位朋友交流斧正。

一、复杂系统简介

首先,复杂系统是什么?

复杂系统有很多定义,比较简洁的定义是:由大量相对简单的自组织个体构成,个体之间通过简单的规则交互,却能涌现出复杂宏观行为和现象的系统。

蚁群,大脑,经济系统,免疫系统,生态系统,互联网,元胞自动机,人类社会等等,都是复杂系统。

这里的复杂系统定义有两个关键词,自组织(self-organizing)和涌现(emergent)。

“自组织”是指系统内部或外部没有一个指挥者,告诉个体该怎么做,而是个体自身通过规则控制自身。

“涌现”,就是指系统组成部分间简单的互相交互,却在宏观层面产生了新的特性或行为,这些新特征或行为称为“涌现”。这是非线性系统的特征,即 1+1>2,另一种说法就是整体大于部分之和。

复杂系统研究是一个跨学科的科学研究,涵盖了许许多多分支,下图是复杂系统科学的分布图,来源网站 https://www.art-sciencefactory.com/complexity-map_feb09.html

对复杂系统研究的重视比较晚,目前也处于探索之中,没有公认的定义,统一理论或一般性原理。对不同复杂系统的共性探索一直是重中之重,不同领域的科学家提出了自己的理论,但还未完全达成共识。

而我们只关注复杂系统在游戏中的应用,一般来说,复杂系统在游戏中的应用分两个大方向:

  1. 代理(人,动物,AI 等)为核心的复杂系统,例如蚁群,公司,社会,经济系统等。沙盒,故事生成器类游戏用的比较多,例如 kenshi,《模拟人生》系列,环世界,矮人要塞等等。
  2. 客观规则为核心的复杂系统,例如基于物理化学规律的湍流,天气,N 体运动等。物理模拟类游戏,应用主动布偶的游戏,编程类游戏,某些建造组装类游戏等等

当然两者也可以结合,但一般因性能和复杂度考量,都会有所侧重。

笔者最近的两个游戏也深入应用了复杂系统和涌现的设计元素,最近的游戏《流浪方舟》利用了物理系统作为复杂系统,为我们产生有利的碰撞位移涌现,是以客观规则为核心的复杂系统利用。

而上个游戏《追随者联萌》中实现了 GOAP 和行为树结合的 AI,令整个 NPC 的行为交互组成一个复杂系统,是以代理为核心的复杂系统。关于 GOAP 的介绍,可以参考笔者之前的一篇介绍文章:
https://mp.weixin.qq.com/s/U9CmZ2uTEv91KPosHDFZRQ

总而言之,复杂系统为我在游戏开发领域,不论是技术还是设计,提供了很多不同的思考角度,是一个非常有用的工具。因此,本篇文章就是结合我的一些实践和思考,跟大家简单分享交流一下。

接下来三章,我们通过复杂系统中非常具有代表性的混沌系统,来揭开复杂系统的面纱一角。

二、混沌的发端,动力学与预测

人们讨厌宿命论,却总想着预测未来。­
——我说的

首先我们简单介绍一下动力学。

动力学始于亚里士多德朴素但错误的运动理论,后来伽利略,哥白尼,开普勒以实验观察推翻亚里士多德流行了 1500 年的理论,再到牛顿横空出世,发明了微积分,正式创建了经典力学。提出了著名的牛顿三定律:

  1. 在任何情况下,一切物体在不受外力作用时,总保持静止或匀速直线运动状态。
  2. 物体的加速度与物体的质量成反比。
  3. 两个物体之间的作用力和反作用力,在同一条直线上,大小相等,方向相反。

在牛顿进一步提出万有引力定律后,在当时,牛顿力学完美地解释了一切物体的运动,其适用于任何大小的物体,不论是落下的苹果,还是燃烧的太阳。理论上,人们若是知道一个物体的初始位置和速度,就可以计算出后续的运动,自然就有聪明的小朋友想到:若是知道宇宙中某一刻所有粒子的当前状态,那是否就可以预知后面任何时刻的宇宙状态。

上述精确预测的假说就是著名的“拉普拉斯妖”,数学家拉普拉斯在 1814 年说:

“我们可以把宇宙现在的状态视为其过去的果以及未来的因。如果一个智者能知道某一刻所有自然运动的力和所有自然构成的物件的位置,假如他也能够对这些数据进行分析,那宇宙里最大的物体到最小的粒子的运动都会包含在一条简单公式中。对于这智者来说没有事物会是含糊的,而未来只会像过去般出现在他面前。”

如今,我们有强大的计算机,无需一个多智近妖的智者,也许未来有了足够强大的计算机就能做这个工作。如果真是如此,岂不是宇宙中的一切都已经注定,像一个上完发条的钟表,遵循三定律一直循规蹈矩地走下去,这是一个多么绝望的“决定论宇宙”啊。

还好 1927 年,海森堡(Werner Heisenberg)提出了量子力学中的“测不准原理”,证明不可能在准确测量粒子位置的同时,又准确测量其动量。如此,在微观世界的准确预测梦破碎,也慰藉了不愿相信宿命的人。


统计力学与预测

海森堡测不准原理只针对微观情况,而玻尔兹曼(Ludwig Boltzmann)创建的统计力学告诉我们,即使无法计算微观尺度的每个分子的运动,也可以用统计学的方式预测大量分子整体上的平均位置和速度,当粒子数量足够多时,他的方法“几乎总是对的”。统计力学是链接热力学和经典力学的桥梁,气压,热力学第二定律都能很好的用统计力学来解释。那么即使微观尺度上无法预测,宏观尺度上,是否可以通过统计学方式来预测系统的整体变化呢?

答案是不行,下面就是大名鼎鼎的混沌系统出场的时候了。

三、混沌系统

有时初始条件的微小差异,将造成最终现象的极大改变。前者的小误差,会造成后者极大的错误。预测将成为不可能的事,我们面对的是偶发现象。
——庞加莱,《科学与方法》,1908 年

1959 年,42 岁的数学和气象学家爱德华·罗伦兹(Edward Lorenz,1917—2008)在尝试用一个原始的计算机来预测天气,结果发现输入参数时微小的差异会造成两次结果完全不一样,即使两次预测计算机每一步的计算方法都一样。

后来,罗伦兹在一场学术会议上发表了论文来探讨这种对初始条件十分敏感的天气系统,论文题目叫——《巴西的一只蝴蝶舞动翅膀,可以引发得州的龙卷风吗?(Does the Flap of a Butterfly’s Wings in Brazil Set off a Tornado in Texas?)》,这就是著名的“蝴蝶效应”(The Butterfly Effect)。

天气系统就是一个典型的混沌系统,这里可能有点反直觉,为什么有些系统对初始条件就这么敏感?答案在于混沌的“非线性”和“自我引用”特性。

下面介绍一个经典的可以体现混沌本质的数学抽象——逻辑斯蒂映射(logistic map),它非常简单,其特性又非常令人震撼和着迷,我第一次读到时有种醍醐灌顶的感觉哈哈。这里主要引用梅拉妮·米歇尔的著作《复杂》的逻辑斯蒂映射一章,非常推荐大家读读这本复杂系统的科普读物。


这是逻辑斯蒂映射的方程:

X(t)是当前值,X(t+1)是下一步的值。R 是一个参数,我们可以自己调,先不管。我们要做的很简单,定一个 R,然后以一个介于 0-1 之间的 X(0)开始,代入这个公式,得到 X(1),然后把 X(1)代入公式,以此类推不停得到新的值即可。这就是一个非常简单的“非线性”的方程。

让我们试试 R=2 时会怎么样,我们会发现有意思的事情,就是不管 X(0)输入的是什么值,最终 X(t)都会停留在 0.5 这个值,这个 0.5 正是所谓的不动点(fixed point):到达这一点所花的时间依赖于出发点,但是一旦到达就会保持不动。当 R=2.5 时,你同样会发现系统到达一个不动点,不过这次不动点是 0.6。

而当 R=3.1 时有趣的事情开始开始发生:

不管 X0 输入的是什么值,最终 Xt 都会在两个值(0.5580141 和 0.7645665)之间振荡。如果将前者代入方程,就会得到后者,反过来也是一样,因此振荡会一直持续下去。这种最终的变化位置(无论是不动点还是振荡)被称为“吸引子”,因为任何初始位置最终都会“被吸引到其中”。

往上一直到 R 等于大约 3.4,逻辑斯蒂映射都会有类似的变化:在迭代一些步骤后,系统会在两个不同的值之间周期振荡(最终的振荡点由 R 决定)。因为是在两个值之间振荡,系统的周期为 2。

但是如果 R 介于 3.4 和 3.5 之间,情况又突然变了。不管 x0 取何值,系统最终都会形成在四个值之间的周期振荡,而不是两个。例如,如果 R=3.49,x0=0.2,x 的值很快就开始在四个不同的值之间周期振荡(它们分别大约是 0.872,0.389,0.829 和 0.494)。也就是说,在 3.4 和 3.5 之间的某个 R 值,最终的振荡周期突然从 2 增到 4。最终的结果就像下图那样。

接着,更有趣的事情来了,在 3.54 和 3.55 之间的某个 R 值,周期再次突然倍增,一下跃升到 8。在 3.564 和 3.565 之间的某个值周期跃升到 16。在 3.5687 和 3.5688 之间周期又跃升到 32。周期一次又一次倍增,前后 R 的间隔也越来越小,很快,在 R 大约等于 3.569946 时,周期已趋向于无穷。当 R 等于大约 3.569946 时,x 的值不再进入振荡,它们会变成混沌。下面解释一下。将 x0,x1,x2……的值组成的序列称为 x 的轨道。在产生混沌的 R 值,让两条轨道从非常接近的 x0 值出发,结果不会收敛到同一个不动点或周期振荡,相反它们会逐渐发散开。在 R=3.569946 时,发散还很慢,但如果将 R 设为 4.0,我们就会发现轨道极为敏感地依赖于 x0。我们先将 x0 设为 0.2,对逻辑斯蒂映射进行迭代,得到一条轨道。然后细微地变动一下 x0,让 x0=0.2000000001,再对逻辑斯蒂映射进行迭代,得到第二条轨道。图 2.14 中的实心圆圈连成的实线就是第一条轨道,空心圆圈连成的虚线则是第二条轨道。

这两条轨道开始的时候很接近,但是到后面,两条轨道开始分开,并且毫不相关。这就是“对初始条件的敏感依赖性”的由来。

这就是混沌最简单的表现方式之一,只要一个公式,就能告诉我们,如此简单的逻辑斯蒂映射,并且完全是确定性的:每个 xt 值都有且仅有一个映射值 xt+1。然而得到的混沌轨道看上去却非常随机。此外,对于产生混沌的 R 值,如果初始条件 x0 有任何的不确定性,对一定时间之后的轨道就无法再预测了。

所以,如果对于一个实际的混沌系统,即使它简单到只有一个粒子,它的初始状态中若有个参数是无理数(绝大多数数字其实是无理数,有理数只是少数),例如大家最熟悉的π,那我们就要建造一台可以输入无限位数小数的机器,否则无论我们精确到小数点后多少位,那一位后面的误差就会导致一定时间后,整个混沌系统都无法预测。这就是“失之毫厘,谬以千里”。

至此,不论从宏观上还是微观上,预测未来都不可能。

四、混沌系统和游戏

前文提到我们的游戏《流浪方舟》是应用了基于规则的复杂系统,简单描述游戏玩法,是双方玩家各控制五个球体英雄,互相碰撞进行战斗,其碰撞和反弹都是模拟的物理规则,并且有 PVP 的玩法。而我们游戏的机制,其实就已经组成了一个典型的 N 体系统(没错,N 等于三就是大名鼎鼎的三体系统),也因此遇到了混沌效应。

我们用的是帧同步方案,在不同的手机上,我们遇到了两个玩家不同步的问题。排除各种原因包括网络因素后,发现原因是不同机器上的浮点数运算有微小的差异(真的非常微小)。于是,某个回合微小的差异,会在几回合后使得双方的战场情况完全不一样,直接变成各打各的了。后来,我们只能是放弃 Unity 自带的物理系统,自己重新实现了一个定点数精确物理系统,非常惨烈。所以,游戏利用了复杂系统,也要承受复杂系统可能带来的问题。

当然反过来说,我们也利用了复杂系统的涌现现象。对于游戏来说,涌现本身不是目的,而是涌现能为游戏带来什么。

首先,涌现能为游戏带来意料之外的体验,该部分的体验是玩家不可控的。若开发者能在这部分进行部分控制,则可以进行更多发挥。当然意料之外的体验也是新体验,涌现本身创造了新的体验。

同时,涌现的妙处在于并不是所有过程都是不可预测的,往往有一小部分是可以预测的,这会带来一定适应性,可以适应不同水平或者意愿的玩家。但是复杂系统的的突变也会带来一个相变的临界点,这个临界点又可以保证不同玩家对涌现的掌控不会相差太多。

举例我们游戏的物理碰撞系统,复杂度来自多体运动,玩家无法预测 N 次碰撞后的情况,但是大多数玩家是可以预测 1 次碰撞后的结果,这就是初始可预测部分,这部分会进入玩家的策略考量中,而对于一些更具策略的玩家,首次碰撞反弹后的第二次碰撞,也能预测部分,这就是适应性,但是当反弹三次或以上,基本没有玩家可以预料局面,这就可以类比为混沌相变的临界点,用以把控不同玩家的策略差距,甚至理论上,即使有个类似深蓝的超级计算机来算,也无法完全把控 N 变大后的情况。

混沌系统只是复杂系统的一个分支,但确实是一个理解复杂系统的敲门砖,大概了解了复杂系统是什么之后,我们来看看游戏与其更深的关系。

在设计复杂系统的时候,大家会发现,游戏和复杂系统的界限是非常模糊的,一个复杂系统,往往加上一些合理的目标和挑战,就是一个具备一定可玩性的游戏。而很多游戏本身,就是一个复杂系统。也因此,对复杂系统的一些研究,同样可以化用到游戏设计,例如复杂系统对“复杂度和信息”的研究,对游戏设计就非常有价值。接下来的部分章节,笔者会探讨一种度量和优化游戏的方式,若对此不感兴趣,可以跳到第八章。

本文为用户投稿,不代表 indienova 观点。

近期点赞的会员

 分享这篇文章

鱼叔叔 

《流浪方舟》制作人,为游戏而秃 

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. sdjdasha 2024-05-16

    哇,我也喜欢复杂系统,但用到游戏设计里感觉最后都成了“随机”,能做出自组织感觉才能真正算把复杂系统引入了

    • 鱼叔叔 2024-05-17

      @sdjdasha:后面还有两篇,讲怎么应用到游戏中的,敬请期待

您需要登录或者注册后才能发表评论

登录/注册