争论不休的减法公式和乘法公式究竟有什么区别?
发表于2017-04-13
减法公式和乘法公式的讨论一直没有休止过。”一千个读者心中有一千个哈姆雷特”每一个对数值有所了解的人都有自己对这两种公式的理解。正好最近也被问到了这个问题,也写了一点自己对减法公式和乘法公式的运用理解,这里仅表达的是一些个人对减法公式和乘法公式的用法愚见。
先思考两个问题
无论是哪一种公式,它本质都是战斗公式,游戏里的”战斗”是什么?战斗公式又是什么?
战斗本身是一个过程,游戏里的”战斗”是有现实意义的,也就是包含对最基本规则的认知。
一般来说最基本的逻辑是 生命值=生命值-伤害值 (伤害值由战斗公式给出) 生命值<=0 战斗结束。
完整的战斗是包含战斗结束的,如果战斗无法结束那么也就没任何意义了。
所以战斗公式是判断战斗何时、怎样结束的一个标准,它的目的就是给出一个"合理"的伤害值
(合理是指”符合预期”无论是玩家还是设计者而且”不会使战斗无法结束”)
如果理解了上述几个前提后,那么就可以继续分类讨论了
===========================================================
战斗公式如何处理一类值?
如果只给出一类值,不存在另外一类与之对抗的值,也就是一方的伤害值与另一方无关。
那么 伤害值=X 这就是最基本的战斗公式
像FPS游戏中(不存在防弹衣和头盔的情况),我们想要让子弹的威力会受距离衰减。
- 伤害值=子弹初始伤害值*距离参数公式(乘法)
- 伤害值=子弹初始伤害值-参数1 距离的分段函数 (减法)
两种计算方式,一种是乘法 一种是减法的分段函数 都可以达到我们的预期
同时我们发现这两者的曲线完全可以拟合,分段函数分割的足够小,也就拟合出了乘法的公式。
至于打中人体的不同部位伤害不同,我更愿意理解为不同部位都是战斗的另一方,有自己的生命值,只不过这些部位有特殊规则,生命值=Min(所有部位)
在这种情况下减法公式和乘法公式有什么区别呢?
答案是没区别,只处理一类值的情况下,无法区别开乘法公式和减法公式。
=====================================================
战斗公式如果处理两类值
这两类值可以相互对抗,也就是伤害值取决于双方,双方的值都会对最终的伤害值有影响。(一般来说是”攻”与“防”)
- 减法公式:伤害值=攻-防
- 乘法公式:伤害值=攻/防
实际上战斗公式没有这么简单,角色的属性也不止存在一组对抗属性。
比如 A有 8攻击 4防御 30%暴击率 10%抗爆率
B有 10攻击 5防御 30%暴击率 10%抗爆率
在攻击与防御用乘法 在暴击与抗暴击用减法
伤害=A攻击*A攻击/B防御=8*8/5
实际暴击几率=A暴击率-B抗爆率=30%-10%
这种模型下的战斗公式是减法还是乘法?我想大部分人都会肯定是乘法吧
真正意义上划分乘法和减法公式”就是对“防御”这个属性的处理上
公式上来看一种是加减法处理一种是乘除法处理(当然这是一句废话)
从运算符看来区别在于不等式的传递性
假设有存在3个角色 A B C,有不同的生命值 攻击力 防御力,攻击间隔都是1,同时开始攻击。两两对抗。
乘法公式下,A胜B,B胜C 那么A一定胜C
A胜B:HPb/DPSaHPb*DPSb 也就是HPa*(ATKa*DEFb)>HPb*(ATKb*DEFa)
最终是 HPa*ATKa/DEFa>HPb*ATKb/DEFb
B胜C:HPb*ATKb/DEFb >HPc*ATKc/DEFc
根据不等式的传递性,A一定会胜C
而在减法公式下,A胜B,B胜C,A不一定胜B
虽然我们也可以通过选取合理的公式和值的范围也可以存在这种强弱的传递关系。但从运算符的数学属性里面这一定不是真命题。
实际上传递性也大致可以反映出一个问题是,在乘法公式下属性的价值更客观真实,也就是”边际效应”的问题。
===================================================================
回到之前的论点”真正的区别就在于对防御的处理上“
处理包含两种意思,一种是公式上的处理,一种是投放上的处理
使用减法公式那么必须时刻要注意“防御”在不同情况下的上下限,在某种情况下可能过于IMBA,导致根本无法”破防”("魔塔"是最能反映这一点的一个小游戏)
无论是使用什么战斗公式,目的都是计算出符合预期的值,最终数值会怎么样,都与公式无关,只是与使用者有关。