游戏玩家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
相关产品推荐
相关产品推荐

