一个基于JavaScript的经验值计算系统,提供完整的等级、经验值转换功能,适用于游戏开发和其他需要经验值系统的应用场景。
经验值计算系统(ExpCalculator)是一个独立的类,负责处理游戏中角色或实体的经验值和等级计算逻辑。 该系统基于原始代码中的经验值计算公式,提供了完整的经验值与等级之间的转换功能。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| coefLevelExp | Number | 100 | 等级经验系数,影响升级所需经验值的增长速度 |
| 参数 | 类型 | 描述 |
|---|---|---|
| exp | Number | 总经验值 |
返回值:Number - 对应的等级
// 计算公式: level = floor((-1 + sqrt(1 + 4 * (exp / coefLevelExp))) / 2)
| 参数 | 类型 | 描述 |
|---|---|---|
| level | Number | 目标等级 |
返回值:Number - 所需的总经验值
// 计算公式: exp = level * (level + 1) * coefLevelExp
| 参数 | 类型 | 描述 |
|---|---|---|
| level | Number | 当前等级 |
返回值:Number - 当前等级的起始经验值
| 参数 | 类型 | 描述 |
|---|---|---|
| level | Number | 当前等级 |
返回值:Number - 下一级所需的总经验值
| 参数 | 类型 | 描述 |
|---|---|---|
| level | Number | 当前等级 |
返回值:Number - 当前等级到下一级所需的经验值
| 参数 | 类型 | 描述 |
|---|---|---|
| exp | Number | 当前总经验值 |
| level | Number | 当前等级(可选,如果不提供则自动计算) |
返回值:Number - 当前等级的经验值进度比例(0-1)
| 参数 | 类型 | 描述 |
|---|---|---|
| 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