狂~劇情狂 发表于 2005-1-27 17:37:37

再论骑士不怕长枪的英雄化效果理论

根据测试,游戏程序是以单精度浮点数的方式来储存单位的现在生命值。详述:
Single 数据型态 Single (单精度浮点数) 变量系以 IEEE 32 位 (4 个字节) 浮点数字的形式储存,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。
计算机处理浮点数的公式是这样的:
z = a * 2 ^ x (-2 < a < 2)
z 是要储存的数值
例如:
要储存 1 时,则 a 为 1 ,x 为 0 。
要储存 1.5 时,则 a 为 1.5 ,x 为 0 。
要储存 2 时,则 a 为 1 ,x 为 1 。
要储存 3 时,则 a 为 1.5 ,x 为 1 。
在浮点数的 32 个字节中,有 24 个字节安排到给上列公式的 a 。故理论上可以正常储存的最大之整数应为 2^0 + 2^1 + ... + 2^23 = 16777215。(a 为 1.9999999 而 x 为 23)
然而,当 x 为 24 而 a 为 1 时(1 * 2^ 24 = 1^24),得出的答案是 16777216 ,仍然属于正确;不过在计算机换算上,我们已经视之为不精确了。
到了 16777217 又如何呢?依据上述算式,你不可能弄出一个 16777217 。
故此,游戏程序将整数 16777217 (触发事件效果数值)换算成 浮点数(现在生命值)时就会出现约简或换算的情形。
知道这一原则,我们再以一个 40 生命值的单位来说明一下回复的进行过程:
a = 摧毁目标(-) -(16777217 - 40) = +(16777177)
b = 摧毁目标(-) 16777216 - 40 = -16777176
单位起始生命值为 1/40
第 1 秒,执行 a 则 1 + 16777177 = 16177178 (正常),然后执行 b 则 16177178 - 16177176 = 2
第 2 秒,执行 a 则 2 + 16777177 = 16177179 (正常),然后执行 b 则 16177179 - 16177176 = 3
.
.
.
.
.
.
第 39 秒,执行 a 则 39 + 16777177 = 16177216 (正常),然后执行 b 则 16177216 - 16177176 = 40
第 40 秒,执行 a 则 40 + 16777177 = 16177217 (不正常,化回 16777216),然后执行 b 则 16177216 - 16177176 = 40
第 41 秒,执行 a 则 40 + 16777177 = 16177217 (不正常,化回 16777216),然后执行 b 则 16177216 - 16177176 = 40

輸入數值   輸出數值
16777216 16777216
16777217 16777216-
16777218 16777218-
16777219 16777220
16777220 16777220
16777221 16777220-
16777222 16777222-
16777223 16777224
16777224 16777224
16777225 16777224-
16777226 16777226-
16777227 16777228
16777228 16777228
16777229 16777228-
16777230 16777230-
16777231 16777232
16777232 16777232
16777233 16777232-
16777234 16777234-
16777235 16777236
16777236 16777236
16777237 16777236-
16777238 16777238-
16777239 16777240
.
.
.
.
.
.
33554424 33554424
33554425 33554424-
33554426 33554426-
33554427 33554428
33554428 33554428
33554429 33554428-
33554430 33554430-
33554431 33554432
33554432 33554432
33554433 33554432
33554434 33554432-
33554435 33554436
33554436 33554436
33554437 33554436-
33554438 33554440
33554439 33554440
33554440 33554440
33554441 33554440
33554442 33554440-
-号是区间完结


[此贴子已经被作者于2005-9-21 20:57:31编辑过]

[ 本帖最后由 狂~劇情狂 于 2009-6-19 15:34 编辑 ]

飛揚寒星 发表于 2005-1-28 13:35:11

<b>凡发表于本版的原创技术,或综合性的技术教程,一律奖励300分,如获加精,再加100分。</b><b>加魅力400。</b><b>操作人——小霖(无法编辑到原帖,权限不够……)</b>

龙卷风 发表于 2005-2-1 18:02:53

无,大家都很忙的样子..

赵钱孙 发表于 2005-2-1 18:12:07

我也是要看书、复习,只能是在早上来了!

龙卷风 发表于 2005-2-1 18:23:02

放假,上午学习,下午打PINGPONG,晚上做战役.....

天使归来 发表于 2005-1-28 20:27:34

晕了晕了,晕了....这么深奥?

千涛拍岸 发表于 2005-1-28 21:34:11

战役做到这程度真绝了....我也看不懂,偶只会画地图....

qs 发表于 2005-1-29 18:33:38

呵呵,我越来越有野心了…………

超级战列舰 发表于 2005-1-29 19:45:02

终于做成加血不爆了

赵钱孙 发表于 2005-1-29 20:38:24

<DIV class=quote><B>以下是引用<I>qs</I>在2005-1-29 18:33:38的发言:</B>
呵呵,我越来越有野心了…………</DIV>


那你会造反吗?或做下一个松永久秀(不好意思,太阁中的野心膨胀者很容易造反,尤其是这个大奸狗!)

qs 发表于 2005-1-29 21:55:11

野心难道只是造反?呵呵

赵钱孙 发表于 2005-1-29 21:59:57

这就只有你自己最清楚了,是犯罪野心,窃国野心,争霸野心,创业野心,还是……

千涛拍岸 发表于 2005-1-30 01:01:37

比起志向,我也更喜欢"野心"这个词语.........

_CCC_大智 发表于 2005-1-31 14:36:28

要储存 2 时,则 a 为 1 ,x 为 1 。
要储存 2 时,则 a 为 1.5 ,x 为 1 。都是2?看不懂了

飛揚寒星 发表于 2005-1-31 20:50:26

應該是“3”吧。

狂~劇情狂 发表于 2005-1-31 21:25:13

對...是3, 近來有點忙,沒時間校對

赵钱孙 发表于 2005-2-1 18:39:00

你的生活真soft!

_CCC_大智 发表于 2005-2-1 19:02:29

终于明白(应该吧。。。)不死单位的原理了。。。(好象和顶贴没什么关系)扣上限至0后再加1点当前血,则血为1/0,再加任意血(X)就会因为“倍数增减”而使当前血弄成1=X/0,但是0做分母没有意义,最后当前血就变成任意值,就不会挂了……以前都是考死记的。。

天日 发表于 2005-2-1 21:44:44

扣上限至0后再加1点当前血,则血为1/0,再加任意血(X)就会因为“倍数增减”而使当前血弄成1=X/0,但是0做分母没有意义,最后当前血就变成任意值,就不会挂了……即是说原第三步输入该单位生命之上限可以变为输入任意数字了?我去试一下

天日 发表于 2005-2-1 21:51:24

啊哈,由此得出0/1的生命值……说来惭愧,到现在才懂得做出0/1的方法,因为过去都是死背生命值归零,增长1,输入最大生命值的,这种方法最少只能做到0/2,现在终于明白了……看来还是清楚原理有好处。对了,看到最近的很多应用不死效果的战役都是0/生命值最大上限,现在终于明白如何做出0/1这个简练的数字了:)大智~呼哈~奖励不了魅力,那就奖励一点经验好了(钱……财神门前耍铜钱……)
页: [1] 2
查看完整版本: 再论骑士不怕长枪的英雄化效果理论