Java实现宝可梦对战伤害计算时偶现0值死循环如何解决
问题根因
你写的逻辑出问题有三个核心原因:
Math.random()原生返回值范围是[0, 1),是包含0的,一旦随机到0值,伤害直接被算成0。- 浮点结果强转
int时会直接截断小数部分,只要基础伤害 * 随机系数的结果小于1,哪怕系数不是0,强转后也会变成0。 - 你后续加的
if (damage <=45)逻辑是完全反向的:低伤害时再乘一次随机系数,只会让伤害更低,进一步提升了算出0值的概率,根本起不到修复作用。
修复思路
从两个维度彻底堵死0伤害的可能,就不会触发无限循环:
- 调整随机系数的取值范围,去掉0值区间,正统宝可梦作品的伤害浮动默认是0.85~1.0倍,你可以根据自己的游戏设计调整下限,但绝对不能让系数取到0。
- 计算完最终伤害后加强制兜底,规定单次伤害最小值为1,从规则上杜绝0伤害出现。
- 删除之前写的错误if分支逻辑。
修复后可直接用的代码
public static void attackvalue(Taschenmonster pokemon1, Taschenmonster pokemon2) { // 随机系数范围0.85~1.0,想要更大浮动就改下限,比如要0.5~1.0就写成 0.5 + Math.random()*0.5 double multiplier = 0.85 + Math.random() * 0.15; // 向上取整后转int,再强制兜底最小伤害为1,完全避免0值 pokemon1.damage = Math.max(1, (int) Math.ceil(pokemon1.damage * multiplier)); pokemon2.damage = Math.max(1, (int) Math.ceil(pokemon2.damage * multiplier)); }
补充说明:用
Math.ceil做向上取整,是为了避免int强转截断小数导致的伤害异常偏低,比如1点基础伤害乘0.85得到0.85,向上取整后是1,配合Math.max(1, 计算结果)的兜底,永远不会出现0伤害。
内容的提问来源于stack exchange,提问作者Yuichiro
相关产品推荐
相关产品推荐

