2011-07-13 61 views
1

我在遊戲中涉及到XP水平的算法問題:遊戲經驗水平的問題

我有列出該級別水平的數字,和XPS的數量的表格:

GameLevel ExperiencePointsInLevel 
1   30 
2   70 
3   160 
4   250 

對於每個玩家,我只維持他們的總XP,而不是任何關卡信息。 給定玩家的總XP,我如何通過算法確定以下內容(我正在使用C#& LINQ)?

  1. 當前的個人水平
  2. 點數的人在這個級別

例如,如果一個球員有110個XPS,答案應該是:

  1. 3級
  2. 10 XPs; (110-30-70 = 10)

任何想法?

乾杯,

迪安

+0

爲什麼你不記錄他們在什麼級別?該算法是從第1級開始,看看XP的成績是否低於這個水平,如果不是,減去剩餘的水平,然後繼續下一個水平,然後重複,直到你發現剩餘的XP少於下一個所需的水平水平的進步。在這一點上,你有在關卡內的成就。 – Lazarus

+0

你使用EF還是LINQ2SQL?我不認爲你在你的項目中使用了兩個 - 但你問題上的標籤意味着... –

+0

對不起,linq2sql – Dean

回答

1

如果級別經驗值更改爲代表總XP玩家需要達到這一水平同樣的想法。

Game Level Experience Points 
1    0 
2    100 
3    200 
4    400 

LINQ一個功能更強大的方法是類似以下內容:

var playerlevel = ExperiencePointsTable 
    .Where(xpt => xpt.ExperiencePointsInLevel <= player.ExperiencePoints) 
    .Select(xpt => xpt.GameLevel) 
    .Max(); 

我想,這簡化了解決方案,避免了不得不產生一個查找陣列。

編輯:固定檢查小於或等於水平。

要了解多少xp玩家必須達到下一個級別,您可以使用類似的LINQ查詢。

var xpToNextLevel = (ExperiencePointsTable 
    .Where(xpt => xpt.ExperiencePointsInLevel > player.ExperiencePoints) 
    .Select(xpt => xpt.ExperiencePoints) 
    .Min()) - player.ExperiencePoints; 
+0

在這種情況下,我確定這個級別的最高分數?例如,如果玩家有240點,他在3級,在這個級別有40點,並且在這個級別有200個(400-200)點中有40個。 – Dean

+0

工程奇蹟,謝謝Justin。 – Dean

2

可以保持結合每個級別(級別1:0-29,2級:30-99等)的上部包容的列表,並且執行二進制搜索輸入值:

var levels = new int[] 
{ 
    0 - 1, 
    30 + 0 - 1, 
    70 + 30 + 0 - 1, 
    160 + 70 + 30 + 0 - 1, 
    250 + 160 + 70 + 30 + 0 - 1 
}; 

var input = 110; 

var level = Array.BinarySearch(levels, input); 
if (level < 0) 
    level = ~level; 

Console.WriteLine("Level: {0}", level); 
Console.WriteLine("Points: {0}", input - (levels[level - 1] + 1)); 

(未經測試,可能包含的off-by-一個錯誤)

+0

+1:我想到的第一件事情:) – leppie

0

如果表進行排序,然後做一些事情像這樣:

foreach(DataRow row in table.Rows) 
{ 
    if(xp > (int)row["XP"]) 
    { 
     xp -= (int)row["XP"]; 
    } else { 
     Console.WriteLine("Level: " + row["Level"] + " with " + xp + " xp"); 
     break; 
    } 
} 

與任何數據結構你使用