我有一个与游戏中XP级别相关的算法问题:
我有一个表格,列出了该级别的级别编号和XP数量:
GameLevel ExperiencePointsInLevel
1 30
2 70
3 160
4 250
对于每个玩家,我只保留他们的总XP,而不是任何等级信息。 给定玩家的总XP,如何通过算法确定以下内容(我使用的是C#和LINQ)?
例如,如果玩家有110个XP,答案是:
有什么想法吗?
干杯,
迪安
答案 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;
}
}
与您正在使用的任何数据结构相同的想法