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

时间:2017-08-13 15:22:27

标签: php while-loop break decrement

我有这个代码。 我正在使用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;
    }
}

3 个答案:

答案 0 :(得分:0)

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

我不确定您需要表达的行为/规则,但此代码将成功退出:

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
}

答案 1 :(得分:0)

当您在两个数组中更新元素atak并在其他元素zycie上放置中断时,您已经运行了while(true)循环无限我认为您需要在元素上放置中断{ {1}}如下所示

atak

或仔细检查你的逻辑。

答案 2 :(得分:0)

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

将两名战斗员打包成一个“战士”阵列,其中第一个战斗机(英雄)是元素[0]而怪物(Potwor)是元素[1],你可以使用简单的参考算术。

就原始代码而言,在循环结束时编写break是没有意义的。正如您所提到的那样,您的条件的正确位置直接在您的while语句中。

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

为了在每轮中瞄准对手,我使用的是1-$losowy。我发现这是切换价值的最直观/最基本的方式。但是,还有其他技术,包括a method that uses a bitwise operator (it is the fastest performing way to do it, but the least intuitive)

代码:(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