经验值计算系统

一个基于JavaScript的经验值计算系统,提供完整的等级、经验值转换功能,适用于游戏开发和其他需要经验值系统的应用场景。

系统概述

经验值计算系统(ExpCalculator)是一个独立的类,负责处理游戏中角色或实体的经验值和等级计算逻辑。 该系统基于原始代码中的经验值计算公式,提供了完整的经验值与等级之间的转换功能。

核心特性

  • 经验值到等级的转换计算
  • 等级到经验值的转换计算
  • 当前等级进度计算
  • 升级所需经验值计算
  • 可配置的经验值系数

API文档

构造函数 ExpCalculator(coefLevelExp = 100)
创建一个新的经验值计算器实例
参数 类型 默认值 描述
coefLevelExp Number 100 等级经验系数,影响升级所需经验值的增长速度
expToLevel(exp)
根据经验值计算对应的等级
参数 类型 描述
exp Number 总经验值

返回值:Number - 对应的等级

// 计算公式: level = floor((-1 + sqrt(1 + 4 * (exp / coefLevelExp))) / 2)
levelToExp(level)
计算达到指定等级所需的总经验值
参数 类型 描述
level Number 目标等级

返回值:Number - 所需的总经验值

// 计算公式: exp = level * (level + 1) * coefLevelExp
getCurrentLevelExp(level)
获取当前等级的起始经验值
参数 类型 描述
level Number 当前等级

返回值:Number - 当前等级的起始经验值

getNextLevelExp(level)
获取下一级所需的总经验值
参数 类型 描述
level Number 当前等级

返回值:Number - 下一级所需的总经验值

getLevelExpRange(level)
获取当前等级所需的经验值范围(从当前等级到下一级)
参数 类型 描述
level Number 当前等级

返回值:Number - 当前等级到下一级所需的经验值

getExpProgress(exp, level)
计算当前经验值在当前等级中的进度比例(0-1之间)
参数 类型 描述
exp Number 当前总经验值
level Number 当前等级(可选,如果不提供则自动计算)

返回值:Number - 当前等级的经验值进度比例(0-1)

getExpToNextLevel(exp, level)
计算升级所需的剩余经验值
参数 类型 描述
exp Number 当前总经验值
level Number 当前等级(可选,如果不提供则自动计算)

返回值:Number - 升级所需的剩余经验值

实现代码

/**
 * 经验值计算系统
 * 负责处理经验值和等级之间的转换计算
 */
class ExpCalculator {
    /**
     * 创建一个新的经验值计算器实例
     * @param {number} coefLevelExp - 等级经验系数,默认值为100
     */
    constructor(coefLevelExp = 100) {
        this.coefLevelExp = coefLevelExp;
    }

    /**
     * 根据经验值计算对应的等级
     * @param {number} exp - 总经验值
     * @return {number} 对应的等级
     */
    expToLevel(exp) {
        return Math.floor((-1 + Math.sqrt(1 + 4 * (exp / this.coefLevelExp))) / 2);
    }

    /**
     * 计算达到指定等级所需的总经验值
     * @param {number} level - 目标等级
     * @return {number} 所需的总经验值
     */
    levelToExp(level) {
        return level * (level + 1) * this.coefLevelExp;
    }

    /**
     * 获取当前等级的起始经验值
     * @param {number} level - 当前等级
     * @return {number} 当前等级的起始经验值
     */
    getCurrentLevelExp(level) {
        return this.levelToExp(level);
    }

    /**
     * 获取下一级所需的总经验值
     * @param {number} level - 当前等级
     * @return {number} 下一级所需的总经验值
     */
    getNextLevelExp(level) {
        return this.levelToExp(level + 1);
    }

    /**
     * 获取当前等级所需的经验值范围(从当前等级到下一级)
     * @param {number} level - 当前等级
     * @return {number} 当前等级到下一级所需的经验值
     */
    getLevelExpRange(level) {
        return this.getNextLevelExp(level) - this.getCurrentLevelExp(level);
    }

    /**
     * 计算当前经验值在当前等级中的进度比例(0-1之间)
     * @param {number} exp - 当前总经验值
     * @param {number} [level] - 当前等级(可选,如果不提供则自动计算)
     * @return {number} 当前等级的经验值进度比例(0-1)
     */
    getExpProgress(exp, level) {
        if (level === undefined) {
            level = this.expToLevel(exp);
        }
        
        const currentLevelExp = this.getCurrentLevelExp(level);
        const nextLevelExp = this.getNextLevelExp(level);
        const levelExpRange = nextLevelExp - currentLevelExp;
        
        if (levelExpRange === 0) return 0;
        
        return (exp - currentLevelExp) / levelExpRange;
    }

    /**
     * 计算升级所需的剩余经验值
     * @param {number} exp - 当前总经验值
     * @param {number} [level] - 当前等级(可选,如果不提供则自动计算)
     * @return {number} 升级所需的剩余经验值
     */
    getExpToNextLevel(exp, level) {
        if (level === undefined) {
            level = this.expToLevel(exp);
        }
        
        return this.getNextLevelExp(level) - exp;
    }
}

使用示例

// 创建经验值计算器实例,使用默认系数100
const calculator = new ExpCalculator();

// 计算经验值对应的等级
const level = calculator.expToLevel(5000);
console.log(`5000经验值对应的等级是: ${level}`); // 输出: 5000经验值对应的等级是: 6

// 计算达到指定等级所需的经验值
const expNeeded = calculator.levelToExp(10);
console.log(`达到10级需要的经验值: ${expNeeded}`); // 输出: 达到10级需要的经验值: 11000

// 计算当前经验值在当前等级中的进度
const progress = calculator.getExpProgress(5500);
console.log(`当前等级进度: ${(progress * 100).toFixed(2)}%`); // 输出: 当前等级进度: 50.00%

// 计算升级所需的剩余经验值
const expToNext = calculator.getExpToNextLevel(5500);
console.log(`升级还需要: ${expToNext}经验值`); // 输出: 升级还需要: 500经验值

// 创建使用自定义系数的计算器
const customCalculator = new ExpCalculator(200);
const customLevel = customCalculator.expToLevel(5000);
console.log(`使用系数200时,5000经验值对应的等级是: ${customLevel}`); // 输出: 使用系数200时,5000经验值对应的等级是: 4

交互式计算器

参数设置

计算结果

当前等级: 6
当前等级起始经验: 4200
下一级所需经验: 5600
当前等级经验范围: 1400
升级还需经验: 600
等级进度 57.14%

经验值曲线