У меня есть этот код.
Я использую перерыв, но цикл не останавливается.
$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;
}
}
Я не хочу упустить этот шанс, чтобы показать вам некоторые более продвинутые методы, которые упростят ваш блок кода и устранят некоторые операторы 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
Вы никогда не изменяете значение какого-либо из массивов, которое используете для запуска разрыва. Вы устанавливаете два 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
}
Как вы обновляете элемент atak
в обоих массивах и положить разрыв на другой элемент zycie
как вы уже запускаете, вы бесконечный цикл while(true)
Я думаю, что вам нужно положить разрыв на элементе atak
как ниже
if($Potwor['atak'] <= 0) {
break;
}
else if($Hero['atak'] <=0 ) {
break;
}
Или внимательно проверьте свою логику.