游戏体验等级问题

时间:2011-07-13 12:01:28

标签: c# linq-to-sql

我有一个与游戏中XP级别相关的算法问题:

我有一个表格,列出了该级别的级别编号和XP数量:

GameLevel    ExperiencePointsInLevel
1            30
2            70
3            160
4            250

对于每个玩家,我只保留他们的总XP,而不是任何等级信息。 给定玩家的总XP,如何通过算法确定以下内容(我使用的是C#和LINQ)?

  1. 目前的人员水平
  2. 此人拥有此级别的数字
  3. 例如,如果玩家有110个XP,答案是:

    1. 等级3
    2. 10个XP; (110-30-70 = 10)
    3. 有什么想法吗?

      干杯,

      迪安

3 个答案:

答案 0 :(得分: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));

(未经测试;可能包含逐个错误)

答案 1 :(得分:2)

如果级别中的经验值被更改为代表玩家需要达到该级别的总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;

答案 2 :(得分: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;
    }
}

与您正在使用的任何数据结构相同的想法