游戏体验水平问题

本文关键字:问题 水平 体验 游戏 | 更新日期: 2023-09-27 18:02:35

我有一个关于游戏XP等级的算法问题:

我有一个表格,列出了关卡编号和该关卡中的xp数量:

GameLevel    ExperiencePointsInLevel
1            30
2            70
3            160
4            250

对于每个玩家,我只保留他们的总经验值,而不是任何关卡信息。给定玩家的总经验值,我如何通过算法确定以下内容(我使用c#;LINQ) ?

  1. 当前人员水平
  2. 该人员在该级别中的点数

例如,如果玩家有110个xp,那么答案将是:

  1. 三级
  2. 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;
    }
}

无论你使用什么数据结构