秦千久
一时兴起做了这篇教程教程?,由于本人的数学水平犹如学前班,所以可能会存在纰漏,还望大家指出。
文章末尾有 excel 公式,不愿意看的可以直接拉到最底下拿走用。

先看源码:
  1. public static float calcCutoffDamage(float damage, float cutoff) {
  2.   float p = 1f;
  3.   float d = damage;
  4.   damage = 0f;
  5.   while(d > cutoff) {
  6.     damage += p * cutoff;
  7.     // safety for ridiculous values
  8.     if(p > 0.001f) {
  9.       p *= 0.9f;
  10.     }
  11.     else {
  12.       damage += p * cutoff * ((d / cutoff) - 1f); // 最终伤害1
  13.       return damage;
  14.     }
  15.     d -= cutoff;
  16.   }
  17.   damage += p * d;  // 最终伤害2
  18.   return damage;
  19. }
复制代码



函数的输入有两个,一个是应用完所有特性后的伤害数值: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)

是悠米啦
这还数学学前班?不过这个教程我还是看不太懂,有内容截图就好了

hangjie7777
感谢分享,MCBBS有你更精彩~

秦千久
没糖的葫芦 发表于 2022-9-3 01:41
首届数字匠魂击剑赛事(bushi)

仿生人使用电子迅捷剑进行击剑.avi

孤单的永恒
匠魂都不更新啊