游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5179|回复: 1

基本战斗公式应用性探讨

[复制链接]

2

主题

2

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2017-2-17 16:03:47 | 显示全部楼层 |阅读模式
一、             前言
本文主要介绍了有效生命值、战斗力、防御等级的概念;探讨了减法公式、乘法公式的优劣点,战斗力计算方式。主要目的是帮助新人理解与思考。
让我们先做一些基本的设定:
伤害=dam
攻方攻击=Atk
守方防御=Def
守方最大生命值=MaxHP
攻方每秒输出伤害=DPS(damage per second)
攻击(致死)次数=tim [为计算方便,本处致死次数为实数。实际处理问题时,需要将最终的致死次数向上取整]
致死时间=T
守方伤害减免率=drr(Damage reduction rate)

*我是投稿新手,想问下为什么我在word里面输入的公式,在论坛上没法使用呢?直接粘贴过来都是裂开的图片,哪位大神知道怎么解决请给我留言,谢谢啦!(我现在是直接把公式变成文本形式手动粘贴过来的T-T)

二、             减法公式
dam=Atk-Def
(当Def>Atk时,dam=0. 其实这个情况是可以讨论的,暂且不谈)
我们先引入一个概念:
(一)       有效生命值(Effective HP,EHP)
怎么理解它呢?我们可以这样想,如果没有护甲,守方会更早的被攻方打死,而护甲就等于给守方提供了额外的血量,那么本身的血量加上护甲提供的额外血量,就是有效生命值了。(在实际游戏中是守方所有防御属性所能提供的等价血量,可以包含血量、防御、躲避、格挡、抗暴击等等游戏中所具有的所有提供防御性能的属性,此处为了简化模型,只讨论dam、Atk与Def三者的关系)
因为dam=Atk-Def,所以本次战斗的攻击(致死)次数:
tim=MaxHP/dam=MaxHP/(Atk-Def)
如果守方没有防御,那么战斗的攻击(致死)次数:
Tim'=MaxHP/dam=MaxHP/Atk
那么tim-tim'得到的就是护甲提供的生命值DefHP所抵挡掉的攻击次数,由此可得:
DefHP=Atk*(tim-tim')
带入上面两个式子,可以得到:
DefHP=Def/(Atk-Def)*MaxHP
所以有效生命值:
EHP=MaxHP+DefHP=MaxHP*Atk/(Atk-Def)
变换下形式可以得到:
EHP=MaxHP*1/(1-Def/Atk)
所以可以看出,EHP只跟MaxHP和Atk/Def有关,并且与Atk/Def是负相关。
在MaxHP一定的前提下,Atk与Def的比值不断增加,EHP就会不断减少,反之同理。注意,这里是两者的比值,和他们单一量比较是没有意义的。比如Atk与Def如果保持比值相等地增长,那么EHP是不会产生变化的,比如下表:

  
Atk
  

Def


MaxHP


EHP


100


50


1000


2000


120


60


1000


2000


140


70


1000


2000


160


80


1000


2000


180


90


1000


2000


200


100


1000


2000


220


110


1000


2000


240


120


1000


2000


260


130


1000


2000


得到上面的公式之后,我们会发现对于数值策划来说,减法公式最讨人厌的地方好像并不是不破防问题,而是我自身的属性,没法直接评判我当前的战斗力,必须有对手的属性参与进来,我才可以知道我当前的战力是什么情况。
这里又谈到了一个概念:
(二)       战斗力
我们一般评价战斗力的方式有:
1.          固定赋值的方式。
比如1攻击=1战斗力,1防御=1战斗力,1暴击=5战斗力等等。
这种方法是根据游戏内既有的公式,在设定一个标准模型的情况下进行推导得到的。(具体方法在这里不赘述了)如果玩家属性偏离标准模型越大,那么显示的战斗力与玩家实际实力的差距也就越大。
2.          EHP*DPS的方法。
假设致死时间T1(B致死A的时间)与T2(A致死B的时间):
T1=EHPA/DPSB
T2=EHPB/DPSA
如果T1>T2,即A比B活的时间长,即A比B强大。变换形式可得:
EHPA*DPSA > EHPB*DPSB
如果T1=T2,即A比B活的时间一样,即A与B水平相当。变换形式可得:
EHPA*DPSA = EHPB*DPSB
所以,我们可以使用EHP*DPS来评价一个角色的战斗力。
由此我们可以发现,EHP*DPS只要和对方相等,就可以理解为战斗力相等了。那么我用EHP*DPS来作为自己的战斗力,这样会更加靠谱一些。如果EHP和DPS都是由我自身属性提供的数值,那么我们就得到了一个精确的战斗力评价方式。
理想很丰满,可是遇到减法公式时,就产生了上面我们遇到的问题,我的EHP竟然跟对方的攻击力有关系!这会导致一个问题,减法公式的角色实际战斗力不能满足一些数学上的基本性质,比如等式和不等式的传递性(可能会出现a强于bb强于cc强于a的循环克制情况),这将导致我们在游戏数值维护上,无法批量运用数学公式去处理相关数值问题
这也就是我说减法公式讨人厌的原因。所以我们会发现,目前大多数使用减法公式的游戏,都很难把玩家真实实力反应出来,战斗力更大意义上,是为了给玩家养成服务的
后面在说到乘法公式时,还会提到这个方法,到时候你就会知道《魔兽世界》的数值为什么那么经典了。

(三)       减法公式的优势
说完了有效生命值、战斗力。我们会发现,减法公式好像并不那么好,可是为什么还有那么多游戏在使用它呢?
1.          有人说理解成本低,玩家看一眼属性就知道我伤害是多少,我每加一点防,都是每次少扣一点血;
2.          也有人说,减法公式中属性价值递增,购买属性见效也快,利于盈利;
3.          还有人说,减法公式可以设计出一些很有意思的东西。
比如:A玩家攻75防20血200;B玩家攻35防45血300;C玩家攻50防30血300。
计算他们两两对战的情况,我们会发现,b和c相互致死时间相同(60),a和c相互致死时间相同(6.67),那么我们可以认为b=c,a=c。
但是当我们计算a与b的战斗情况时发现,b的死亡时间为10,a的死亡时间为13.33。
说明a>b.这也验证了,减法公式中,玩家实际战斗能力不能满足等式的传递性。如果使用减法公式精心设计的话,可以产生实力上的循环克制,这也是大家觉得减法公式真正有意思的地方。

(四)       不破防问题
当Def>Atk时,dam=0,这是我们人为给减法公式附加的规则。如果出现了负值,好像处理起来有了一些麻烦,特别是以前无法处理负数的年代。
首先,如果我们试试当Atk-Def为负值时,我们把它理解为反伤。这种处理方式还没有人使用过,我在此也不太好评价,有兴趣的可以尝试一下。
其次,当Def>Atk时,我们让dam为0,会出现当前Def的收益为正无穷的,而当前Atk的收益为0。我们可以知道,当守方防御越接近攻方攻击时,Def的单价收益越高。所以如果,我只要充钱买防御,超过本服所有玩家的攻击,那么他们都打不动我了。后来大家针对这种情况,提出了一些解决方案,比如严格控制防御属性的产出,比如分段公式,比如设定最低伤害等等。导致我们现在看到的减法公式都变得很复杂了。
下面是我个人的见解:
加减法在游戏中会变得如此复杂,是我们的体验要求,联系到现实世界中的感知,让一些常理性的东西给束缚住了。一说到减法公式,就让很多人想到不破防,其实从纯数学的角度看,这并没有什么错。使用减法公式建模,必然会导致这个结果。但是在实际应用中,一个人就可以灭一个城乃至一个国,体验实在太糟糕了。后来的减法公式也渐渐得被包装得复杂了,最低伤害、分段公式的概念也被不断引入游戏数值建模之中。虽然是解决了不破防问题,但是我们再回到最初看一看,现在如此繁杂的减法公式还能发挥之前描述的三个优点吗?

三、             乘法公式
dam=Atk*(1-drr)
drr为免伤率,即每次造成伤害时,减少受到伤害占总伤害的比率。
(一)       乘法公式的优点
引入我们上面提到的EHP与DPS的概念,抛去暴击、穿甲等等属性的干扰,假定Atk的攻速为1次/s,那么dam=DPS
在乘法公式中,有免伤率情况下:
tim=MaxHP/dam=MaxHP/(Atk*(1-drr))
如果守方没有免伤,则:
tim'=MaxHP/dam=MaxHP/Atk
所以,免伤得到的等价概念DefHP可以写成:
DefHP=Atk*(tim-tim' )=MaxHP/(1-drr)-MaxHP
那么有效生命值就是:
EHP=MaxHP+DefHP=MaxHP/(1-drr)
我们会发现免伤率drr、最大生命值MaxHP都是守方自身的属性,与攻方属性无关;Atk是攻方自身属性,与守方属性无关。结合上面战斗力的评价方式,这套《魔兽世界》使用的公式如果用EHP*DPS的方式来评价自身实力的时候,结果是不用考虑对方的属性如何的。
所以,在同一乘法公式的体系下,我们可以不依赖其他角色,准确地定量描述一个角色的实力强弱。(当然如果加入抗暴击等这一类针对性属性,当攻方无暴击时,抗暴击是没有价值的,这些特殊情况需要特殊讨论的,我们这里只讨论一般性情况)
(二)       乘法公式的问题
乘法公式也有自身的问题,因为drr它是百分比存在的形式,也导致了数值有了它的上限值。虽然我们可以通过用防御等级的概念来减缓它的触顶,不过最终它终究还是有个头的。
我刚入行的时候曾觉得这是个数学问题,使用有极限值的函数,让玩家的防御成长永远碰不到它的顶不就好了嘛!可是尝试了之后却发现,随着属性值的增长,它的实际使用价值降得太厉害了。这对玩家来说,就是 “太坑了”。所以很多使用乘法公式的游戏都强制设定了一些属性可达到的最大值,当超过时没有任何作用。
由此可见,对于想卖数值的游戏,不是说减法公式优点多而使用它,而是乘法公式缺点更大。甚至我们可以说在这类游戏中,数值“并不好玩”。
(三)       防御等级
这里介绍下乘法公式下的防御等级。
因为drr是免伤率,如果直接把这样的百分比投放给玩家,就会发现后期的拓展性会很差。这时候,策划们就引入了一个概念:防御等级。
我们这里将防御等级理解成可以转化为免伤率的护甲值(Def),并且等级会影响其转化率。常用公式为:
drr=Def/(Def+m*lvn+C)
m、n、C为常数,lv为当前等级。
比如我之前一个手游项目《魔戒》中,m=50/3,n=1,C=0;《英雄联盟》中m=100,n=0,C=0(或者理解成m=0,C=100);《魔兽世界》中m=85,n=1,C=400.
举个例子,假设在1级的时候100点护甲可以提供10%的免伤率。随着等级的提升,到达20级的时候,100点护甲只能提供5%的免伤率,玩家需要更高的护甲值才能让自己的免伤率到达10%。这样做的好处是,让玩家属性的可成长性得到了拓展。但是坏处也是显而易见的,玩家属性竟然会“贬值”,这对于主要靠卖大额属性来赚钱的游戏,体验可能会比较差。

四、             写在最后
综合看起来,好像两种公式都不是那么完美,当然这是对于想卖大额属性的游戏来说的。如果我们仅从做好游戏本身的角度来说,两种方法又都有它的闪光点,都可以把战斗的骨架构建出来。选择哪种,不过是看我们是想让战斗更可控,还是想让战斗更有趣罢了。
本文中的战斗公式用的都是最基本的初始公式,是为了让这些概念更容易被理解,以后有时间的话,会写一些具体游戏的实际例子来跟新人们分享分享,给大家介绍暴击、格挡、闪避等等属性对战斗的影响,以及在数值过程中累积的一些经验,希望大家能够多多支持!
也希望大家能够指出我的一些不足或者错误的地方,感谢各位-。-



小牧

0

主题

2

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2023-8-29 11:09:44 | 显示全部楼层
写的不错 我看明白了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-22 05:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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