如何确保PHP代码中战斗伤害计算的最小值为0?

2026-05-07 07:330阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计794个文字,预计阅读时间需要4分钟。

如何确保PHP代码中战斗伤害计算的最小值为0?

原文:

在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(),将结果暂存变量,再基于该确定值进行逻辑处理

阅读全文
标签:PHP

本文共计794个文字,预计阅读时间需要4分钟。

如何确保PHP代码中战斗伤害计算的最小值为0?

原文:

在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(),将结果暂存变量,再基于该确定值进行逻辑处理

阅读全文
标签:PHP