- 参考资料:华中科技大学-熊硕《游戏学导论》(系列课程)
- 本系列博客中,未标注“思考”、“便签”的部分,多摘引、校饰自熊硕老师的课件原文。
十、游戏策划·终,数值之美
熊老师的课程开场赠语:
所有游戏在除开一切剧情和系统的因素后,还能让玩家感觉到快乐的内容,背后直接上或间接上都有数学的原因。上节课所说博弈的背后,也是数值的权衡与计算。
当然一节课不可能讲完所有被应用到游戏中的数学,因此这节课基本属于科普性质,旨在提高对数字和公式的敏感程度————如果能从中悟出什么,那当然更好。
数值策划
关于数值策划
- 其实“数值策划”某种意义上是中国游戏圈的产物,海外大部分的主流公司并不会专门设置如此一个职位,数值工作常常是兼职。
- 中国的数值策划Belike:MMORPG、经济系统、氪金与运营;
- 真正意义上需要专门数值策划的游戏,往往涉及到平衡性对抗问题。
- 如RTS、MOBA、FPS等(但即便如此,暴雪等公司的招聘职位表里也没有数值策划这一项)
- 入门数值策划,可以从基础的模型入手,培养对数值的感觉。
- 数值策划的难度并没有想象的那么高大上:
- 如果说电子时代之前这还是个问题的话,有了编程等计算机工具后,可以用仿真模拟代替很多数学解析问题。
- 如果说以前还担心玩家的行为超出规则预期控制,现在有全面的后台数据,也不再是个问题了。
- 所以这节课的目的,只是提高对数学问题的敏感度。
数值
- 对于大多数游戏来说,游戏过程是最重要的、最基本的数学模型。
- 在游戏中,我们可以见到各种各样的战斗,方式林林总总,数值名目繁多,过程千变万化,在这让人眼花缭乱的过程背后都有相应的规律。
- 游戏过程中的各种问题,应当可以找到一种定量的方法,让我们对游戏过程的设计更加丰富,对平衡性的把握更加精确。
- 所谓数值策划,就是利用各种数学工具和方法,创作一系列可以表达游戏意图的数据模型以控制游戏节奏:
- 比如攻击伤害值与攻击距离之间的关系(伤害衰减曲线);
- 英雄受到攻击时与敌人属性之间的关系(成长、Buff等数值系统对底层数值的交互与加成);
- 经验值成长曲线;
- 卡牌游戏的规则设定;
- 隐性数值的规律建模。
数值策划的基本能力
- 数学基础(极为基础的数学知识足矣)
- 缜密思维
- 对数字极其敏锐
- 直觉和经验——包括游戏经验和数学经验
- 工具的操作(没有人笔算游戏数值):
- Excel
- 编程语言(在这一技能加持下,数学只需要非常基础)
- 耐心——慢慢调整数据
数值策划需要的数学基础
- 代数
- 四则运算
- 幂函数
- 正态分布
- 微积分
- 概率论
数值平衡基于玩家关系
- 玩家交互模式(均为非模拟向游戏,模拟向游戏:P社、KOEI、FIFA、实况等等以写实为主,不太把“平衡”作为第一考虑)
- 单人对抗游戏(如《之狼:影逝二度》):——体验上的数值感受模拟,开心即合理。
- 多人对抗游戏(如MMORPG的副本):——存在感上的数值平衡,存在即合理。
- 合作游戏(如《逃出生天》)——存在感上的数值平衡,存在即合理。
- 玩家对抗(如国际象棋):——seesaw game,绝对的数值平衡,绝对平衡是这类游戏的基石。
- 多方竞赛(如《马里奥赛车》):——体验上的数值平衡,开心即合理。
- 单方竞赛(如《狼人杀》):——相对的数值平衡,这类平衡基于研究,部分平衡基础上做到开心就好。
- 团队对抗(如MOBA类游戏):——宏观的绝对数值平衡,微观的体验或存在感上做到相对数值平衡。
- 还是那句话:玩家关系和角色,由目标定义;而游戏核心机制与规则,又由玩家关系定义。
原则1:
不论怎么设置数值,都需要遵循一个既定的原则。这个原则不论数值是否在规则与机制上合理(偏弱偏强),都需要在数学逻辑上是体系化的(即,你可以用一套或者多套公式描述这个原则)。否则会造成数值设定系统上的崩溃与无限螺旋迭代,这事实上是个哲学/逻辑学问题。
数值策划的常用工具
四则运算
- 公式线型为线性,变化稳定,较为容易找到规律,预期后续发展
- 举例:
- 每加一点力量,近战物理攻击+1(《杀戮尖塔》),每射击一次,子弹数-1(FPS)。
- 每施放一次技能,熟练度+1,熟练度达到2000时,升级为二级。
- 物理伤害 = 物理攻击 - 目标物理防御(MOBA)。
- 某技能:在 HP < 50 % 时,将所有HP转化为伤害进行攻击,使用后HP为1。伤害 = (基本伤害 + 当前HP) * (1 + 技能等级调整值 + 10 * 当前HP/最大HP)。
- 加减的运算最为直观,符合玩家一般直觉,较容易发现规律。
- 乘除运算也相对简单,可直接对数据造成跳跃性的影响,这一影响往往是有意识、有规律的。
- 混合运用可以实现很多有特色的功能。
简化战斗力模型示例
一个 100 血 的战士出城,看到了一只 血量为 90 的野猪。战士上去砍野猪,野猪同时开始反击。战士每秒伤害 = 20,野猪每秒伤害 = 10。当战斗进行 4.5 秒 时,野猪被杀死。在此期间,野猪对战士共造成 45 点伤害,战士还剩下 55 点血。
在这个过程中,我们可以得到一个最简单的结论,即战斗的结果,取决于一个值: $$\frac{h_X}{dpt_Y} - \frac{h_Y}{dpt_X}$$
其中:
$ h_X 、 h_Y $:玩家和怪物的生命值,单位为点。
$ dpt_X 、 dpt_Y $:玩家和怪物的单位时间输出伤害,单位为点 / 单位时间。
单位时间一般是秒(在很多游戏里不一定以秒为单位,例如 ARPG 常用帧为单位,1 秒 = 24 帧)。
因此可以得到战斗力(Fighting Capacity)的定义,从公式看:
- 前面一个数 = 玩家能够坚持的时间;
- 后面一个数 = 玩家杀死怪物的时间。
就像两个水池各自插了一根水管放水,比较哪个水池先被放空即可,玩家要战胜怪物,只需要满足: $$\frac{h_X}{dpt_Y} - \frac{h_Y}{dpt_X} > 0$$
于是我们给出这个简化的模型中战斗力定义: 我们可以将玩家的 $ h_X dpt_X $ 定义成玩家的战斗力,记为 FC (Fighting Capacity)。 FCX = hX × dptX FCY = hY × dptY
战斗过程其实就是一个 FC 相减 的过程。要预估战斗结果,只需计算 $ FC_X - FC_Y $ 即可。这一公式不仅能判定胜利者,还能计算双方战斗力比例以及胜者最终保留的战斗力。例如:
- 战士战斗力 = 2000;
- 野猪战斗力 = 900;
- 战胜第二只野猪后,战士剩余战斗力 = 200。
此时战士的实力已不足以再战胜下一头野猪,必须进行打坐、吃面包、绑绷带、喝药、治疗等补给措施。
战斗力与简单的职业平衡
- 例如,在一个多职业的MMORPG中,存在多个职业,为此需要对职业的数值进行一定的平衡。
- 基础模型:
- 战士:生命1000,输出30,攻击间隔3s,FC = 10000;
- 刺客:生命500,输出20,攻击间隔1s,FC = 10000;
- 进阶模型:
- 战士:生命1000,输出30,攻击间隔3s,FC = 10000,为其赋予职业Buff——近战减伤 20% ,则近战状态下修正其FC = 12500。
- 刺客:生命500,输出20,攻击间隔1s,FC = 10000,为其赋予职业Buff——暴击率 20% ,暴击伤害翻倍,则修正FC = 500 * 20 * (0.8 + 0.2 * 2)= 12000。
- 猎人:生命700,输出15,攻击间隔1s,FC = 10500,其FC低于修正后的战士和刺客,但考虑其有一定射程优势,这一数值未尝不平衡。
- 同理,法师考虑技能的AOE和MP对技能的释放限制。
思考-10.1
如何理解 “数值系统需要一个既定的原则”?
在前面的原则1中,我们提到:“不论怎么设置数值,都需要遵循一个既定的原则。这个原则不论数值是否在规则与机制上合理,都需要在数学逻辑上是体系化的” 。如何理解此处的“原则”?。
细心的读者已经能在我们简化版的MMORPG或《三国杀》的例子中找到答案——作为数值策划,我们在寻找的其实是一个锚点。
我们已经提到过,不论玩家关系是怎样的,也不管平衡是相对还是绝对的,一款游戏是应当有所平衡的。所谓“平衡”二字隐含的陈述其实是“多个选择收益均衡”,换句话说,我们在讨论的是一个前面博弈论中阐释的混合策略纳什均衡的期望支付问题。既然是混合策略,就需要营造差异化——表现在内嵌层,就是游戏中不同对象的相同变量有所错位。
但是这一错位是随意的吗?自然不是。设计者在制定错位之前应该先找到一个锚点,它可以是一个规则或者是一个数值,随后基于这一锚点进行数值的差异化设计,来确保“不同”的核心其实是“相同”的。表现在我们前面的MMORPG里,就是不同职业的FC值是统一的,尽管得到同样的FC值的方式并不相同。而以集换式卡牌游戏《KARDS》为例,我们会更清晰地看见这一锚点的作用机制:譬如对于任意国家的1费1油白板普通步兵卡,其攻击与血量的和应当为4,任何附加的词条或者更低的油费(0费)可能降低这一数值或者使得卡牌的稀有度上升(影响卡组中这一单位的数量)。尽管在这一平衡机制下仍然有部分低费单位尤其超模,但是至少这一确定的原则使得游戏的基础平衡性维持在一个相对稳定的区间。
四则运算模型需要注意的点
- 假设设计两个戒指,一个是伤害+10,一个是攻击速度+10%,那么我们可以将伤害转化成百分比进行计算。如果这10点伤害的加成是大于10%的,即玩家在没有佩戴戒指的时候单次伤害低于100,那么前一个戒指是更有作用的,反之则是厚泽,每次100点伤害就是这两个道具的平衡点。这也就是为什么:
- 前期道具一般用具体数值;
- 后期道具一般酌情使用百分比。
- 尽量不要使用小数字系统,1~2的变化不是增长1,而是增长100%。
- 四则运算在战斗中只能应付简单的情况分析,稍复杂的还需用到微积分。
- 当然,四则运算适合做线性的设计。
幂函数
- 前期容易后期难是普遍的等级与时间递加设计原则,在i < 1时有这一特性。
- 档i > 1,其连锁递增效应是用来奖励的上好措施。
- 某些需要积累到一定程度才能体现出优越性的属性设定往往要用到 F(x)= x ^ i(i >1)的先缓后急特性,
- F(x)常常以a/(b-x)的形式出现,常常用来实现具有临界值的属性设定,且x多有取值限制,需要很好的前期规划;(比如减伤,前期不明显,到达某个点后尤其明显)
- 幂函数的计算相对复杂,不适合做心跳计算。
- 幂函数和对应的思路,适合做非线性设计。
- 指数函数使用的很少,主要因为其增长速度过于不可控。
便签-10.1
心跳计算(Tick计算)
心跳计算(Tick/Heartbeat),指的是游戏服务器 / 客户端以固定时间间隔(比如 100ms / 次)周期性执行逻辑的计算方式,类似心脏跳动一样,每隔固定周期处理一次数据更新,而不是实时、逐帧计算。其有四条核心要求: * 性能稳定性:要求单次计算耗时低、无波动,不能拖慢 Tick 周期,否则会出现帧延迟、服务器卡顿、逻辑时序错乱; * 支持高频批量执行:单 Tick 内可能要给数百上千个玩家 / 怪物单位同时计算,要求轻量运算,扛得住大规模并发调用; * 无累计精度误差:心跳是周期性重复计算,不能因为多次执行出现精度漂移,导致长期运行后数值逻辑崩坏; * 只做必要的极简计算:心跳里只放必须实时刷新的逻辑。
因此,不难理解为什么熊老师说“幂函数不适合心跳计算”了,实现非线性的数值缩放,数学上需要通过对数 + 指数的复合运算实现,而非 CPU 原生支持的基础四则运算。
幂函数的应用
- 升级经验 = ceiling(1000 × 等级0.66)
- 消除类休闲游戏(如宝石迷阵),COMBO得分:
COMBO得分 = 100 × 本次宝石个数 × 2combo次数
- $\text{魔法攻击}=\text{智力值}+\left[\text{int}\left( \frac{\text{智力值}}{10} \right)\right]^2$
- (int=向下取整)
- $f(x)=\frac{1}{x}$ 的应用:
攻击速度$=\frac{50}{200 - \left( \frac{250-\text{敏捷}-\frac{\text{灵巧}}{4}}{50} \times (200-\text{基本速度}) \right)}$
命中率$=\frac{100}{1+(150-\text{敏捷})}$
- $\text{魔法回复(点/秒)}=2+\left( 2+\frac{\text{精神}}{50} \right)^2$
线性与非线性的性价比问题
- 一个很典型的例子是,DOTA2中“铁树枝干”、“圆环”、“极限法球”、“斯嘉蒂之眼”。这一系列道具都为全属性加成道具,但是越靠后期的装备(加成总数越大),其单位属性对应的价格就越高(即性价比越低),这正是幂函数非线性的体现(当然,也可以理解成后期装备包含装备格子的溢价)。
原则2:
一般而言,刚需元素尽可能采取线性模型进行设置,以减少平衡性设置的难度。同时,非刚需元素可以采取非线性规则,性价比曲线上,采取幂函数控制,越高级的东西性价比越低(核心原因是高级的东西有额外的附加价值)。
随机数与正态分布
Random[]: 在[0, 1]区间上随机取数;Random[Integer, {1,100}]: 在[1, 100]区间上随机取整数;- 1d8 = Random[Integer, {1,8}]:投一次8面骰;
- 2d4 = Random[Integer, {1,4}] + Random[Integer, {1,4}]:投2次4面骰;
- …
- xdy = Random[Integer, {1,y}] + Random[Integer, {1,y}] + …:投x次y面骰;
- 多个骰子投出的结果会满足正态分布,正态分布也是自然界普遍的规律。
随机数与正态分布用例
某盗贼的闪躲为20%;即
Random[Integer,{1,100}] ≤ 20时,闪躲成功,否则失败;某盗贼的闪躲为20%,格挡为10%,两者优先级等同;即
Random[Integer,{1,100}] ≤ 20时,闪躲成功,21 ≤ Random[Integer,{1,100}] ≤ 30时格挡成功;某盗贼的闪躲是20%,格挡是10%,完全闪躲是25%(比如身在AOE中都能完全闪躲),优先级 完全闪躲 > 闪躲=格挡;即
Random[Integer,{1,100}] ≤ 25时,完全闪躲,否则,Random[Integer,{1,100}] ≤ 20闪躲,21 ≤ Random[Integer,{1,100}] ≤ 30格挡;- 格挡和闪躲互斥。
- 完全闪躲与格挡或者闪躲不互斥且有优先顺序。
伪随机
- 大部分情况下,电子游戏为伪随机。
- 设计桌游的情况下,分析问题需要考虑真随机。
涉及到随机数与正态分布的策划设计,建议使用编程模拟。
正态分布,数值敏感与赔率
- 三个骰子,投出的点数和总是保持正态分布的。
- 在一个现实的情境里,一个赌场如何保证自己在三颗骰子的赌博里稳赚不赔?
- 这里涉及到两个数值策划问题:
- 赔率设置问题。
- 数值敏感问题。
数值敏感
- 假想我们需要制定一个测评问卷,不设分数上限,比较好的给分策略是,回答正确加10分。
- 为什么不加1分?10分比较高大上吗?
数值敏感的案例1:
- 异虫的跳虫数据:HP = 35,攻击 = 5,护甲 = 0
- 星灵的狂热者数据:护盾 = 50,HP = 100,攻击 = 8 * 2,盾甲 = 0,护甲 = 1
正常情况下,一个狂热者需要攻击跳虫3次,最后一击溢出伤害为 35 − (8 − 0) * 2 * 3 = −13 - 如果狂热者选择升级1级攻击,则只需要攻击跳虫两次:35 − (9 − 0) * 2 * 2 = −1 - 此时,输出效率不是+1,也不仅仅是增加12.5%,而且提高了50%
所以在星灵对抗异虫的比赛中 - 星灵永远优先升级1攻 - 异虫永远优先升级1防(除非放弃跳虫战术)
这是利用数值引导子博弈完美纳什均衡的一个实例。
数值敏感的案例2:
- 三国杀中,每回合每个武将摸牌数为2
- 三国杀的孙权被认为是单挑王(因为其技能制衡可以换掉手中所有的牌,对于这么一个运气为主的游戏而言,其意义自不必说)。
- 对于任何一个4血(孙权为4血)没有单挑有效技能的武将而言(比如刘备),对抗孙权的胜率不足20%
- 很多3血武将都有多摸牌的技能,比如周瑜可以摸3张牌(技能名英姿)。
- 如果某个4血武将拥有英姿(即每回合多摸一张牌),和孙权单挑的胜率变成了60%左右。
- 为什么仅仅多一张牌,一个4血武将就从单挑白板变成超越孙权的单挑王?
- 事实上,三国杀所有早期官方武将里,4血武将都没有无代价多摸牌的技能。
- 换言之,如果能无代价多摸牌,那就必须降低该武将血量,这是游戏维系平衡的基本思想。
数值敏感的案例3:
接着三国杀的问题: * 以下两个技能,哪个摸牌期望多?(牌堆是108张,红黑各54张) * 英姿:摸牌阶段,你可以多摸一张牌 * 洛神:准备阶段,你可以进行判定,若结果为黑色,你获得此牌,然后你可以重复此流程 * 进行简单的微积分计算可以得知,洛神的收益在牌堆数无限时趋近于1,在给定有限摸牌数的情况下略低于英姿,但基本等于1。
三国杀系统崩坏案例
- 结合之前的分析会发现,所有拥有额外摸牌技能的武将,生命值应该小于4点,且额外摸牌数期望应该接近+1收益(自己得到一张为+1收益,敌人失去一张亦为+1收益)。
- 4血以及4血以上的武将,如果多摸牌,应该以付出代价(比如曹仁的翻面,黄盖的自残),亦或者是不稳定收益做弥补(无法做到每轮多摸一张)
- 按照郭嘉,司马懿等武将的原则,1血=2牌收益,那么一个武将在阵亡前平均能获得6~8牌收益为平衡原则。
- 为什么最后出现了第八节课介绍过的“反贼杀”的现象,不仅仅是策划初期没有预估纳什均衡,同时后期的三国杀为了运营利益,开始突破了3血才有资格无代价获得150%的摸牌效率、1血=2牌等自订模型。自己破坏自己设定的哲学。
原则3:
正常情况下,建议游戏中所有涉及到数据的设定,都有一套自己的体系规则进行解释,在规则与公式体系内进行操作可以有效避免数据与规则的崩坏,一旦开了游离公式外的口子,就是数据系统螺旋迭代崩溃的开始。在一个涉及到氪金的项目组中,与游戏运营斗争以保证数据公式化,是游戏策划的必修课程之一。
可以认为这是对原则1的进一步补充。
思考-10.2
对于这里熊老师提到的“策划与运营之间的斗争”,笔者认为是部分公司将电子游戏过度互联网产品化的负面效益,是对决策者对游戏缺乏深入理解的表现。
在笔者有限的认识里,在理想的状态下,电子游戏的上线前的设计开发与上线后的运营盈利应当以一种高效而和谐的方式协作,共同维护游戏的社区生态,使得游戏的生命周期得以尽可能延长,从而实现最大化的商业效益与口碑增长。但考虑到商业游戏不可避免地受到盈利要求的硬性限制,使得设计者与运营者难以完全调和地从同一视角看待游戏产品,一定程度上用商业视角对游戏的营收进进行调节也是完全合理的。
但是笔者认为这不是《三国杀》等网游运营为人所诟病的正当理由——有限的调节不等同于无限制地捞钱,罔顾游戏环境新增破坏游戏体验的内容,既是对设计者的不尊重,也是对玩家的不尊重。《三国杀》的生存依赖着一批数量庞大的玩家对游戏IP与内容的情怀 / 惯性黏着以及竞品市场的空缺,如果没有这一批深度用户,或者如果出现能够抢占其生态位的作品,则《三国杀》的IP纳新吸引力与玩家转化能力恐怕难以与主流的网游进行对比,很容易在更加严酷的环境中消亡。
避免数据爆炸
- 反面案例:《暗黑破坏神3》伤害动辄上万甚至破亿,偶尔还能见到兆、京级别的伤害。作为对比,《暗黑破坏神2》满级伤害也不过数千。于是暗黑3不断地增加难度,在各项数值后面直接加0。
- 为什么会数据爆炸?
- 制定数值时,对于游戏的前期,一定要慎用小数据。1~10的变化不只是加了9,而是提高了1000%。
- 一旦习惯了数值指数级别的扩散,极容易在不知不觉中影响后续公式,引发数值爆炸。
- 装备和技能伤害要慎用乘法公式,乘法导致的数据爆炸往往在初期和公式中不易察觉。
- 数据爆炸的结果往往是数值的无限螺旋迭代,最终会导向数值系统的崩坏。
原则4:
数值策划的工作中,谨慎使用小数据以及乘法公式,避免引起蝴蝶效应,引起整个游戏的数值爆炸。
概率论
第四节课讲需求,以及第九、十节课讲博弈,都说过一个问题——如果一个游戏没有随机性,那么它距离Solved Game就不远了,随机是保持uncertainty的最强手段,也是维持玩家新鲜感的动力。
实际问题中的应用
- 丢骰子的问题
- 套装搜集的问题
- 胜率问题
丢骰子的问题
- 一个6面的骰子,丢一次每个面出现的几率是1/6(16.7%)
- 要求出现6的概率达到95%,应该丢几次骰子?
- 1 − (1 − 16.7%)x > 95%
- x = 16.40
所以第五节课讲工程的时候,为什么第一次迭代,飞行棋加入丢出6才能起飞?事实上,要保证玩家的飞机能起飞,平均就要丢出10+次左右,大大延长游戏时长
套装搜集问题
- 问题描述:某套装A由n件装备组成:A = {a1, a2...an}。
- 每件装备ai都由某BOSS掉落,且每次只掉落一件,每件装备的掉落概率由概率向量p给出:P = (p1, p2...pn)。
- 为收集齐此套装的n件装备,平均需要杀多少次BOSS?
- 具体,设P = (0.05, 0.1, 0.15, 0.2, 0.25)
- 计算得,结果约为25次。如果策划认为这一结果不符合其对玩家行为的预期,则可以通过修改上述集合P中的元素来引导这一结果的变化,从而影响玩家行为。
- 数字策划应当尝试利用程序解决类似问题,纯数学会很麻烦。
胜率问题
- 两个玩家对抗,谁会获得最后的胜利?怎么计算?
- 为什么上节课所讲到的中国象棋开局双炮换双马,会导致几乎无法获胜?
- 足球比赛中,中国对抗法国,中国有多少胜率?
- 对于这个问题,熊老师引用2020年的数据,计算出的结果是胜率仅为2.25%,平率5.75%,输率92.00%(国足胜率至少远高于CS箱子爆率)
为了解决胜率问题,我们引入
恶名昭彰大名鼎鼎 的Elo机制:
- 对于这个问题,熊老师引用2020年的数据,计算出的结果是胜率仅为2.25%,平率5.75%,输率92.00%(国足胜率至少远高于CS箱子爆率)
为了解决胜率问题,我们引入
Elo Rating System
- Elo rating system 用以准确地计算玩家之间的胜率. 于1960年由Arpad Elo
建立。
- 最初用于国际象棋。
- 现在也广泛应用于电子竞技和体育比赛中。
- 玩家的实力点数差
- dr = Rating A − Rating B
- 玩家A的预期胜率公式: $$W_{ea} = \frac{1}{1 + 10^{-\frac{dr}{400}}}$$
Elo Rating System 平局方程
- 最初版的Elo Rating 的适用范围仅用于没有平局,或者几乎没有平局的游戏
- 熊硕老师的博士研究有一部分内容是破解平局游戏下(比如足球的Elo Rating公式)
$$ P(\text{win elo}) = \frac{1}{1 + 10^{-\frac{dr}{400}}} - \frac{1}{2}P(\text{draw elo}) $$
$$ P(\text{lose elo}) = \frac{1}{1 + 10^{\frac{dr}{400}}} - \frac{1}{2}P(\text{draw elo}) $$
$$ P(\text{draw elo}) = f(x) = \frac{1}{\sqrt{2\pi}e} \exp\left(-\frac{(\frac{dr}{200})^2}{2e^2}\right) $$
笔者后记:我其实没看懂,但还是把这部分贴上来了
赔率计算
赔率是一个数字表达式,通常表示为一对数字,用于赌博和统计。 * 一个简单的例子来解释投注赔率是如何来的:当A队对B队时,1000名观众预测结果,900名观众选择A队获胜;90名观众选择平局,10名观众选择B队获胜。
$$ O(\text{win}) = \frac{1000}{900} = 1.11 $$
$$ O(\text{draw}) = \frac{1000}{90} = 11.11 $$
$$ O(\text{lose}) = \frac{1000}{10} = 100 $$
- 为了挣钱,博彩公司将以上三个赔率修改为 (1.06, 10.3, 90) 来降低赔率。
赔率反推胜率的计算
$$ P(\text{win bet}) = \frac{1}{\frac{1}{O(w)} + \frac{1}{O(d)} + \frac{1}{O(l)}} \times \frac{1}{O(w)} $$
$$ P(\text{draw bet}) = \frac{1}{\frac{1}{O(w)} + \frac{1}{O(d)} + \frac{1}{O(l)}} \times \frac{1}{O(d)} $$
$$ P(\text{lose bet}) = \frac{1}{\frac{1}{O(w)} + \frac{1}{O(d)} + \frac{1}{O(l)}} \times \frac{1}{O(l)} $$ Winning probability by betting odds method
专业性排名与娱乐性排名
- 一般来说,绝大多数带有成熟竞技体系的项目,都有自己的一套专业排名。
- 但同时,往往也存在一些所谓的“娱乐性排名”。这一排名的意义在于吸引更多人参与这一竞技项目,或仅仅旨在为这一娱乐排名本身带来热度。其往往与更专业的排名结果存在差异,尽管这类娱乐性排名甚至有时来自相对权威的机构。
- 一般来说,对于面向轻用户的产品,一般不使用Elo排名,而是用娱乐排名,以更多地吸引玩家参与到游戏中来。
原则5:
涉及到概率论的问题,强烈建议编程进行模拟,比单纯的使用数学工具计算的效率要高得多,而且电子游戏的概率本来也是模拟生成的。
微积分
多个战斗单位的战斗过程
在游戏中,玩家常常会组队与怪物进行战斗,会出现多个玩家与多个怪物战斗的情况。在有的游戏中,玩家甚至直接指挥多个单位,与敌对势力进行战斗(星际争霸,魔兽争霸,帝国时代等等),那么,在多个单位的情况下,战斗的结果会如何呢?
假设红军兵力是蓝军的2倍,每个人每分钟射出的子弹数一定,那么在相同的时间内红军射出的子弹就是蓝军的2倍。如果每枚子弹击中敌人的几率也一定,那么相同时间内蓝军的损失数量就是红军的2倍,而这将进一步加大两军的数量差距,直到蓝军被彻底击败。
多人战争的一个趋势,就是起初的优势会随着战斗过程的进行而被逐渐扩大,因此多人战斗过程绝对不是直接采用承受乘以输出,然后相减这样简单,或者说,我们要换用一种方法来对FC进行计算。现在就用一个基本的数学模型来进行说明。
基本假设
- 假设任何一个单位都能够连续不断地对敌方的单位进行攻击直到被摧毁或者战斗结束。
- 双方都采用最优的战斗模式。
- 比如一方每个单位的生命为100,那么在受到240点伤害时,两个单位死亡,还有一个单位受到40点伤害,而不是六十个单位受到4点伤害或者80个单位受到3点伤害。
- 每方的战斗力与战斗单位的数量成正比。
- 不难发现,对于这种对抗,任意一方的最优策略都是“伤其十指不如断其一指”。
微积分使用案例
- 现在一方有X0个单位,另一方有Y0个单位,(假设X0 > Y0),杀伤力为p(p为单位时间输出伤害与战斗单位生命的比值)。
- 比如《星际争霸2》中,陆战队员对射,每个陆战队员攻击力为6,生命为45,那么杀伤力就是6/45。
- 那么战斗过程的微分方程为:
$$ \frac{dx}{dt} = -py $$
$$ \frac{dy}{dt} = -px $$
- 加上初始条件,t = 0时,x = X0 ,y = Y0
- 求解微分方程可以得到:
$$ X = \frac{X_0 + Y_0}{2} e^{-Pt} + \frac{X_0 - Y_0}{2} e^{Pt} $$
$$ Y = \frac{X_0 + Y_0}{2} e^{-Pt} - \frac{X_0 - Y_0}{2} e^{Pt} $$
- 当 $t = \frac{1}{2P}\ln\frac{X_0 + Y_0}{X_0 - Y_0}$ 时,Y = 0,Y方被消灭,此时X方还剩下 $\sqrt{X_0^2 - Y_0^2}$
兰彻斯特平方定律
- 我们用更加直观的方式观察微分组,将2式的左右互换然后与1式相乘:
$$ x \frac{dx}{dt} = y \frac{dy}{dt} $$
- 进一步我们有:
$$ \frac{dx^2}{dt} = \frac{dy^2}{dt} $$
- 从0到任何时间单位t的积分,我们可以得到一个非常重要的结论:
X02 − Y02 = xt2 − yt2
- 兰彻斯特平方定律
- 在任何时候,双方的人数平方的差距不变,假设单个单位的战斗力为FC,那么对于n个单位,其战斗力与n2 × FC成正比
- 足球场上被罚一人,9打10仅仅只是少一个人的问题吗?
思考-10.3
上述繁复的数学过程其实并不重要,重要的是其展示出来的结论:不均衡的对局在动态的时序里可能会进一步拉开的优劣方差距。这一结论连同前文提到的多个案例,再一次对数值策划的数值敏感力做出强调。笔者认为,数值策划需要关注的不只是数值本身的大小,还需要关注数值配比在系统中运作的过程里可能造成的一系列影响。
换句话说,数值策划首先需要在静态的思维里考虑带入具体数值的游戏系统是否能与其他系统按照预期耦合,其设置是否有自洽的逻辑,是否符合前文提到的锚点原则,是否可以实现这一系统的设计目的。另一方面,还要考虑这一数值对于其系统乃至整个游戏在动态(时间)视角下的影响,着重考虑动态因素是否会扩大或缩减这一影响。
举个例子,假设我们需要为CS2设置一款新武器,首先需要考虑为什么要加入这把武器——它要弥补的缺位是怎样的?换句话说,也就是其武器定位,是近战爆发,还是远程泼水,还是全能突破?对此进行一系列射速、伤害、弹道、弹容等数值配比,进而计算出这一武器某一类似于FC值的参数,还要考虑对比其他武器制定其售价等等,这是静态层面的设计思路,随后,数值策划需要考虑,在动态视角下,这一武器的种种数值是否可以融入游戏中已经稳定的纳什均衡,或者是否能引出新的良性纳什均衡?它的数值是否会导致CT和T在特定地图的优劣势被放大/缩小,或者引出未知的恶性后果?它会不会影响职业选手们的策略选择,从而影响游戏的电竞观赏效果(比如SG553曾一度取代Ak,但是其观赏性远远不如Ak)?它对应的皮肤会如何影响饰品市场?
有网梗云,CS最忙的策划,工作量比不过某些游戏最闲的策划,即因如此。对于一个无比精巧又万众瞩目的系统,再高明的设计师也不敢贸然对其数值或机制进行大幅度的更新。
兰彻斯特定律应用案例
即时战略的微操
- 星际争霸中的异虫vs异虫的飞龙互拼
双方攻防等级相同,不同数量的飞龙在操作的情况下互拼(不考虑飞龙随时间的自然回血),A方12条,B方10条。
战斗开始,可以预见,A将获得胜利,122 − 102 = 44,44开根号得6.63。说明A会剩下6到7条飞龙。
但是,如果B通过操作或者某种战术,使得A的飞龙6条6条的参加战斗。由于62 + 62 < 102,因此B将获得胜利,并且还可以剩下102 − 62 − 62 = 28,28开根号得到5.29,也就是说B将还剩下将近1半的飞龙,这也是在这类游戏在中操作或者战术的作用。
同样DOTA和LOL为什么要经常去Gank,等级或者经济稍微落后的状态下,2抓1后,再继续Gank抓1个,比2v2要有效的多。
这也是为什么RTS需要用微操弥补数值上的差异。
公式
公式
- 游戏过程中所有的系统均由公式构成。
- 具体的公式根据游戏策划的考量而定。
- 没有一成不变的公式。
- 公式设定一定要注意避免数据爆炸或者出现数学Bug。
- 对于模拟类游戏,避免出现现实Bug
- 比如钢铁雄心的菜刀兵,肉身无热兵器,血战钢铁洪流。
基于攻-防的战斗方式
- 最简单的战斗模型中,玩家只能进行很简单的控制,在实际的游戏中只进行这样简单的伤害是难以满足玩家要求的。在很多游戏中,常常会采用简单攻防加减的形式来进行战斗过程设计。这种设计的基本规则是:
- 每次攻击造成的伤害=攻击方的攻击力-受攻击方的防御力:
dX = attX − defY
dY = attY − defX
- 在这种情况下,我们来看双方的战斗力比值,一方为玩家,攻击力为attX,防御力为defY,攻击频率为fX,另一方是敌人,攻击力为attY,防御力为defY,攻击频率为fY。那么双方的战斗力分别是:
FCX = hX × (attX − defY) × fX
FCY = hY × (attY − defX) × fY
- 对于以上的公式,我们可以至少看到以下规律
- 对于不同的敌人,玩家的战斗力不再取决于自己本身的数值,还跟玩家具体要面对的敌人的防御力相关。同样,敌人的战斗力也与玩家的防御力相关。因此,玩家和敌人之间的胜负关系,在实力很接近的情况下,可能会无法形成传递关系(A > B , B > C,所以有A > C)。这里可以举一个很简单的例子:
单位 A: hp = 1000, att = 50, def = 0, f = 1
单位 B: hp = 1000, att = 100, def = 20, f = 0.25
单位 C: hp = 1000, att = 25, def = 0, f = 3
- 如果这三个单位进行实际的对战,通过简单的战斗力计算,我们可以看到,A > B,B > C,而C > A。在没有任何外加属性(如单位大小、五行等等)这就形成了一个循环相克的局面。
基于伤害的战斗方式
- 在有些游戏中,单位的属性中不仅仅包含了攻/防,还有伤害值,攻防不再是伤害的决定值,只对伤害起到加/减成的作用。在这里,由于各个游戏攻防的加成方法不同,因此只能给出一个具有不确定性的公式,此类战斗的基本计算公式是,这里d*指产生的最终伤害,dmg指单位的标定伤害值
d* = dmgX × f(attX, defY)
在有的游戏中,也会导入其它的因素来影响d*
以魔兽争霸3为例:
《魔兽争霸3》防御力对伤害进行减成。其具体计算公式为:
$$ d^* = \text{dmg}_X \times \frac{1}{1 + def_Y \times 0.06} \times f(ac, dc) \quad \text{当 } def_Y > 0 \text{ 的时候} $$
d* = dmgX × (2 − 0.94−defY) × f(ac, dc) 当 defY < 0 的时候
其中 ac 为攻击类型,如普通攻击、穿刺攻击、攻城攻击等,dc 为防御类型,如轻甲、中甲、重甲等。在《魔兽争霸3》里,不同的攻击类型和不同的防御类型组合,会产生不同的破甲效果。
游戏洗练度理论(Game Refinement Thoery)
- 将游戏进程模拟成物理活动,以描述其在大脑内活动的过程。
- 同时考虑游戏的数学复杂度,与博弈策略集。
- 用于宏观把控游戏的节奏设置与可玩性评估。
- 确保游戏适合于娱乐或者适合于学习。
思考:游戏越复杂就越好玩吗?
- 游戏复杂度复杂性由值BD给出
- B是可能移动的平均数(博弈策略集)
- D是平均游戏长度
- 根据洗练度理论可以计算出一个RV(Refinement Value)值,值得注意的是,大部分较为成熟的游戏的RV值都稳定在在固定范围内(0.07 ~ 0.08)
便签-10.2
关于游戏洗练度理论
这里熊老师引用了他留日期间导师的一篇论文,也就是北陆先端科学技术大学的Iida教授团队的 Application of Game-Refinement Theory to Mah Jong。笔者试着找到了这一文献,发现其理论相对较为抽象,但是相当具有启发性。由于篇幅问题这里不做展开,后续笔者会在单独的篇幅尝试与读者一起精读这一文献。
成为一个数值策划
- 综上,如何成为一名出色的数值策划?
- 学习:包括一定的数学知识与数据处理工具,比如Excel和Python,培养数据敏感度。
- 多玩游戏:
- 如果喜欢卡牌,就去玩万智牌,炉石传说,三国杀,杀戮尖塔等等。
- 喜欢对抗性游戏,就去玩各类RTS和MOBA。
- 喜欢RPG,就去玩各类DND和RPG,
- 多试试桌游。
- 数据收集:
- 通过各种渠道去搜集已有的成功的游戏的数值,尤其是其后台数据(如果有);
- 听取他人意见——第五节课提到的可用性测试与评估报告。
- 拆解游戏模型:
- 分析规律,反编译公式与数学模型——它们可能是公开的,可能是保密的。
- 修改目前游戏数值机制有问题的地方,取其精华去其糟粕。
- 重塑:
- 通过博弈预判可能会发生的利益问题。
- 测试修改迭代目前的数值设定。
- 给出自己的数学模型与解释体系,并且控制整个游戏不要偏离体系。
**