You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

游戏玩家XP对应等级判定逻辑是否有更高效的实现方式?

优化方案

你现有代码的核心问题是把等级配置硬编码到判断逻辑里,不仅冗余度极高,后续新增/修改等级规则需要改动大量业务代码,维护成本很高。下面是高效且易维护的实现方式:

核心思路

将等级配置与业务逻辑完全分离,所有等级的阈值、XP获取规则统一存储,判断等级时直接走通用逻辑,不需要写任何硬编码的XP值判断。

实现代码

第一步:定义等级配置结构体

统一存储单个等级的所有属性:

public struct LevelConfig
{
    public string LevelName; // 等级名称
    public int MinXp; // 该等级所需最小XP
    public int MaxXp; // 该等级所需最大XP
    public int XpGainMin; // 该等级下每次获得XP的最小值
    public int XpGainMax; // 该等级下每次获得XP的最大值
}

第二步:初始化全局等级配置列表

所有等级规则在这里统一配置,后续改规则/加等级只需要修改这个列表:

// 按等级从低到高排序即可
private List<LevelConfig> _levelConfigs = new List<LevelConfig>
{
    new LevelConfig { LevelName = "Rookie", MinXp = 0, MaxXp = 24, XpGainMin = 3, XpGainMax = 10 },
    new LevelConfig { LevelName = "Survivor", MinXp = 25, MaxXp = 30, XpGainMin = 5, XpGainMax = 12 },
    new LevelConfig { LevelName = "Adventurer", MinXp = 31, MaxXp = 40, XpGainMin = 7, XpGainMax = 14 },
    new LevelConfig { LevelName = "Veteran", MinXp = 41, MaxXp = 99, XpGainMin = 0, XpGainMax = 0 } // 可自行补充Veteran的XP获取规则
};

第三步:替换原有业务逻辑

原来的数十行判断可以简化为以下几行通用代码:

// 1. 获取当前等级的配置,增加XP
var currentLevelConfig = _levelConfigs.First(config => config.LevelName == currentLevel);
xp += Random.Range(currentLevelConfig.XpGainMin, currentLevelConfig.XpGainMax);

// 2. 倒序遍历配置,匹配当前XP对应的等级(倒序比正序匹配次数更少,效率更高)
for (int i = _levelConfigs.Count - 1; i >= 0; i--)
{
    var config = _levelConfigs[i];
    if (xp >= config.MinXp && xp <= config.MaxXp)
    {
        currentLevel = config.LevelName;
        break;
    }
}

// 3. 更新UI显示
currentLevelText.text = currentLevel;

优化收益

  • 代码冗余度降低90%,完全消除了逐个判断XP值的冗余逻辑
  • 后续维护成本极低,新增/修改等级规则不需要改动业务逻辑,只需要调整配置列表即可
  • 执行效率更高:等级数量少于20的情况下,倒序遍历的效率远高于你原来的多分支if判断,若等级数量超过50,可以把遍历改成二分查找,时间复杂度直接降到O(logn)

注意事项

如果你的项目用的是不支持Linq的低版本C#,把First方法获取当前等级配置的部分换成普通遍历即可。

内容的提问来源于stack exchange,提问作者Leo Mehta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:36:04