为什么我的递减 while 循环没有中断?

Why doesn't my decrementing while loop break?

我有这个代码。 我正在使用 break,但循环没有停止。

$Hero = array(
        'atak'  => 100,
        'zycie' => 1000
    );
$Potwor = array(
        'atak'  => 100,
        'zycie' => 500
    );

$BattleLog = array();
while(true) {
    $kogo_ruch = rand(1, 2);
    if($kogo_ruch == 1) {
        $Hero['atak'] -= $Potwor['zycie'];
    }else{
        $Potwor['atak'] -= $Hero['zycie'];
    }

    if($Potwor['zycie'] <= 0){
        break;
    }elseif($Hero['zycie'] <=0 ){
        break;
    }
}

永远不要修改用于触发中断的任一数组值的值。您将两个 zycie 索引设置为静态值但不修改这些值,它们永远不会满足您的循环退出条件。

我不太确定behavior/rules你需要表达什么,但这段代码会成功退出:

while(true) {
  $kogo_ruch = rand(1, 2);

  if($kogo_ruch == 1) {
    $Potwor['zycie'] -= $Hero['atak'];
  }
  else {
    $Hero['zycie'] -= $Potwor['atak'];
  }

  if($Potwor['zycie'] <= 0) {
    break;
  } 
  else if($Hero['zycie'] <=0 ) {
    break;
  }
}

此外,正如一般说明,除非绝对必要,否则使用 while(true) 循环通常不是一个好主意。我建议改为这样做:

while($Potwor['zycie'] > 0 && $Hero['zycie'] > 0) {
  // Loop stuff
}

当你更新两个数组中的元素 atak 并在其他元素 zycie 上打断时,你已经 运行 你用 while(true) 无限循环我认为你需要在元素 atak 上打断,如下所示

if($Potwor['atak'] <= 0) {
  break;
}
else if($Hero['atak'] <=0 ) {
  break;
}

或者仔细检查你的逻辑。

我不想错过这个机会,向您展示一些更高级的技术,这些技术将简化您的代码块并消除一些 if 语句。

通过将你的两个战士打包成一个"fighters"数组,其中第一个战士(英雄)是元素[0],怪物(Potwor)是元素[1],你可以参考每个人都使用简单的算术。

就您的原始代码而言,在循环末尾编写 breaks 是没有意义的。如 enpaul 所述,您的条件的正确位置直接在您的 while 语句中。

请注意,我已将 rand() 范围从 1-2 更改为 0-1,以便在伤害计算行中的两个值之间进行简单切换。

为了在每一轮中瞄准对手,我正在使用1-$losowy。我发现这是切换值的最 intuitive/elementary 方式。但是,还有其他技术,包括 .

代码:(Demo)

$Wojownicy=[
    ['zycie'=>1000,'atak'=>100],  // Bohater(Hero) : life points , attack points
    ['zycie'=>500,'atak'=>100]    // Potwor(Monster) : life points , attack points
];

while($Wojownicy[0]['zycie']>0 && $Wojownicy[1]['zycie']>0){
    $losowy=rand(0,1);  // identify attacker
    $Wojownicy[1-$losowy]['zycie']-=$Wojownicy[$losowy]['atak'];  // subract attack from opponent
    echo "Hero={$Wojownicy[0]['zycie']} -vs- Monster={$Wojownicy[1]['zycie']}\n";  // display each round
}
// Spoiler Alert: The Hero wins almost every time!

不太可能的结果:

Hero=900 -vs- Monster=500
Hero=900 -vs- Monster=400
Hero=800 -vs- Monster=400
Hero=700 -vs- Monster=400
Hero=600 -vs- Monster=400
Hero=500 -vs- Monster=400
Hero=400 -vs- Monster=400
Hero=300 -vs- Monster=400
Hero=200 -vs- Monster=400
Hero=100 -vs- Monster=400
Hero=100 -vs- Monster=300
Hero=100 -vs- Monster=200
Hero=100 -vs- Monster=100
Hero=0 -vs- Monster=100