游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4555|回复: 0

游戏数学建模:统一在微分方程之下

[复制链接]

5万

主题

5万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
86215
发表于 2023-6-9 09:17:12 | 显示全部楼层 |阅读模式
微信图片_20230609091000.jpg

你最好学学微积分,它是神的语言——理查德·费曼

我们身处的物理世界是一个不断变化的系统,牛顿、莱布尼兹窥见到了这一点,因此在前人的工作基础上系统性的提出了微积分。微积分是一种对变化做定量描述的语言,从微积分里得到的微分方程不同于初等代数方程,它强调对事物从变化(一阶导)以及变化的推力(二阶导)的角度揣摩与端详。这个角度对游戏数学建模,或说数值策划的工作大有裨益。我预备在本文里展示不论战斗或经济,其工程数学的方法论主要是微分方程的,而且对任意游戏类型有效。就不同游戏类型而言,微分方程的形式不一定相同,但它告诉我们从变化和变化的推力角度看待问题是多么的简洁、有效、统一。为达到这个目的,我对自己提出了如下要求:

1)风格方面的,延续《游戏数学建模工程手册》的工程数学阐释方式,从而免去不专业的争论。

2)实践方面的,用微分方程假想建模两个截然不同的游戏类型:魔兽世界(WOW)和皇室战争(CR)。这两张模拟建模表可以在巴比伦人的数值策划Q群下载:813299364。

我之所以选择这两个游戏类型是因为:

1)对WOW的,微分方程告诉我们,武器、技能本质上是同一个东西。忽略公共CD时,瞬发技能和双持武器完全等价,一个职业的瞬发技能数量越多相当于持有和同时可发起攻击的武器数量变多。

2)对WOW的,任意俩俩职业平衡在微分方程角度不过是改变了积分区域,这个积分区域是时间。

3)对CR的,圣水费用是离散的,即便对离散建模,微分方程仍然有效。

4)对CR的,卡牌克制、赚费(指比对手节约的圣水费用)是不平衡的另一种称呼,微分方程告诉了我们如何平衡,那么我们就可以量化和控制不平衡的程度,或说如何互相克制。

5)对CR的,累积伤害量是时间和圣水费用的二元函数,微分方程角度将自然而然导出偏微分方程和高阶导数的现实意义。

6)WOW和CR是2个截然不同的游戏类型,微分方程的视角建模仍然畅通无阻,体现了不论怎样的游戏类型都不会妨碍使用微分方程。

基础推导

传统或说前微分方程的游戏数学建模往往思考的是:“我该在这个系统模块投放多少属性、产出值?对某个系统的数学模型,我如何拼凑出初等代数方程?”现在,我们要放弃这种思考方式,而是问:“我该在这个系统模块投放多少属性、产出的一阶导?当转化为属性值时,一阶导对谁积分?对某个系统的规则进行数学建模时,各个影响来源如何用变化的推力(一阶导的导数)、推力的贡献(二阶导的导数)来看待?”

改变后的思考方式让我们立即回忆起一个广为人知的一阶导:每秒伤害。每秒伤害显然是累积伤害量或总伤害量关于时间的一阶导。接下来,必须有一个单位承受这个每秒伤害,否则它毫无意义。这个单位承受时付出的代价是生命,生命损失既然来自每秒伤害,于是损失也和时间有关,即:

微信图片_20230609091008.png

H为剩余生命值,dH是生命的每秒损失,D为总伤害量,dD即每秒伤害。整理为:

微信图片_20230609091009.png

微信图片_20230609091010.png

这便给出了本文的第一个微分方程模型,它告诉我们,战斗如果是平衡的,那么我的剩余生命流逝速度要等于你总伤害的累积速度,用积分形式表达就是:

微信图片_20230609091012.png

t为战斗时间。战斗平衡的积分形式给了我们一个提示:如果战斗平衡,则必然双方的积分区域t是相同的。t的取值范围显然大于0小于无穷,这说明你再去和另一个角色战斗,这个角色有着不同的剩余生命和每秒伤害,只要改变t的取值且相等,那么仍然是平衡的。也就是满足如下微分方程:

微信图片_20230609091013.png

α表示角色a的伤害偏移系数,它线性的缩放dD,β表示b单位的伤害偏移系数。也就是说只需要知道a和b角色的伤害偏移,就知道双方的战斗时间缩放到了没有任何偏移时的t的多少倍。原因是:

微信图片_20230609091014.png

微信图片_20230609091016.png

我们有:

微信图片_20230609091017.png

于是:

微信图片_20230609091018.png

上述推导过程隐含了一个假设:

微信图片_20230609091019.png

即总伤害量的一阶导是一个常数。这是个不过分的假设,它满足工程师原则,也就是面对复杂系统时优先选择线性。

微信图片_20230609091021.jpg

上图为WOW的模拟建模,我已将需要注意的单元格加粗标红。最小最大容忍秒是说,既然俩俩职业任意平衡改变的不过是积分区域,那么职业之间的战斗时间不要太小也不要太大,太小了玩家没操作几下、没打出几次技能就结束,太大了枯燥乏味。伤害微元即隐含的那个假设,每秒伤害是一个常数。

但是,职业们的伤害能力和生命来源自多个模块,如自身等级、武器与装备。在WOW里,武器和装备并不是每个职业单独有的,如皮甲是猎人、盗贼与德鲁伊共同使用,所以皮甲提供的伤害能力、生命应该取这3个职业的哪一个偏移值?不论取哪一个,另2个职业必然没有得到职业平衡要求的正确偏移。很容易想到,这2个职业的实际偏移是每个模块的偏移与模块占总值的比例,即加权平均:

微信图片_20230609091022.png

微信图片_20230609091023.jpg

i表示一个具体职业,向量a的每个分量表示某个模块的伤害或生命偏移值,向量w的每个分量表示某个模块给的伤害或生命占总模块的比例。

在武器上,德鲁伊、术士、牧师都使用法杖,武器战士与圣骑士均使用双手剑;在装备上,德鲁伊、猎人、盗贼都穿戴皮甲,武器战士与圣骑士则穿戴锁甲。为最小化偏移误差,武器与装备的偏移模块可取这些职业偏移值的中位数,中位数在统计建模里是稳健的,均值容易受离群值影响是不稳健的。

武器与技能

一个职业为让每秒伤害打出去必须具备攻击行为。在WOW里,这些行为有:赤手空拳、武器、技能。有这么多攻击行为且与每秒伤害有关,自然引出了一个问题:这些攻击行为是在同一时间发生的吗?如果同一时间发生,则每秒伤害显然的线性叠加,否则只生效其中一个。对武器而言,攻速影响它何时生效,但对技能而言分为若干情况:

1)这个技能需要施法时间(术士的暗影箭)、引导时间(法师的奥术飞弹),则每秒伤害唯一的来自该技能,因为施法与引导时不可使用武器或其他技能。

2)这个技能生效时机是下一次普通攻击时(德鲁伊的重殴),即将产生的每秒伤害唯一的来自该技能,武器的普通攻击行为与伤害被阻止。

3)这个技能有CD且瞬发伤害(萨满的烈焰震击),该技能的施放时间趋近于0,在极限上可视为不影响武器或其他技能。

4)这个技能没有CD且瞬发,但伤害是延迟的(牧师的暗言术:痛),则该技能相当于自动按时间间隔伤害敌人,与武器的自动攻击等价。但是这个技能擅长对付多个敌人,因为它凭空创造出多把自动攻击的武器。

5)这个技能没有CD、瞬发、需引导但伤害是延迟的(法师的暴风雪),则等同于第1种情况。

微信图片_20230609091025.jpg

所以,针对上述不同情况,我们只需要将技能的每秒伤害加上被阻止的攻击行为的每秒伤害,对瞬发技能则减去不被阻止的攻击行为的每秒伤害,然后除以瞬发伤害技能的总数。

公共CD影响打出下一个技能的间隔,如果技能提前取消,公共CD会立即取消。公共CD的存在避免了玩家几乎同一时间连续打出多个瞬发伤害技能,这会影响瞬发技能的每秒伤害,瞬发技能的实际每秒伤害将是:

微信图片_20230609091026.png

因为n个瞬发技能,有n-1次公共CD将这些技能隔开,于是这些技能的每秒伤害有n-1次公共CD的时间损失。

皇室战争的偏微分方程模型

现在我们进入皇室战争的模拟建模讨论,很快发现我们面临如下问题:

1)圣水费用越高,卡牌必须越强,但不能等价。意思是2个1费的不能和1个2费的一样强,而是必须比2个1费的强,否则谁还使用高费卡呢?

2)卡牌之间有克制关系、赚费概念。

谨记微分方程的思考范式:“从变化、变化与更多的变化考虑问题”。先清晰我们的目标:圣水费用越多,卡牌的什么越强?一个合理的回答是:每秒伤害越强。那么,什么叫越强?是圣水费用对每秒伤害这个一阶导存在着正向推力,数学描述为:

微信图片_20230609091027.png

也就是每秒伤害关于圣水费用W的变化率。这自然的引入了变量W,自然的导出了一个偏微分方程,其正式书写格式为:

微信图片_20230609091028.png

这称二阶混合偏导数,这个表达式很符合我们的定性描述:“圣水费用越多,卡牌的每秒伤害越强”。因为二阶混合偏导数其几何意义是t不再继续变动,仅考察W方向上的t对总伤害量的贡献情况。从另一个角度也可以明白为什么必须是一个二阶混合偏导数,我们已经假设每秒伤害是常数,于是每秒伤害关于t不再有高阶导存在,或说高阶导为0,所以我们想要影响每秒伤害只能引入其他变量,这必然使得总伤害量是一个与时间t、圣水费用W有关的二元函数D(t,W)。

“圣水费用越多,卡牌的每秒伤害越强”这个定性描述不够精细,确切的说:

1)圣水费用增多,总是增多每秒伤害,不会逆转也不会在一个阈值后恒为0。

2)但增多的量不能太剧烈,哪怕与牛顿的加速度公式一样是个与时间有关的线性微分方程都不可取,因为肯定导致指数级增长。在物理世界里,速度有光速做上限,在游戏里可没有。

所以什么叫“不能太剧烈”?对微积分而言不就是在说这个吗?

微信图片_20230609091030.png

结合不能是线性增长,立刻想到函数表达式为:

微信图片_20230609091031.png

W越大,在极限上趋于0。一次积分:

微信图片_20230609091032.png

已知t的高阶导都是0,所以f(t)为0。再次积分:

微信图片_20230609091034.png

C为积分常数。不过我们最好有个用于正比的参数:

微信图片_20230609091035.png

即每秒伤害的变化与圣水费用的对数值成正比。最终,每秒伤害在不同费用时的计算公式为:

微信图片_20230609091036.png

微信图片_20230609091037.jpg

如图所示,其中α根据最大圣水费用的每秒伤害限制求得。图中的出现“克制关系”就是不平衡,即某个职业、某类卡牌类型比别的职业、卡牌类型更强。对于刻意制造的不平衡,需分情况讨论:

WOW的职业克制、CR的克制建筑,只能引入新的属性类型,否则不可能循环克制,因为数字的大小关系是传递性的。因此WOW有护甲(不对法术伤害生效)、CR有对建筑杀伤。这类克制关系容易做,只需要新属性线性影响每秒伤害即可——这体现在图中多单位对建筑杀伤系数小于1,单个单位对建筑杀伤系数等于1。

微信图片_20230609091039.jpg

2)dH dt = -dD dt的微分方程模型已经告诉我们,任意俩俩单位平衡只改变了积分区域t,但t必须相等。所以不平衡就可以让t有一个差额从而不相等,不相等时,要么伱的dD、H放大,要么他的H、dD缩小。

上图中,在平衡破坏里我选择了仅偏移伤害,也可选择生命伤害一起偏移,偏移相乘后的值仍等于1.4即可。“赚费”的概念在同样的基础上被计算出,1张5费的卡比5/4张4费的卡花费了相同的5个圣水,但1张5费卡仍然比5/4张4费卡强1.8倍,则5费单位还拥有44.4%的生命,由1-1/1.8=0.444算出(计算原理请翻阅《游戏数学建模工程手册》),于是5费的卡还有44%的费用剩余,即0.444*5=2.22。

隐含假设存在的问题及微分方程改进

前文明确指出每秒伤害为常数是一个隐含的假设,意思是,我们在有意无意的持有这个假设,这表现在这些情况中:

1)计算标准时长时,我们用生命除以每秒伤害。

2)在考虑武器攻速越慢,每次伤害越高时,我们用攻速乘以每秒伤害。

3)在考虑一个技能施法时间过长,CD过长时,我们用这个时间乘以每秒伤害。

4)在某些文章里,让生命乘以伤害能力,计算所谓的能力函数、战斗力时。

上述一切操作都隐含了一阶导为常数的假设。然而这个假设是有适用范围的,如果武器攻速、技能CD、施法时间、持续掉血的持续时间对于标准战斗时间(尤其是最小容忍秒)占比不算高时,它是没有问题的,当占比较高时,则会一次性造成对方50%-80%的生命损失。想象下,标准战斗时间也就5秒,可却有3秒攻速的双手斧,当双手斧砍下去,岂不是第一次就造成3/5=60%对方的生命损失?技能CD、施法时间同理。这对每秒伤害的改进提出了如下要求:

1)攻速、CD、持续掉血技能的持续时间占战斗时间比例较低时,每秒伤害是一个常数

2)当占比较高时,分情况讨论:

——如果是武器和瞬发技能,那么占比越高,则每秒伤害下降。因为瞬发更有优势,提前享受到打出去的伤害进而立即获益。

——如果技能需要施法时间、引导时间,那么占比越高,每秒伤害上升。因为它可能被打断、目标超出距离而被浪费掉,对人性来说,也希望延后越久才造成的伤害,给予更多的“利息”。

——如果是瞬发技能但按时间间隔造成伤害(暗言术:痛),那么占比越高,则每秒伤害下降。因为它凭空创造出多个自动攻击的武器,让多个敌人承受这些伤害,角色的其他攻击行为几乎不被影响。

微分方程的思维再次帮助了我们,时间越长,每秒伤害越高/越低,说明对t的二阶导存在:

微信图片_20230609091040.png

对于占比低时为常数,高时每秒伤害下降的规律,我给出的二阶微分方程为:

微信图片_20230609091042.png

对于占比高时每秒伤害上升的规律:

微信图片_20230609091043.png

微信图片_20230609091044.jpg

其中C是常数下的每秒伤害,γ为速率调节参数,它们的图像如下:

即一开始非常贴近1之后下降或上升。双曲函数的优良形式、图像如此的符合游戏数学建模的需要是多么让人惊讶的事情,我在《微分方程在游戏经济建模的应用》里也使用到了双曲正切函数。

应用该模型需先定量定义什么叫时间占比太高、太低,我对此的定义是:希望攻速、CD、施法时间在3.5秒时恰好几乎等于每秒常数,从3.5秒之后变化。理论计算如下图。

微信图片_20230609091046.jpg

可以看到4秒开始,双曲正割只有98%的每秒伤害,时间很大时,如满打满算25秒,只有59%的每秒伤害,也就是一个25秒CD的瞬发技能或武器,它一次性造成对方59%生命的损失。比对最开始的WOW模拟建模里的技能计算结果到底有多好,如下图所示。

改进后的长CD的神圣烈焰被明显削弱,比之更长持续时间掉血的锁喉则压缩得更加厉害,施法时间太长的暗影箭则被补偿了伤害,改进后微分方程模型计算结果显然比改进前更为合理。

结语

正如《微积分的力量》一书里所说:“微积分扩展了我们描述这个世界的能力”。这个能力就是赋予我们并强调从事物的变化、推动力的角度看待问题,然后用微分方程的形式写出它们,再积分逆运算找到描述事物的函数表达式。许多人未能领会微积分的威力与强大,因为他们很少主动的从变化的角度看待问题,更不用说从更高阶的变化看待问题了,希望本文能够为游戏数学建模的系统性工程数学方法做出微不足道的贡献,给予许许多多数值策划工作者一丝萤火虫的光亮。

文/巴比伦人
原文:https://mp.weixin.qq.com/s/cISoYc2BM7txD_hFyeDw5g

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-12-23 07:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表