【问题标题】:while loop not working properlywhile 循环无法正常工作
【发布时间】:2014-10-18 10:19:13
【问题描述】:

结果是这样的:

  1. 你对敌人造成 8 点伤害,敌人还剩 92 点生命值
  2. 敌人对你造成 8 点伤害,你还剩 86 hp
  3. 你对敌人造成 5 点伤害,敌人还剩 81 点生命值
  4. 敌人对你造成 11 点伤害,你还剩 72 hp
  5. 你对敌人造成 12 点伤害,敌人还剩 67 点生命值
  6. 敌人对你造成 7 点伤害,你还剩 60 hp
  7. 你对敌人造成 13 点伤害,敌人还剩 40 点生命值
  8. 敌人对你造成 11 点伤害,你还剩 32 点生命值
  9. 你对敌人造成 2 点伤害,敌人还剩 33 点生命值
  10. 敌人对你造成 15 点伤害,你还剩 16 点生命值
  11. 你对敌人造成 15 点伤害,敌人还剩 2 点生命值
  12. 敌人对你造成 17 点伤害,你还剩 -11 hp

你死了:-11 hp 敌人获胜!

敌人的生命值是:-8 你赢了!你获得 50 经验!

两者都有 100 hp,正如您在第 2 行看到的那样,当敌人受到 8 点伤害并剩下 86 hp 时,有一个“循环”丢失了。

当其中一个死亡时如何停止循环以使两者不能同时死亡?因此,如果一个人死了,循环就会停止并确定获胜者。

有没有更好的方法来确定从随机开始?

<?php

$p_hp = 100;
$p_atk = 20;
$p_defence = 5;

$m_hp = 100;
$m_atk = 20;
$m_defence = 5;

if ($p_hp > 0) {

    $turn = rand(0,1);
    $hitnr = 0;

    while (($p_hp >= 0) && ($m_hp >= 0)) {

        $turn--;
        $hitnr++;

        $enemydef = $p_atk - $m_defence / 2;
        $my_damage = rand(1, $enemydef);

        $playerdef = $m_atk - $p_defence / 2;
        $enemy_damage = rand(1, $playerdef);

        $p_hp = $p_hp - $enemy_damage;
        $m_hp = $m_hp - $my_damage;

        // Player turn
        if ($turn % 2 == 0) {
            echo "<b>".$hitnr.".</b> Enemy hit you for  <font color='red'><b>".$enemy_damage . "</b></font> damage you have <b>".$p_hp." hp</b> left<br>";    

        // Monster turn    
        } else {
            echo "<b>".$hitnr.".</b> You hit enemy for  <font color='green'><b>".$my_damage . "</b></font> damage enemy has <b>".$m_hp." hp</b> left<br>";
        }

        if ($p_hp <= 0) {
            echo "<br>You died: ".$p_hp." hp<br><font color='red'><b>Enemy wins!</b></font>";
         }

        if ($m_hp <= 0) {
            echo "<br>Enemy hp is: ".$m_hp."<br><font color='green'><b>You win! You gain 50 exp!</b></font>";

        }
    }
} else {
    echo "You are dead. <a href='hospital.php'>Go to the hospital!</a>";
}

?>

【问题讨论】:

  • 如果是玩家回合 - 那么大多数 hp 应该减少,反之亦然,现在每回合你都会减少两个角色的 hp。
  • 检查两个命中点是否为负数,如果一个通过为真,则打破声明if ($EnemyHealth &lt; 0 OR $PlayerHealth &lt; 0){ break; }

标签: php loops if-statement while-loop


【解决方案1】:

除非怪物(或玩家)可以反击,否则只有目标的HP应该减少:

$p_hp = 100;
$p_atk = 20;
$p_defence = 5;

$m_hp = 100;
$m_atk = 20;
$m_defence = 5;

if ($p_hp >= 0) {

    $turn = rand(0,1);
    $hitnr = 0;

    while (($p_hp >= 0) && ($m_hp >= 0)) {

        $turn--;
        $hitnr++;

        $enemydef = $p_atk - $m_defence / 2;
        $my_damage = rand(1, $enemydef);

        $playerdef = $m_atk - $p_defence / 2;
        $enemy_damage = rand(1, $playerdef);

        // Monster turn
        if ($turn % 2 == 0) {
            $p_hp = $p_hp - $enemy_damage;
            echo "<b>".$hitnr.".</b> Enemy hit you for  <font color='red'><b>".$enemy_damage . "</b></font> damage you have <b>".$p_hp." hp</b> left<br>";    

        // Player turn    
        } else {
            $m_hp = $m_hp - $my_damage;
            echo "<b>".$hitnr.".</b> You hit enemy for  <font color='green'><b>".$my_damage . "</b></font> damage enemy has <b>".$m_hp." hp</b> left<br>";
        }

        if ($p_hp <= 0) {
            echo "<br>You died: ".$p_hp." hp<br><font color='red'><b>Enemy wins!</b></font>";
         }

        if ($m_hp <= 0) {
            echo "<br>Enemy hp is: ".$m_hp."<br><font color='green'><b>You win! You gain 50 exp!</b></font>";

        }
    }
} else {
    echo "You are dead. <a href='hospital.php'>Go to the hospital!</a>";
}

?>

【讨论】:

  • 这有帮助,但我不得不将 while (($p_hp >= 0) && ($m_hp >= 0)) { 更改为 while (($p_hp > 0) && ($m_hp > 0) ) { 因为如果有人击中 0,它会像这样循环 3 次 你死了:0 hp 敌人赢了!32。你对敌人造成 5 点伤害,敌人还剩 4 hp 你死了:0 hp 敌人获胜!33。敌人对你造成 13 点伤害,你还剩 -13 hp 你死了:-13 hp 敌人获胜!
猜你喜欢
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 2014-12-06
  • 2015-01-06
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多