我有一个为Minecraft制作的插件。它用于大规模的恶龙战斗,根据造成的伤害在所有人之间平均分配EXP。
它起作用了,但是有一个小问题使方程失去了体验。
代码如下:
private void divideExpAmongstPlayersBasedOnDamageDealt(int exp, Map<Player, Double> damageMap) {
double totalDamageDealt = 0.0d;
for (Double value : damageMap.values()) {
totalDamageDealt += value;
}
while (exp > 0 && !damageMap.isEmpty()) {
Player maxHitterInList = Collections.max(damageMap.entrySet(),
Comparator.comparingDouble(Map.Entry::getValue)).getKey();
double damageShare = damageMap.get(maxHitterInList) / totalDamageDealt;
int expShare = (int) Math.round(exp * damageShare);
if (expShare == 0)
break;
if (maxHitterInList.isOnline()) {
sendPlayerMessage(maxHitterInList, damageShare, expShare);
maxHitterInList.giveExp(expShare);
}
exp -= expShare;
damageMap.remove(maxHitterInList);
}
}
找到最大的击球手,奖励他们应占的EXP并将其从列表中删除,直到没有更多EXP可以提供为止。
问题是它遗漏了分数,迫使我在while条件中添加&& !damageMap.isEmpty()
以避免出现异常。它始终准确地打印百分比(总和为100)。
我认为它与Math.round函数有关,尽管我不知道如何调试它。当我手动进行计算时,它们会计算出来。
示例(这确实发生了):暴民授予10
exp。玩家1造成57%
伤害,玩家2造成43%
。正确打印百分比值,但Player1收到6
EXP,而Player2收到2
?我上次检查0.57 * 10
等于5.7 = 6
,而0.43 * 10
等于4.3 = 4
。
我想念什么?它与舍入功能或加倍工作方式有关吗?
谢谢
答案 0 :(得分:2)
这不是一个四舍五入的问题,但是您在计算中使用了错误的值。
您写了“上次我检查0.57 * 10等于5.7 = 6和0.43 * 10等于4.3 = 4” ,但是您使用的公式是
int expShare = (int) Math.round(exp * damageShare);
并且您为循环的每次迭代更新exp
exp -= expShare;
这意味着您的第二个玩家exp
是4个而不是您在示例中假设的10个,因此实际计算是 0.43 * 2 ,四舍五入为2
因此,您需要将while
条件中使用的变量和计算中使用的变量分开。