为什么我的递减 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]
,你可以参考每个人都使用简单的算术。
就您的原始代码而言,在循环末尾编写 break
s 是没有意义的。如 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
我有这个代码。 我正在使用 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]
,你可以参考每个人都使用简单的算术。
就您的原始代码而言,在循环末尾编写 break
s 是没有意义的。如 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