Почему мой убывающий цикл не прерывается?

У меня есть этот код.
Я использую перерыв, но цикл не останавливается.

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

-4

Решение

Я не хочу упустить этот шанс, чтобы показать вам некоторые более продвинутые методы, которые упростят ваш блок кода и устранят некоторые операторы if.

Собрав двух бойцов в единый массив «бойцов», где первый боец ​​(герой) является элементом [0] а монстр (потвор) это стихия [1]Вы можете обратиться к каждому с помощью простой арифметики.

Что касается вашего исходного кода, то не имеет смысла писать breakв конце вашего цикла. Правильное размещение в соответствии с вашими условиями прямо в вашем заявлении, как указано выше.

Обратите внимание, что я изменил rand() диапазон от 1-2 в 0-1 для простого переключения между двумя значениями в строке расчета ущерба.

Чтобы нацелить противника в каждом раунде, я использую 1-$losowy, Я считаю, что это наиболее интуитивный / элементарный способ переключения значения. Тем не менее, есть и другие методы, включая метод, который использует побитовый оператор (это самый быстрый способ сделать это, но наименее интуитивно понятный).

Код: (демонстрация)

$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(true) цикл, если это абсолютно необходимо. Я бы порекомендовал сделать что-то вроде этого:

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;
}

Или внимательно проверьте свою логику.

0
По вопросам рекламы [email protected]