Project1

标题: 问一个技能计算公式的问题 [打印本页]

作者: fssssss    时间: 2013-11-4 05:31
标题: 问一个技能计算公式的问题
本帖最后由 fssssss 于 2013-11-4 13:09 编辑

b.hp/b.mhp*a.atk*6 + b.hp/b.mhp*a.mat*6 - b.hp/b.mhp*b.def*3 - b.hp/b.mhp*b.mdf*3
这个是一个反斩杀的计算公式,敌人当前血量百分比越多打得越痛。
但是为什么敌人满血的时候能造成伤害,只要一去一点点血就完全没有伤害了,老是说么造成伤害。
不管我那个 6 调得再高也没用。
作者: 熊喵酱    时间: 2013-11-4 08:44
恩.......  那一大串不太想看...... 牽涉了太多東西....
如果真的要血量越多傷越多的話就這樣就行了吧....
(a.atk * 12 - b.def * 6) * b.hp_rate
a.atk * 12 - b.def * 6 = 正常攻擊的三倍
然後再乘上血量比例... 所以就是
對方滿血時是正常攻擊三倍
對方2/3血時是正常攻擊兩倍
對方1/3血時是正常攻擊的一樣傷害
小於1/3效果就會比正常攻擊差了....
當然  細部微調是必要的.....(平恆度什麼的
作者: tan12345    时间: 2013-11-4 09:15
敌人满血的时候,b.hp/b.mhp=1,1*a.atk*6什么的肯定有个值
敌人不满血的时候,b.hp/b.mhp=0.x,自动转化成int型就是0,0*a.atk*6什么的都是0。
作者: 喵呜喵5    时间: 2013-11-4 11:34
同二楼,敌人的hp比例被四舍五入成了零自然打不出伤害,把b.hp/b.mhp改成b.hp_rate如何?
作者: fssssss    时间: 2013-11-4 12:19
原来是这样!为什么b.hp/b.mhp会自动转化成整数,而自己输入的0.X就不会转化呢?
作者: 怪蜀黍    时间: 2013-11-4 12:29
fssssss 发表于 2013-11-4 12:19
原来是这样!为什么b.hp/b.mhp会自动转化成整数,而自己输入的0.X就不会转化呢? ...

把b.hp/b.mhp*a.atk*6改成b.mhp*a.atk*6/b.hp,其他的也一样。只要除法最后计算就没有问题了。
作者: fssssss    时间: 2013-11-4 12:35
本帖最后由 fssssss 于 2013-11-4 12:41 编辑

原理我是弄明白了,但是有个地方更糊涂了,
这计算公式什么时候会转化为整数,还有4则运算到底是怎样的,现在跟莫名其妙了。
@喵呜喵5 @tan12345 @76213585
@protosssonny  
作者: tan12345    时间: 2013-11-4 12:51
首先,hp_rate代表HP率,结果等于hp/mhp,只不过hp_rate是以0.0x的方式显示的,存在了小数点,而hp/mhp不存在小数点。
VA的伤害公式那里其实是默认了整数伤害(难道HP还能降低到0.1的血吗???),所以默认是整型,哪怕hp/mhp,也会自动转化成整型,如果你要小数点(你能保证最后的扣血没有小数点???),可以通过b.hp/b.mhp*a.atk*6.0(注意看,6改成了6.0)来转化。
作者: fssssss    时间: 2013-11-4 13:03
本帖最后由 fssssss 于 2013-11-4 13:08 编辑
tan12345 发表于 2013-11-4 12:51
首先,hp_rate代表HP率,结果等于hp/mhp,只不过hp_rate是以0.0x的方式显示的,存在了小数点,而hp/mhp不存 ...


还有一处不太明白
b.hp/b.mhp 得到一个转化的整数
这时 * 6.0 能获取当时b.hp/b.mhp真正计算的结果吗?
按理说掉血后b.hp/b.mhp会得到一个0
那么后面 * 6.0 为什么又会非0了呢?

————————————————————

我刚刚试了一下。。。b.hp/b.mhp * a.atk * 6.0 还是得到一个0...

看来只有hp_rate才行

谢谢了
作者: tan12345    时间: 2013-11-4 13:12
fssssss 发表于 2013-11-4 13:03
还有一处不太明白
b.hp/b.mhp 得到一个转化的整数
这时 * 6.0 能获取当时b.hp/b.mhp真正计算的结果吗?

不好意思,是我疏忽了……你这样子,b.hp * a.atk * 6.0 / b.mhp试试
作者: fssssss    时间: 2013-11-4 13:13
tan12345 发表于 2013-11-4 13:12
不好意思,是我疏忽了……你这样子,b.hp * a.atk * 6.0 / b.mhp试试

恩,只要注意式子什么时候转化成整数就行了,懂得系统原理就迎刃而解。
作者: 喵呜喵5    时间: 2013-11-4 13:50
本帖最后由 喵呜喵5 于 2013-11-4 13:55 编辑

一路看下来大大那么多怎么就没有一个答到点子上的……

有的会变成0有的不会变成0这个涉及到了编程原理上,我不是专业的程序员所以可能下面的解释有点错误:

电脑需要为一个变量分配一定大小的空间,而分配的空间的大小决定了这个变量所能包含的最大值,Ruby语言作为动态语言其实已经屌炸天了,想想人家C语言,整型变量只有65536个,整型变量计算65536+65536直接溢出报错,Ruby则不会(因为会自动转换)。

然而,对,就是这个然而,即使Ruby再怎么动态再怎么智能,碰上小数的计算它也只能歇菜。计算机是很笨的,你给一个数字2,计算机哪知道你想表达的是2还是2.0还是2.000还是2.0000000000000000000000000,虽然这些数字在大小上一样,但是存储这些数字所需要的内存空间可是不同的,因此,计算机想出来的一劳永逸的方法就是默认情况下把你给的所有数字都四舍五入成整数,同时,用浮点数来记录带小数点的数字。


这里冒出来一个概念“浮点数”,嗯,你只要知道浮点数是用来记录小数的并且比普通的整数更占地儿就好了。

然后,计算机虽然笨,程序员也不傻,为了能够更加自由的进行小数的运算,早在C语言的年代,强制转换就出现了,详情自己看百度(http://baike.baidu.com/link?url= ... jP3oZZ4dJUCgNgtgWpK),套到这个问题上来说,整型变量除以整型变量,得到的是四舍五入的整型变量,浮点型变量除以整型变量,结果会自动升级为浮点型变量。

之后要做的事情就很简单了,既然你希望结果不再是0或者1这种整型变量而是0.222222222这种浮点型变量,那么你只要让式子中出现一个浮点型变量运送的结果就必然是不会四舍五入包含小数的浮点型。

比如,把整型的6写成浮点型6.0,

又比如,使用变量转换代码to_f,这边顺便回复一下4楼的点评 @david_ng223
hp_rate是Game_BattlerBase中定义的一个方法,代码如下
  1.   def hp_rate
  2.     @hp.to_f / mhp
  3.   end
复制代码
to_f的功能就是把一个变量的类型转换成浮点型

以上,便是详细的解释过程,写的又臭又长,不知道有多少人会去看……




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1