一时兴起做了这篇教程教程?,由于本人的数学水平犹如学前班,所以可能会存在纰漏,还望大家指出。
文章末尾有 excel 公式,不愿意看的可以直接拉到最底下拿走用。
先看源码:
- public static float calcCutoffDamage(float damage, float cutoff) {
 
-   float p = 1f;
 
-   float d = damage;
 
-   damage = 0f;
 
-   while(d > cutoff) {
 
-     damage += p * cutoff;
 
-     // safety for ridiculous values
 
-     if(p > 0.001f) {
 
-       p *= 0.9f;
 
-     }
 
-     else {
 
-       damage += p * cutoff * ((d / cutoff) - 1f); // 最终伤害1
 
-       return damage;
 
-     }
 
-     d -= cutoff;
 
-   }
 
-   damage += p * d;  // 最终伤害2
 
-   return damage;
 
- }
函数的输入有两个,一个是应用完所有特性后的伤害数值:damage 以及 cutoff。
匠魂原版的cutoff参考:
| rapier | 13 | 
| battle axe | 30 | 
| cleaver | 25 | 
| long sword | 18 | 
| default | 15 | 
假设循环的次数是n,每次循环时damage的数值共同组成了一个数列A,a1=cutoff,a_n=a_(n-1)+p^(n-1)*cutoff = 10 * cutoff-10 * cutoff * 0.9 ^ n。
应用最终伤害1的条件为p < 0.001f,可得0.9^(n-1)<0.001,解得n > 66.563,也就是说,在66次循环的时候就会结束循环并得到最终伤害1。
最终伤害2的范围更广,在damage小于cutoff时,最终伤害2就等于damage,在p<0.001之前结束循环时,设循环次数为x,x=damage / cutoff(向下取整),最终伤害2的值为 10 * cutoff – 10 * cutoff * 0.9 ^ x + 0.9 ^ x * d % cutoff。
最后再来一段长到让人感叹的excel公式:
=IF(POWER(0.9,MIN(66, ROUNDDOWN(B1/B2, )))>0.01,10*B2-10*B2*POWER(0.9, MIN(66, ROUNDDOWN(B1/B2, )))+POWER(0.9,MIN(66, ROUNDDOWN(B1/B2, )))*IF(POWER(0.9,MIN(66, ROUNDDOWN(B1/B2, )))>0.01,IF(MOD(B1,MIN(66, ROUNDDOWN(B1/B2, )))>0,MOD(B1,MIN(66, ROUNDDOWN(B1/B2, ))),B1/MIN(66, ROUNDDOWN(B1/B2, ))),B1-B2*(MIN(66, ROUNDDOWN(B1/B2, ))-1)),10*B2-10*B2*POWER(0.9, MIN(66, ROUNDDOWN(B1/B2, )))+POWER(0.9,MIN(66, ROUNDDOWN(B1/B2, )))*B2*((IF(POWER(0.9,MIN(66, ROUNDDOWN(B1/B2, )))>0.01,IF(MOD(B1,MIN(66, ROUNDDOWN(B1/B2, )))>0,MOD(B1,MIN(66, ROUNDDOWN(B1/B2, ))),B1/MIN(66, ROUNDDOWN(B1/B2, ))),B1-B2*(MIN(66, ROUNDDOWN(B1/B2, ))-1))/B2)-1))
此处的B1为damage,B2为cutoff。
掌握了这个就知道怎么用虚金拉皮和别人爽快击剑了!
首届数字匠魂击剑赛事(bushi)
这还数学学前班?不过这个教程我还是看不太懂,有内容截图就好了
感谢分享,MCBBS有你更精彩~
没糖的葫芦 发表于 2022-9-3 01:41
首届数字匠魂击剑赛事(bushi)
仿生人使用电子迅捷剑进行击剑.avi
匠魂都不更新啊