2010-11-23 68 views
2

我正在開發一個簡單的文本戰鬥遊戲,並且在計算一場戰鬥後應該獲得多少XP的一些問題時,我想考慮幾個因素:遊戲設計:計算戰鬥後獲得的經驗值

1)玩家當然應該賺取更多的XP,如果他們擊敗同級別的人

2),如果他們打了一個更高層次的人

3)玩家應該賺取XP很差,如果球員應該獲得巨大XP他們擊敗較低級別的人。

4)以上這些應該很好地規模化,即如果玩家A是等級10並且與等級9或11的玩家B戰鬥,則差異不應該是巨大的(他們當然會獲得更多XP來擊敗等級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差異,然後使用某種倍增器,但我沒有'目前爲止的結果令人印象深刻。

任何幫助/輸入,將不勝感激。

+9

可能是一個更好的主意來這裏問:http://gamedev.stackexchange.com – 2010-11-23 00:36:28

回答

1

這是我用於FB遊戲的戰鬥方法,我放棄了。你可能會覺得它很有用。

public function fight(Player $attacker, Player $defender){ 
     $return = 'Attacking '.$defender->getName().'
'; // 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.'
'; if($dmgAttacker > 0){ $return .= 'Unfortuantely you took '.$dmgAttacker.' damage in the fight. The good news is you did '.$dmgDefender.' damage to '.$defender->getName().'
'; $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 .= '
'; } } else { // attack deflected $return .= 'The attack was deflected by '.$defender->getName().'
'; // 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.'
'; } 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
'; } } // save data $attacker->save(); $defender->save(); // output return $return; }
1

這是一種簡單的,但它適合你的標準

xpGain = getbasexp(); //whatever you were doing before 
xpGain *= opponentxp * 1.0/playerxp;