战斗力是怎么计算的
战斗力是怎么计算的
1.1. 定义战斗力
借鉴中学物理里关于能量的定义:
一个物体能够做功.我们就说这个物体具有能.能量是表示物体做功本领大小的物理量, 能量可以用能够做功的多少来衡量.一个物体 "能够做功 并不是一定 "要做功.也不是 "正在做功 或 "已经做功.如 : 山上静止的石头具有能量.但它没有做功。
在游戏里,我们可以这样定义战斗力:
一个单位能战斗,我们就说这个单位有战斗力,战斗力是衡量一个单位的战斗能量大小的量。战斗力越高,该单位在作战时能够取得的优势就越大——作战能力越强。
早期的游戏中,是没有战斗力的概念的。玩家们通常以等级和装备水平来判断实力,这种判断很依赖对游戏的理解:
早期的网络游戏,《万王之王》(中国第一款图形网络游戏,2000年7月在大陆正式上市),有一个评估对手的交互功能:
《万王之王》的评估,在跨职业对玩家操作时,准确性较差,记得当时比我高2级,装备豪华的巫妖,在对我使用评估时,显示的是“对方比你强多了,小心为是“,可能是由于我的职业圣骑士的防御和血量属性,在作为战斗力的参考时,这2项属性影响更大。
1.2. 影响战斗力的因素
按上述定义,影响一个作战单位战斗力的因素有很多,选手(玩家)状态、选手策略、作战单位的状态(buff、debuff)、作战单位的属性、作战单位的技能等等。
我们没有办法面面俱到,而且那样做也是没有意义的——不能简化就不是模型。所以,我们只考虑一些和作战单位本身相关的、相对比较稳定的因素作为战斗力的参考因素——作战单位的属性。
略有争议的是,有的策划主张把技能也计入战斗力,而另一些策划则选择不这么做。出于数值设计模块化的考虑,以及技能释放的一些不确定性(如wow副本中技能释放次序、九宫格对战时技能的发动频率),大多数的游戏里,技能是不计入战斗力的,但这并不是绝对的。
在战斗力不计入技能时,技能作为一个独立的模块,代表的是战斗力的发挥水平。这样的好处是,战斗力的构成模块——属性和战斗力的发挥模块,可以分别计算保证各自的平衡性和成长性。
以最简单的例子,角色/卡牌的等级、装备、科技/奇门/经脉(或其它什么叫法)等的成长提高战斗属性的数值,技能的提升,增加技能伤害系数——攻击或技能时,发挥的攻击力(或其它属性)的数值的%。
(我是mt的卡牌进化,属性增加、技能升级)
1.3. 战斗力的计算
在定义了战斗力,确定了影响战斗力的因素之后,我们可以开始计算战斗力了。
计算战斗力也有2种方法,1种是找一个统一的参照物,如某草人,攻击力为1,生命值无限,在计算某个单位的战斗力时,以该单位被杀死时,草人损失的生命值来衡量该单位的战斗力;另1种,则是找到一个能较准确的描述属性变量和战斗力的函数关系式,将公式简化,得到玩家方便理解的战斗力计算公式。
1.3.1. 参照法
这个计算方法的关键之处,在于找到合适的草人,比如上文描述的,攻击力为1的草人,在 伤害 = 攻击 - 防御的减法公式里,并不能准确的反应战斗力。在除法公式,值为1的攻击力,在被防御的%减免后,也体现不出防御提升带来的战斗力变化。
我们在设计职业时,通常先选择一个标准模板,比如说战士,以其攻击、防御、血量等属性作为参考,各属性方向分别拉伸或缩减,以构成新的职业。以这个标准模板,作为草人的属性模板,修改其血量为无穷大,这样可以得到更好的结果。
若提高1点的攻击力,最终反映到草人的损失生命值上是10,我们可以认为每点攻击力提高了10点的战斗力;同样的,我们可以确定防御力、生命值等其它各属性对战斗力的提升效果,得到战斗力的计算公式。这个公式是一个各属性的加权求和计算:
如,战斗力 = 攻击力*2 + 防御力*1 + 生命值*25 + …
备注:这种算法,有可能各职业的战斗力公式不一致,即,有可能战士的1点攻击增加2点战斗力,而盗贼则增加1.5战斗力。
1.3.2. 公式法
在有些时候,我们可能会较容易的找到一个准确描述战斗力的函数关系式。比如:
为引入概念,先简单的假设,当战斗的属性只有攻击和血量时,我们知道 战斗力 = 攻击力 * 生命值。
在此基础上,我们再引入除法公式和防御力属性,那么 战斗力 = 攻击力*生命值*(1+防御力*k),k为1点防御力等效提高的生命值的比例。
类似的,也可以引入暴击、回避等各类属性,战斗力 = 等效攻击 * 等效生命值,几何上,战斗力的值等于边长分别为等效攻击和等效生命值的矩形的面积。
我们先以只有攻击力和生命值2种战斗属性的情况来介绍如何用这种方法找到合适的战斗力公式,简单的模型更能反映问题的本质。设若有若干个职业,每个职业的战斗力相同,意味着攻击力和生命值的乘积相等—— p = x*y。考虑到理解成本的高低,这里我们仍以加权求和的简单公式计算战斗力。
参考下表:
其中p1是按照p=攻击力*生命值计算的精确战斗力,而p2则是找到的近似加权求和公式(p1’和p2’则表示职业拉伸后以攻防属性比例4:6或6:4计算的战斗力)。
可以看到,随着属性的增加(如等级提升时,各属性等比例提升),p1和p2的差距越来越大。但这实际上并没有问题。从p1’/p1和p2’/p2的比值稳定可以不那么直观的看出,职业的偏差并没有随着等比放大被拉伸。这意味着,随等级的提升,职业模型的差异,相对的位置并没有变化,采用加权求和公式,只是被压缩到相对更狭窄的区间内,为了具象化一些,可参考下图:
(上图为攻击力和生命值之和随机在一定范围内的战斗力的展示)
可以看到橙黄色的点和蓝色点,在各自的区间内相对位置的比例不变(点的分布形状没变,如红框里的4个点的相对位置为例)
接下来的问题,是如何找到接近程度较高的各属性的权重值,也有3种做法:
Ø 按基础的战斗模型,如10攻击、100生命时,10刀砍死的战斗节奏,1点攻击力就等于10点生命值。这个做法足够简单,但是战斗力与实际战斗能力的接近程度往往不是最佳的。偏差程度取决于你制定的战斗节奏。这个偏差,通常并不大。所以这也是
Ø 随机的生成一些数据,比如{攻击x,生命20-x,战斗力x(20-x)},然后回归。通常需要借助一些工具来实现,excel的拟合只能对单变量函数使用。
Ø 还有一种名叫Boosting的方法(数据挖掘的课里听来的),先给定初始权重值(各属性权重为1),对每次迭代后生成的新模型在上次错分的训练样本上提高权重,最后将所有模型叠加得到最后的模型。下面是课上偷的图:
最后,还有2种计算战斗力的做法,也值得推荐:
参考《论减法公式》http://gad.qq.com/article/detail/7560
1.4. 如何提高战斗力公式的准确性
战斗力的计算公式,总是或多或少的存在误差,尤其在战斗力和技能模块化设计后,可能因为技能的随机性、技能策略的运用上,出现以弱胜强的情况。在1.3的计算中,10%以内的误差,已经是比较良好的战斗力公式了。但是有的时候,这并不容易做到。
这种情况下,我们应当提醒自己,策划是规则的制定者。很多时候,附加以简单的规则,可以节省掉大量的计算,而这个规则却并不会影响玩家的体验时。
在战斗力的计算公式设计时,我们就可以通过添加一个小的辅助规则来提高战斗力的准确程度——战斗力碾压规则。即当双方战斗时,对战斗力数值占优的一方,提供额外的伤害或防御补正;或对战斗力处于劣势的一方,进行相反的debuff操作。
因规则较简单,这里就不细说。
1.5. 几个战斗力计算公式
1.5.1. 神仙道的战斗力计算
改版前,3 点绝技 = 1 战斗力, 1 普通攻击/1 法术攻击 = 1 战斗力,1武力(法术)=8战力,1绝技=8/3战力。以下属性不加战斗力:生命,防御(3种),暴击,格挡,闪避,命中,气势。
改版后,生命*0.12 + (普攻 + 绝攻)*0.24 + (法攻 + 普防 + 绝防 + 法防)*0.12 + (命中 + 闪避 + 格挡 + 破击 + 守护 + 必杀 + 暴击)*1.2 + 先攻*3.68
可以看到,即使成功的游戏,战斗力的计算公式,也可能极马虎,改版前的公式,感觉比等级/装备目测法都有所不如。
1.5.2. 神曲的战斗力计算
1点攻击= 1.2战力,1点防御= 1 战力
1点暴击= 1 战力,1点格挡= 1 战力
1点力量= 5.8战力,1点护甲= 8 战力
1点智力= 5.8战力,1点生命= 0.244战力
1点体质= 4.88战力
其中1点体质=20生命,1点护甲=4点防御和4点魔防。计算时,体质和体质所增加的战斗力不会重复的引入计算。
1.6. 热血高校的战力偏差值
这个并不是游戏,之所以牵强附会的放在这里,是因为热血高校的战力偏差值的计算,有点小意思,相信有心的同学一定有办法将其运用到自己的设计中去。
偏差值公式为:
[(个人成绩-平均 成绩)/标准偏差]*10 + 50
为了更应景,我们以人类去脂体重指数的计算公式,来作为实战战斗力的计算参考值。
去脂体重指数是这样计算的,去脂体重指数 = BMI*(1-体脂率),以一个身高1.78,体重122斤,体脂率15%的消瘦型体格为例来计算他的战斗力。
BMI = 体重(KG)/身高(M)^2
则上述对象BMI=61/1.78^2=19.2526,去脂体重指数=BMI*(1-15%),结果为16.3647,战斗力极为低下。
再来测算一下李啊哒的,体重=64kg,体脂1%,身高1.72(数据仅供参考),去脂体重指数=21.417,所以李啊哒可以轻松的战胜上述的消瘦小伙。
我们随机的生成100个去脂体重指数在10~24之间的选手们,来计算他们的战力偏差值:
Data={13,15,15,11,24,20,21,20,24,19,15,13,10,24,21,17,21,21,20,12,24,23,24,13,21,21,11,17,14,14,16,18,17,20,22,15,17,23,13,23,20,20,23,12,18,10,15,20,24,19,15,14,23,11,24,19,20,18,10,13,20,22,11,22,23,17,19,18,16,11,16,11,20,12,20,11,19,10,22,11,16,16,18,22,18,20,20,14,20,23,21,23,15,18,17,17,23,14,22,14}
先计算标准偏差sd=4.21177,平均值17.72,计算这些选手们的战力偏差值是这样的:
{38.7933,43.5419,43.5419,34.0447,64.9106,55.4134,57.7877,55.4134,64.9106,53.0391,43.5419,38.7933,31.6704,64.9106,57.7877,48.2905,57.7877,57.7877,55.4134,36.419,64.9106,62.5363,64.9106,38.7933,57.7877,57.7877,34.0447,48.2905,41.1676,41.1676,45.9162,50.6648,48.2905,55.4134,60.162,43.5419,48.2905,62.5363,38.7933,62.5363,55.4134,55.4134,62.5363,36.419,50.6648,31.6704,43.5419,55.4134,64.9106,53.0391,43.5419,41.1676,62.5363,34.0447,64.9106,53.0391,55.4134,50.6648,31.6704,38.7933,55.4134,60.162,34.0447,60.162,62.5363,48.2905,53.0391,50.6648,45.9162,34.0447,45.9162,34.0447,55.4134,36.419,55.4134,34.0447,53.0391,31.6704,60.162,34.0447,45.9162,45.9162,50.6648,60.162,50.6648,55.4134,55.4134,41.1676,55.4134,62.5363,57.7877,62.5363,43.5419,50.6648,48.2905,48.2905,62.5363,41.1676,60.162,41.1676}
对比看看发生了什么
(没错,和上面的图是一样的,前面偷了个懒,但概念相通)
为什么要费这么大劲,进行这个变换操作呢?
这是因为,根据某个选手的偏差值,我们能很容易的找到他在样本中的位置,具体做法如下:
l 先求出一个x值,x =(偏差值-50)/10
l 可以根据这个表查出自己的比例:http://site.ntvc.edu.cn/jxcg/KJ/Bernoulli/N_table.htm
比如,某个选手的偏差值为60.162,求出x=1.0162,查表,得到
查到这样2个值,这表示该选手比样本中84.38%~84.61%的选手要强。
在excel中对上面的数据筛选出比60.162大的数据并计数,有84个值。
参考正态分布曲线看更直观一点:
累积概率密度:
在游戏里,我们经常使用一个关卡的战斗力数值作为玩家挑战pve关卡的成长程度的参考标识。如普通难度——火烧博望坡——杂兵1,推荐战斗力1000。
这种时候,如果某个玩家战斗力只有9000,会稍有点纠结,上次我6000挑翻了6500的战斗力的关卡,这次我应该也能过吧?但是实际结果,很可能该玩家就在这折戟沉沙了。
但是如果我们通过记录最近若干次首次挑战成功这个关卡的玩家的战斗力,依上述算法,先计算出标准差和平均值,然后代入该玩家的战斗力,计算其偏差值,作为关卡相对于该玩家的一个动态的战斗力。玩家的困扰可能会减少很多,辅助配合显示一个玩家在这些记录中所处位置(如,高于84%挑战成功的玩家的战斗力)。提示效果可能更好,而且由于这个值是动态的,不会由于开启新的数值成长线而干扰这个提示的有效性。
最后,偏差值的这种应用,目前还是空想阶段,我自己也没在项目中实际运用过,但求抛砖引玉,给各位看官提供一可能的额外参考,这段文字的目的就达到了。
1 / 11