Дизайн игры: подсчет очков опыта, заработанных после битвы - PullRequest
2 голосов
/ 23 ноября 2010

Я занимаюсь разработкой простой текстовой батальной игры, и у меня возникают проблемы с подсчетом, сколько очков XP нужно заработать после битвы, вот несколько факторов, которые я хочу рассмотреть:

1) Игроки, конечно, должны получать хорошую ХР, если бьют кого-то одного уровня

2) Игроки должны зарабатывать отличные XP, если они побеждают кого-то более высокого уровня

3) Игроки должны зарабатывать плохие XP, если они побеждают кого-то более низкого уровня.

4) Вышесказанное должно хорошо масштабироваться, т. Е. Если игрок A уровня 10 и сражается с игроком B, который находится на уровне 9 или 11, разница не должна быть огромной (они, конечно, получат больше опыта за победу над персонажем уровня 11, но мы не ожидал бы, что это будет огромно), но если он будет сражаться на уровне 5 или 15, эта разница должна быть огромной.

Просто из-за проблем с вычислением чего-то, что хорошо работает во всех сценариях, в настоящее время моя таблица XP выглядит следующим образом:

Current Level   XP Needed   Increase from Last Level
1   30  0
2   65  35
3   106 41
4   154 48
5   210 56
...
10  672 123

В PHP мой код выглядит так, как показано ниже для расчета необходимой XP:

$offset = 30;
$multiplier = 1.17;
$base = $prevXp * $multiplier;

$xp = $base + $offset;

Я пробовал несколько разных вещей, но ни одна из них меня не впечатлила, я хотел бы поработать с вычислением разницы в XP между двумя игроками и затем использовать какой-то множитель, но у меня нет До сих пор впечатлили результаты.

Буду признателен за любую помощь / вклад.

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

это довольно просто, но соответствует вашим критериям

xpGain = getbasexp(); //whatever you were doing before
xpGain *= opponentxp * 1.0 / playerxp;
1 голос
/ 23 ноября 2010

Вот метод борьбы, который я использовал для игры FB, которую я бросил.Вы можете найти это полезным.

public function fight(Player $attacker, Player $defender){
      $return = '<strong>Attacking '.$defender->getName().'</strong><br />';
      // if the defener has greater def than attackers attack, repel the attack
      // if the attacker has greater attack then the denfenders defense, penetrate
      if($attacker->getAttack() > $defender->getDefense()){
        $attacker->takeTemper(1);
        // penetration -- that's what she said!!!
        // figure out how much to damage each player
        $dmgDefender = rand(5, 25);
        $defender->takeHP($dmgDefender);
        $dmgAttacker = rand(0, 10);
        // figure out the reward
        // give between 1 and 5 XP and 10% of the defenders money
        $gainedXP = rand(1, 5);
        $attacker->addXP($gainedXP);
        $gainedMoney = floor($defender->getMoney() * .1);
        $attacker->addMoney($gainedMoney);
        $defender->takeMoney($gainedMoney);
        $return .= 'You won the fight and gained '.$gainedXP.' XP and $'.$gainedMoney.'<br />';
        if($dmgAttacker > 0){
          $return .= 'Unfortuantely you took '.$dmgAttacker.' damage in the fight.  The good news is you did '.$dmgDefender.' damage to '.$defender->getName().'<br />';
          $attacker->takeHP($dmgAttacker);
        }
        // check if the player leveled
        $nextLevelXP = $this->_level->levelXP( $attacker->getLevel() + 1 );
        if( ( $attacker->getXP() >= $nextLevelXP ) ){
          $gainedFounderPoints = $this->gainLevel($attacker);
          $return .= 'You gained a level';
          if($gainedFounderPoints > 0)
            $return .= ' and '.$gainedFounderPoints.IMG_FOUNDER_POINT;
          $return .= '<br />';
        }
      } else {
        // attack deflected
        $return .= 'The attack was deflected by '.$defender->getName().'<br />';
        // reward defender -- how about 10% of the attackers money?
        $reward = ceil($attacker->getMoney() * .1);
        if($reward > 0){
          // demerit attacker
          $attacker->takeMoney($reward);
          $defender->giveMoney($reward);
          $return .= 'You lost $'.$reward.'<br />';
        } else {
          // the attacker is broke ... take his XP!!! -- 1 percent
          $reward = ceil($attacker->getXP() * .01);
          $attacker->takeXP($reward);
          $defender->addXP($reward);
          $return .= 'You lost '.$reward.' XP<br />';
        }
      }
      // save data
      $attacker->save();
      $defender->save();

      // output
      return $return;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...