2017-08-13 41 views
-4

我有这段代码。 我正在使用break,但循环不停止。为什么我的递减while循环中断?

$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; 
    } 
} 
+1

请粘贴代码中的问题,而不是一些第三方网站。 – luk2302

+1

您的休息条件中的这些数字不会更改。它们保持不变,因此永远不会脱离循环。 –

+0

谢谢,但为什么这个值不会改变?我正在使用“。=” –

回答

0

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

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

就您的原始代码而言,在循环结束时编写break s没有任何意义。正如你所说的那样,你的条件是正确的。

注意,我在伤害计算线已经改变了rand()范围从1-20-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 
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($Potwor['zycie'] > 0 && $Hero['zycie'] > 0) { 
    // Loop stuff 
} 
0

正如你都数组中更新元素的atak,把休息等元素zycie上因为你已经运行你无限循环使用while(true)我认为你需要把打破元素atak像下面

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

或仔细检查你的逻辑。