如何确保PHP代码中战斗伤害计算的最小值为0?
- 内容介绍
- 文章标签
- 相关推荐
本文共计794个文字,预计阅读时间需要4分钟。
原文:
在PHP OOP实战中,实现两个战士(Fighter)之间的战斗时,一个常见需求是:攻击方造成伤害 = 随机值(1 至自身力量值)− 防守方敏捷值,且伤害结果不得低于0。初学者常误以为只需用条件判断“若结果为负就设为0”,却忽略了关键陷阱:rand() 每次调用都会生成全新随机数。
观察原始代码:
if ((rand(1, $this->strength) - $target->dexterity) > 0) { $degat = (rand(1, $this->strength) - $target->dexterity); // ❌ 第二次调用 rand()! } else { $degat = 0; }
此处 if 判断中计算了一次随机伤害,而 if 分支内又重新调用 rand()——两次独立随机运算,导致判断依据与实际赋值完全脱节,无法保证 $degat ≥ 0。这就是出现负值的根本原因。
✅ 正确做法是:只调用一次 rand(),将结果暂存变量,再基于该确定值进行逻辑处理。
本文共计794个文字,预计阅读时间需要4分钟。
原文:
在PHP OOP实战中,实现两个战士(Fighter)之间的战斗时,一个常见需求是:攻击方造成伤害 = 随机值(1 至自身力量值)− 防守方敏捷值,且伤害结果不得低于0。初学者常误以为只需用条件判断“若结果为负就设为0”,却忽略了关键陷阱:rand() 每次调用都会生成全新随机数。
观察原始代码:
if ((rand(1, $this->strength) - $target->dexterity) > 0) { $degat = (rand(1, $this->strength) - $target->dexterity); // ❌ 第二次调用 rand()! } else { $degat = 0; }
此处 if 判断中计算了一次随机伤害,而 if 分支内又重新调用 rand()——两次独立随机运算,导致判断依据与实际赋值完全脱节,无法保证 $degat ≥ 0。这就是出现负值的根本原因。
✅ 正确做法是:只调用一次 rand(),将结果暂存变量,再基于该确定值进行逻辑处理。

