游戏体验水平问题
本文关键字:问题 水平 体验 游戏 | 更新日期: 2023-09-27 18:02:35
我有一个关于游戏XP等级的算法问题:
我有一个表格,列出了关卡编号和该关卡中的xp数量:
GameLevel ExperiencePointsInLevel
1 30
2 70
3 160
4 250
对于每个玩家,我只保留他们的总经验值,而不是任何关卡信息。给定玩家的总经验值,我如何通过算法确定以下内容(我使用c#;LINQ) ?
- 当前人员水平
- 该人员在该级别中的点数
例如,如果玩家有110个xp,那么答案将是:
- 三级
- 10 XPs;(110-30-70 = 10)
任何想法?
欢呼,院长
如果关卡中的经验值被改变为代表玩家达到该关卡所需的总经验值,
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();
我认为这简化了解决方案,避免了为查找生成数组。
Edit:固定检查小于或等于level。
要找出玩家需要多少经验才能到达下一个关卡,你可以使用类似的LINQ查询。
var xpToNextLevel = (ExperiencePointsTable
.Where(xpt => xpt.ExperiencePointsInLevel > player.ExperiencePoints)
.Select(xpt => xpt.ExperiencePoints)
.Min()) - player.ExperiencePoints;
您可以保留每个级别(级别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));
(未测试;
如果表已排序,则执行如下操作:
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;
}
}
无论你使用什么数据结构