游戏开发论坛

 找回密码
 立即注册
搜索
楼主: _ElemeNt_

[讨论] 一个数值公式设计问题!高手进来算算

[复制链接]

1

主题

257

帖子

257

积分

中级会员

Rank: 3Rank: 3

积分
257
发表于 2007-3-25 13:15:00 | 显示全部楼层

Re:一个数值公式设计问题!高手进来算算

B = 500, Resist% =95%;
设公式Resist% = B/(B+X)
则有X = 26.3

验证:
当B = 500时,被攻击方只受到5%伤害。
当B = 400时,被攻击方受到6%伤害。
当B = 300时,被攻击方受到8%伤害。
当B = 200时,被攻击方受到12%伤害。
当B = 100时,被攻击方受到21%伤害。
当B = 1时,被攻击方受到96%伤害。

主要问题:B在1与100之间时,百分比抗性上升太快。

14

主题

145

帖子

191

积分

注册会员

Rank: 2

积分
191
发表于 2007-3-25 20:31:00 | 显示全部楼层

Re:一个数值公式设计问题!高手进来算算

针对
c=a*(1-b/(b+(500/b)))
这个公式
楼上说的很正确,问题就出在这个部分上
b/(b+500/b)
当然,如果纯以满足题目要求来说,这样的公式是没问题的,但如果放到实际的游戏中,它就不太符合逻辑了.因为从函数曲线上看,当b超过一个定值时,它的增长对伤害的影响就变得很小了

为了能够看得更清楚,能从数学角度来分析它的性质,我们需要将此公式稍微变形
因为b至少为1,固而可以将上述公式变形为
y=b^2/(b^2+500)
从数学意义上看,这个函数是满足要求的
b→0  Y1→∞
b→∞ Y1→1
因为b至少为1,所以Y1有最大值1/501
这个结果跟题目最初的要求是一致的

但是,如果分析一下函数曲线的性质
将上面这个函数变成两个函数模型
y=x/(x+常数)
x=b^2

y本身是一个随x增加而减速递增的函数
而x又是一个随b增加而加速递增的函数
这就使得,当b达到一定数值时,虽然它的递增仍能引起y的递增,但递增幅度则会变得非常小,
于是就出现了
当B = 500时,被攻击方只受到5%伤害。
当B = 400时,被攻击方受到6%伤害。
当B = 300时,被攻击方受到8%伤害。
当B = 200时,被攻击方受到12%伤害。
当B = 100时,被攻击方受到21%伤害。
当B = 1时,被攻击方受到96%伤害。
这样的情况

其实,我们可以简单一点处理这个问题,只要将第二个函数的加速度去掉,再调整一下常数值,这个公式就能符合要求了
即:
y=b/(b+常数)

也就是
c=a*参数1*(1-参数2*b/(b+参数3))
这就很合理了

再根据题目给出的条件来设置参数
比如:
c=a*3*(1-2*b/(b+500))
这个公式就完全能满足题目要求了

154

主题

4567

帖子

4579

积分

论坛元老

Rank: 8Rank: 8

积分
4579
QQ
发表于 2007-3-26 13:29:00 | 显示全部楼层

Re:一个数值公式设计问题!高手进来算算

X/(X+a) 老能看见,能解释下这个么,或者给各链接

14

主题

145

帖子

191

积分

注册会员

Rank: 2

积分
191
发表于 2007-3-26 13:49:00 | 显示全部楼层

Re: 一个数值公式设计问题!高手进来算算

f(x)=x/(x+a)是很简单的一个函数

当x>0,a>0时
附件是x在0到500区间内,函数的变化曲线

通过曲线,可以看出此函数具有以下性质
x越大,y越大
且当x3-x2=x2-x1时
有f(x3)-f(x2)<f(x2)-f(x1)

当x→0时,f(x)→1/a
当x→∞时,f(x)→1

所以,我们说f(x)=x/(x+a)用来设计单调减速递增的百分比概念是十分合适的

14

主题

145

帖子

191

积分

注册会员

Rank: 2

积分
191
发表于 2007-3-26 14:01:00 | 显示全部楼层

Re: 一个数值公式设计问题!高手进来算算

以下是
f(x)=x/(x+100)
0<x<500
的函数曲线

sf_200732614039.jpg

154

主题

4567

帖子

4579

积分

论坛元老

Rank: 8Rank: 8

积分
4579
QQ
发表于 2007-3-29 20:16:00 | 显示全部楼层

Re:一个数值公式设计问题!高手进来算算

jamesge 太热心了,泡论坛这么久遇到贵人啦!

暴雪的装甲防御伤害降低公式就用的这个函数

伤害降低量 = 护甲值 / ( 护甲值 + 人物等级 * a + b )  具体的值现在我这里没有,明天补上

问题是有一个人物等级在里面搞鬼,相当于2个变量了,一个是护甲值,一个是人物等级,想了很久都没有得出处理方法

154

主题

4567

帖子

4579

积分

论坛元老

Rank: 8Rank: 8

积分
4579
QQ
发表于 2007-3-29 20:17:00 | 显示全部楼层

Re:一个数值公式设计问题!高手进来算算

又找到一些魔兽世界的公式,拿出来分享
一、攻击力(Attack Power,简称AP)的计算公式:
Warrior/Paladin:AP=角色等级*3+力量*2-20
Hunter/Rogue:AP=角色等级*2+ 力量 + 敏捷-20
Shaman:AP=角色等级*2 + 力量*2 - 20
Druid:AP=力量*2-20
Mage/Priest/Warlock:AP=力量-10

角色DPS=AP/14+武器DPS
单次攻击伤害(最小/最大)=攻击速度*AP/14+武器伤害(最小/最大)+ 技能附加伤害

二、防御力(Armor)的计算公式:
1敏捷(Agilty)=2Armor
Armor减少伤害%=0.75%*防御力/(攻击方等级+9)
例:防御力5000的角色,被61级敌人攻击时,可以减少伤害0.75%*5000/(61+9)=53.6% 被51级敌人攻击时,可以减少伤害0.75%*5000/(

51+9)=62.5% 伤害减小值的封顶值是75%,这时角色的防御力为100*(敌人等级+9),也就是说杀62级敌人时防御要在7100以上才能达到封

顶效果。我不知道现在最高防御能达到多少,但在绝大多数情况下,杀同等级敌人是不可能达到封顶值的。

三、敏捷对物理攻击重击(crit)、闪避(Dodge)几率影响的计算公式:
在不计装备和天赋影响的情况下,重击和闪避几率受以下因素影响:
1.重击/闪避的基础值和变化值
角色的重击/闪避几率中,有一部分是不受敏捷影响的(这里称为基础值),另外一部分受敏捷影响(这里称为变化值)。
角色重击/闪避的计算公式为:
    基础值+变化值*角色的敏捷/敏捷标准值。
对一般的职业来说,当角色敏捷等于标准值的时候,重击/闪避几率为5%。也就是说基础值+变化值=5%。变化值越高表示敏捷对这个职业的

影响越大。
敏捷标准值是与等级和职业相关的一个参数。
1级时一般职业的标准值为20,盗贼和猎人为23。60级的时候战士敏捷标准值100,即敏捷100时重击/闪避几率为5%。
敏捷标准值似乎没有计算公式,是通过查表获得的,也可以自己推算,我在后面会附上算法,大家有兴趣可以自己计算。
各个职业的重击/闪避基础值和变化值:
Rogue:重击基础值0%,变化值10%;闪避基础值0%,变化值20%
Hunter:重击基础值0%,变化值5%;闪避基础值0%,变化值10%
Warrior:基础值0%,变化值5%
Paladin:基础值0.7%,变化值4.3%
Druid:基础值0.9%,变化值4.1%
Shaman:基础值1.7%,变化值3.3%
Warlock:基础值2%,变化值3%
Priest:基础值3%,变化值2%
Mage:基础值3.2%,变化值1.8%
2.角色的武器技能等级(熟练度)和防御技能等级 即属性栏里显示的attack和defense。
其中attack影响角色重击几率,defense影响角色闪避几率。
具体来说就是重击/闪避受一个(attack(或defense)*0.04-等级/5)%的修正。
大家知道角色每升一级attack/defense上限会增加5级,正好和等级/5抵消,也就是说如果把attack/defense修满,重击/闪避几率就不受任何

惩罚,如果没有修满,则每差一个等级减少0.04%的重击/闪避几率.。反之如果通过装备把attack/defense加的超过上限就会有额外奖励。
例:一个60级战士,敏捷90,defense330级,那么他的闪避为0 + 5%*90/100 +(330*0.04-60/5)%=5.7%

四、格挡几率(Block)和招架率(Parry) 基本几率5%,受防御技能(defense)的影响,每级防御技能增加0.04%格挡/招架几率。
或者说同闪避一样受(defense*0.04-等级/5)%的修正
附:角色敏捷标准值的算法 首先注意把与重击/闪避或者防御技能相关的装备都拿掉,最好不要加任何天赋,战士不能出于,以免引起混乱。

记录敏捷值A和闪避/重击几率D。将attack/defense对D值的修正还原,如你的角色武器技能差N级达到上限,就在D上加N*0.04%。
敏捷标准值=敏捷A/(1 +(闪避或重击几率D值 - 5%) / 闪避或重击变化值 ) 最后,可以更换一下敏捷装备,使敏捷发生变化,再根据上

面给的公式检验一下计算结果是否正确。
重击几率可以在角色的基本技能“Attack”上查看,闪避几率可以在角色的基本技能“Dodge”上查看


现在的armor计算公式是伤害=原始伤害/(1+armor/X)。其中X是随等级变化的参数,具体数值我还没搞清楚。和以前相比主要变化就是高armor时再增加armor的作用没有以前那么明显了,或者说plate职业的armor被nerf了。

================================

原始伤害/(1+armor/X)。
= 原始伤害 /(( X +armor)/X) 。
= 原始伤害 * ( X / ( X + armor ) )

减少的伤害等价于 原始伤害 - 原始伤害 * ( X / ( X + armor ) )
= ( 原始伤害 * ( X + armor ) - 原始伤害 * X) / ( X + armor )
= ( 原始伤害 * armor ) / ( X + armor )

[em7]  [em3] 谜团解开了!  [em6] [em6] [em6]

实际上暴雪做的伤害降低率真实面貌是
X / ( X + armor )

X = a * Level + b

154

主题

4567

帖子

4579

积分

论坛元老

Rank: 8Rank: 8

积分
4579
QQ
发表于 2007-3-29 20:43:00 | 显示全部楼层

Re:一个数值公式设计问题!高手进来算算

我发现暴雪的一些数值也是由一个自定的基数向下推导的,有时候也找不出为什么要定成这个数的道理来,可能是我能力太弱分析不出来其中的道理 =。=

14

主题

145

帖子

191

积分

注册会员

Rank: 2

积分
191
发表于 2007-3-30 01:34:00 | 显示全部楼层

Re:一个数值公式设计问题!高手进来算算

1.伤害降低量 = 护甲值 / ( 护甲值 + b )
2.伤害降低量 = 护甲值 / ( 护甲值 + 人物等级 * a + b )

首先:我们来看第一个公式
第一个公式里,影响伤害吸收的变量只有一个--护甲值,这应该是很容易看出来的一点
也就是说,在第一个公式里,一个确定的护甲值会带来一个确定的伤害吸收量

比如说:我把b设为100的话
那么:
当护甲值=50时,伤害吸收=33.33%
当护甲值=100时,伤害吸收=50%
当护甲值=200时,伤害吸收=67.77%

从这个公式我们可以看出,不管玩家等级如何,也不管怪物的等级如何,只要护甲达到了某一个值,他所受到的伤害就很小了
那么这样的公式效果能不能满足<魔兽世界>这个游戏对角色护甲属性的要求呢?
很显然,这是不能的

我们可以结合魔兽这种角色可升到60级的游戏的实际情况来分析为什么不能的原因:

1.如果b值设得比较小,产生的直接后果就是,只要当玩家的护甲达到某一值之后,对伤害的吸收能力就会变得很大,而且不管在游戏后期是否再增加护甲值,根据前面我们分析的函数曲线的性质
{且当x3-x2=x2-x1时
有f(x3)-f(x2)<f(x2)-f(x1)}
不难得出结论,它对伤害的吸收作用也都起不到明显效应了,所以在后期护甲反而成了一个可有可无,可增可减的属性

2.如果b值设得比较大,产生的直接后果就是,在游戏前期阶段,因为b值过大,所以护甲产生的效果会显得十分微弱,高低护甲之间对伤害吸收能力的区别几乎可以忽略不计,护甲就变成了游戏中的一个垃圾属性

分析了第一个公式的性质以后,魔兽世界采用第二个公式的理由已经很明显了
在第一个公式的分母中加入等级这个变量以后,公式将会产生怎样的变化呢?

其实,等级这个变量的加入相当于给这个公式建立了一个参照系
我将公式模型具体话以后,相信就能看得更清楚了

比如,把第二个公式写成
伤害降低量 = 护甲值 / ( 护甲值 + 人物等级 * 100 + 100 )
这样的具体形式
那么在玩家为1级时,要想吸收50%的伤害,需要多少护甲值?200
那么在玩家为2级时,要想吸收50%的伤害,需要多少护甲值?300
那么在玩家为3级时,要想吸收50%的伤害,需要多少护甲值?400
...
可以看出,对于同一伤害吸收值来说,对护甲的要求会随等级的提升和提升,而这个变化就很轻松的解决了第一个公式所存在的问题:

只要控制好了a,b这两个参数,那么护甲值在任何一个等级之下都会变成了一个重要属性.因为,在低等级下,由于等级参数的缘故,少量的护甲值会引起伤害吸收较大的变化;而在高等级下,由于等级参数的缘故,要引起同样的变化,则需要更多的护甲值--这就比较符合网络游戏的设计理念了

当然,我们并不是说这个公式是万能的,其实它也有自身的弱点--什么弱点呢?它会让玩家感觉到一种疑惑:
为什么我等级提升了,而我对伤害的吸收能力反而下降了呢?

而<魔兽世界>面对这个问题时,则使了一招"偷梁换柱"的把戏几乎骗过了玩家的眼睛--
它在"护甲"这个属性上的注释是:"玩家对抗同等级怪时,对伤害的吸收能力"

实际上,这个公式根本就与同不同等级没有任何关系.从公式上可以看出,不管是对于哪个等级的怪,只要玩家本身等级提高了,而护甲不变,伤害吸收的能力其实都会下降,只不过,因为人物等级提升后,由于属性提升,装备更换,将这种下降的趋势又给弥补回来了而已.

这个公式所存在的弱点,使它很少被运用于其他判定过程中,在网络游戏中,最好只用在那些变量范围巨大,而函数范围却相对较小的公式上.
比如说:敏捷对攻击速度的影响,我们说就可以采用类似的公式.


设计数值不过就是在玩一个数字游戏~~把数学公式原理,以及游戏内在的互动关联弄清楚了,任何问题都能迎刃而解

32

主题

228

帖子

228

积分

中级会员

Rank: 3Rank: 3

积分
228
发表于 2007-3-30 14:52:00 | 显示全部楼层

Re: Re:一个数值公式设计问题!高手进来算算

_ElemeNt_: Re:一个数值公式设计问题!高手进来算算

这里的关系曲线是一个比较平滑的曲线,难度就在这里。能给出公式的就发上来看看吧,讨论一下最好的方法和思路

  
  应该是曲面,而不是曲线。
  可惜scilab不熟,不会用if控制那个低于0的情况,
  不发图了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-15 03:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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