PHP цикл математический запрос - PullRequest
1 голос
/ 22 октября 2011

Это будет трудно объяснить, чего я хочу, поэтому я буду стараться изо всех сил.

У меня есть игра, и у игроков в ней есть счетчик здоровья (hp), а также телохранители. Каждый телохранитель имеет 100 л.с., и как только все телохранители игрока ушли, урон сходит с их здоровья.

Итак, у меня есть следующие значения:

$dmg // the damage
$bgs // the amount of bodyguards the player has
$bg_hp // the bodyguards health. Starts at 100, drains with $dmg fired at
$hp // the players health

Когда они стреляют, нужно проверить, есть ли у них $ bgs. Это базовый пример.

if ($bgs > 0) {
  $bgs_hp = $bgs_hp - $dmg;
     if ($bg_hp <= 0) { $bg = $bg - 1; $bg_hp = 100; }
  } else {
  $hp = $hp - $dmg;
  }

Во всяком случае, часть, с которой мне нужна помощь, это. Я хочу, чтобы ущерб перекрывался. Допустим, $ dmg равен 200, что убило бы 2 телохранителей (у них по 100 л.с. Или кто-то может застрелить всех своих телохранителей, и остаток от $ dmg тоже сходит с $ hp.

Причина, по которой мне нужна помощь, заключается в том, что я ужасно разбираюсь в математике, и есть проблема с какой-либо функцией MOD или чем-то, что мне нужно использовать.

Примеры;

1) У игрока 3 телохранителя. Кто-то стреляет в него за 150 урон. Это убило бы 1 телохранителя и нанесло бы 50 урона следующему.

2) У игрока есть 1 телохранитель, который наполовину лс (50). Кто-то стреляет в него за 160, это убило бы телохранителя (50л.с.), а остальная часть этого урона (110) убила бы и игрока тоже.

Ответы [ 3 ]

1 голос
/ 22 октября 2011

Я бы просто сохранил массив с hps каждого телохранителя, например:

$bgs = array(100); // one bg with 100 hp

или

$bgs = array(100, 300, 50); // one bg with 100 hp, then one with 300, etc

Если вы хотите узнать, сколько существует телохранителей,простой count($bgs) говорит вам.

Это значительно облегчит вам расширение вашей игры в будущем, а также значительно облегчит решение этих типов вычислений.Теперь вы можете написать:

$hp = 100;
$bgs = array(100, 100);
$damage = 101; // for example

// As long as there's still damage to take and bgs to take it:
while($damage && !empty($bgs)) {
    $soak = min($bgs[0], $damage); // not more than the first bg can take
    $bgs[0] -= $soak; // remove hps from the first bg
    $damage -= $soak; // deduct from the amount of damage to tage
    if ($bgs[0] == 0) {
        // bodyguard dead, remove him from the array
        array_shift($bgs);
    }
}

// If there's any damage left over, it goes to hp
$hp -= $damage;

Просмотреть его в действии .

Обновление: Вот код, который работает сваша текущая схема.Это на самом деле не проще, и это более ограничивает то, что вы можете сделать:

$max_bg_health = 100;
$hp = 100;
$bgs = 2;
$bg_hp = $max_bg_health; // so that makes 2 "full health" bgs
$damage = 101; // for example
if($bgs) {
    $bg_capacity = ($bgs - 1) * $max_bg_health + $bg_hp;
    $soak = min($bg_capacity, $damage);
    $bg_capacity -= $soak;
    $damage -= $soak;

    // update bodyguard status; this is extra tricky because $bgs is not
    // "the amount of full hp bgs" (which would make it a lot simpler)
    // but "the amount of bgs including the one which may not have full hp"
    $bgs = $bg_capacity ? intval($bg_capacity - 1 / $max_bg_health) + 1 : 0;
    $bg_hp = $bg_capacity % $max_bg_health;
}

// If there's any damage left over, it goes to hp
$hp -= $damage;
0 голосов
/ 22 октября 2011
<?php

$bg = 2;

$health_max = 100;

$health_total = $bg * $health_max + $health_max;

$damage = 100;

if($damage >= $health_total)
{
    die('You are caput.');
}
else
{
    $health_total = $health_total - $damage;
    $bg = floor($health_total / $health_max);
}

if($bg > 0)
{
    $tmp = ($health_total - $health_max) % $health_max;
    for($i = 1; $i < $bg; $i++)
        $bg_health[] = $health_max;
    $bg_health[] = $tmp;
    $bg_health = implode(', ', $bg_health);
}

if(empty($bg_health)) $tmp = 0;
$health = $health_total - $tmp;

echo "You have {$health} health and {$bg} bodyguards left with health of {$bg_health}.";
?>

Это даст ...

У вас осталось 100 единиц здоровья и 1 телохранитель со здоровьем 77.

0 голосов
/ 22 октября 2011

Одна возможность - хранить только общее количество очков здоровья (то есть ваше и ваших телохранителей).Затем вы можете рассчитывать свои очки здоровья и количество телохранителей от них каждый раз, когда вам это нужно (поэтому вам не нужно их сохранять)

$totalhp = 499; // you have 100 health and 4 bodyguards, the last one has 99 health

$bgs = $totalhp > 100 ? (int)(($totalhp-1)/100) : 0; // Number of active bodyguards
$hp = min($totalhp, 100); // Your health
$bg_hp = $bgs > 0 ? ((($totalhp-1) % 100) + 1) : 0; // the health of your "current" bodyguard

Затем, когда вы получаете некоторый урон, просто вычтите его из$totalhp:

$totalhp = $totalhp - $dmg;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...