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

角色生成器:基于XP计算技能评分的代码优化需求

问题分析

原代码的核心问题有两个:

  1. 循环逻辑错误:getScoreFromXPCalc的循环判断条件存在缺陷,当剩余XP大于当前等级值时就盲目升级,导致处理小数XP(因1.5倍乘数产生)时返回错误评分,比如calcXP=2.5时错误返回2,实际应返回1。
  2. 效率低下:循环迭代的方式在处理大数值XP时会产生大量计算,影响性能。
优化方案

利用评分与基础XP的数学关系(三角数公式)直接计算,替代循环逻辑,同时保留正确的乘数应用规则。

数学原理

技能评分n对应的基础总XP需求是三角数:
$$S(n) = \frac{n(n+1)}{2}$$
我们需要找到最大的n,使得$S(n) ≤ \text{calcXP}$(其中$\text{calcXP} = \text{用户输入XP} × 1.5$,因为1.5倍乘数的作用是降低购买所需XP,即用户实际花费的XP = 基础XP / 1.5 → 基础XP = 用户XP × 1.5)。

通过解二次不等式推导可得:
$$n = \lfloor \frac{-1 + \sqrt{1 + 8×\text{calcXP}}}{2} \rfloor$$
其中$\lfloor x \rfloor$表示对x向下取整,确保返回的是当前XP能达到的最高评分。

优化后的代码

getScoreFromXP(xp: number): number {
    const xpMultiplier: number = 1.5;
    // 处理XP为0或负数的边界情况
    if (xp <= 0) return 0;
    const calcXP: number = xp * xpMultiplier;
    return this.getScoreFromXPCalc(calcXP);
}

getScoreFromXPCalc(calcXP: number): number {
    // 计算二次方程的正根
    const root = (-1 + Math.sqrt(1 + 8 * calcXP)) / 2;
    // 向下取整得到有效最高评分
    return Math.floor(root);
}

验证示例

  • 基础无乘数情况:输入10 XP → calcXP=10 → 计算得root=4 → 返回4,符合需求;输入105 XP → root=14 → 返回14,正确。
  • 1.5倍乘数情况:输入2 XP → calcXP=3 → root=2 → 返回2,匹配示例;输入14 XP(对应评分6的实际花费)→ calcXP=21 → root=6 → 返回6,正确。
  • 小数XP情况:输入43.67 XP → calcXP=65.5 → root≈10.96 → 向下取整为10,符合“未达到评分11所需基础XP(66)”的规则。

内容的提问来源于stack exchange,提问作者Dusk Childer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:25:25