Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于级别的变量修饰符_Java_Math_Bukkit - Fatal编程技术网

Java 基于级别的变量修饰符

Java 基于级别的变量修饰符,java,math,bukkit,Java,Math,Bukkit,我对这个问题很生气。 好吧,让我们开始吧。我想根据MySQL数据库中存储的级别为不同的minecraft事件添加一些修饰符(例如EntityDamageByEntityEvent中处理的伤害程度) 该级别系统将有99个级别(1到100),默认级别为50;例如,在EntityDamageByEntityEvent的情况下,我希望更改损坏,以便: a) 如果玩家等级为50,伤害不会被修改(只会乘以1) b) 如果玩家等级为1,造成的伤害将乘以1/3 c) 如果玩家达到100级,伤害将被3级抵消 到目

我对这个问题很生气。 好吧,让我们开始吧。我想根据MySQL数据库中存储的级别为不同的minecraft事件添加一些修饰符(例如EntityDamageByEntityEvent中处理的伤害程度)

该级别系统将有99个级别(1到100),默认级别为50;例如,在EntityDamageByEntityEvent的情况下,我希望更改损坏,以便:

a) 如果玩家等级为50,伤害不会被修改(只会乘以1)

b) 如果玩家等级为1,造成的伤害将乘以1/3

c) 如果玩家达到100级,伤害将被3级抵消

到目前为止,还不错,但是对于17级或89级的玩家,我怎么能做到呢?我想知道的是如何转换,比方说,在1/3到3的范围内,1到100的比例,比50=1。。。有点激动人心。。。 提前谢谢,希望你能理解我

如果将点(1,1/3)、(50,1)和(100,3)绘制在图形上,您将看到它们没有形成一条直线。所以现在还不清楚你的伤害修正函数在这些点之间的行为

您可以采用分段线性方式,使用1到50之间的线性插值和(分别)50到100之间的线性插值:

final float scalingFactor;
if (level < 50) {
    // Convert (1..50) range into (0..1) range.
    final float interp = (level - 1) / 49.0;

    // Convert (0..1) range into (1/3..3/3) range.
    scalingFactor = ((interp * 2.0) + 1.0) / 3.0;
}
else {
    // Convert (50..100) range into (0..1) range.
    final float interp = (level - 50) / 50.0;

    // Convert (0..1) range into (1..3) range.
    scalingFactor = (interp * 2.0) + 1.0;
}

return damage * scalingFactor;
在分段线性方法中,1级和50级之间以及50级和100级之间的伤害从一级到下一级的差异是相同的,但50级到51级的伤害差异明显大于49级到50级


指数函数为你提供了一条平滑的曲线,其中每级伤害的差异在整个范围内逐渐增加。

你可以这样做:

@EventHandler
public void damage(EntityDamageEvent e){
  int i = e.getDamage();
  if(e.getDamager() instanceof Player){
    int level = //get players level here
    float multiplier = (level >= 50 ? (1 + ((1/25) * (level - 50)) : ((1/3) + (1/75) * (level - 1)));
    e.setDamage(i * multiplier);
  }
}
如果玩家等级为1,伤害将增加1/3;如果等级为50,伤害将增加1;如果等级为100,伤害将增加3。这也适用于介于两者之间的所有数字

下面是它的工作原理:

  • 在50(包括)和100(不包括)之间有50个数字,如果您想在该范围内逐渐添加2,则可以在每次数字增加时使用分数
    2/50
    ,或
    1/25

  • 您可以做同样的事情,只需在50个值内逐渐删除2/3,您可以在每次数字下降时删除
    2/150
    ,或
    1/75


因此,例如,5级将为您提供
1/3+(1/75*(5-1))
=0.386666…=<代码>29/75原始伤害

我真不敢相信我花了多长时间试图弄明白这个问题,哈卡,你能不能稍微改变一下你的设计,让1级乘以1,50级乘以3,100级乘以9?事实上,这意味着同样的事情,但实现将更加容易。事实证明,1-100有点奇怪。。。从1-50范围内有49个,50-100范围内有50个。你会重新考虑你的计算方法吗?是的。最后,我决定在两个不同的操作中分离函数,一个用于(1,1/3)和(50,1)之间的行,另一个用于(50,1)和(100,3)
@EventHandler
public void damage(EntityDamageEvent e){
  int i = e.getDamage();
  if(e.getDamager() instanceof Player){
    int level = //get players level here
    float multiplier = (level >= 50 ? (1 + ((1/25) * (level - 50)) : ((1/3) + (1/75) * (level - 1)));
    e.setDamage(i * multiplier);
  }
}