Я начинаю в ООП с PHP, и я хочу, чтобы 2 противника сражались с функцией боя. Я хочу иметь переменную $degat, которая является результатом произвольного числа от 1 до силы атакующего - (минус) ловкости защитника. Таким образом, результат должен быть минимум 0.
У меня есть этот код, и когда я его var_dump, у меня все еще есть отрицательное значение. Я не вижу, что я делаю неправильно.
public function fight(Fighter $target)
{
// $degat = (rand(1, $this->strength) - $target->dexterity) >= 0 ? (rand(1, $this->strength) - $target->dexterity) : 0;
if ((rand(1, $this->strength) - $target->dexterity) > 0) {
$degat = (rand(1, $this->strength) - $target->dexterity);
} else {
$degat = 0;
};
var_dump($degat);
$target->life -= $degat;
}
Спасибо !






Ну, проблема здесь в том, что каждый раз, когда вы вызываете rand, результат разный. Итак, вы должны сохранить выражение с помощью rand, а затем использовать его повторно.
Кроме того, все это можно было бы сделать немного короче с использованием тернарного оператора.
$expr = (rand(1, $this->strength) - $target->dexterity);
$degat = $expr > 0 ? $expr : 0
Некоторые примечания:
rand не генерирует криптографически безопасные значения и также может зависеть от начального числа, вы также можете рассмотреть возможность использования random_int, я думаю, что это, безусловно, помогает рандомизировать вашу игру.
подробнее о тернарном операторе здесь: https://www.php.net/manual/en/language.operators.comparison.php
Офигенный ответ! Большое спасибо! Спасибо за все подробности.
@trueChoan, если ответ решил проблему, не могли бы вы поставить галочку, пожалуйста?
Вместо того, чтобы сохранять результат rand(1, $this->strength) - $target->dexterity) в переменной, вы также можете полностью опустить оператор if и сократить свой метод до:
public function fight(Fighter $target)
{
// max(a,b) returns the higher number from a and b
$target->life -= max(0, rand(1, $this->strength) - $target->dexterity);
}
Ожидаете ли вы, что возвращаемое значение
rand()будет детерминированным?