javascript - 在javascript中获取最后一个总和而不是循环0到n(通过一些简单的计算)
问题描述
我正在编写一个小游戏。用户需要经验才能达到新的水平。
从0级到1级,花费5000xp
从1级到2级,花费5500xp
从2级到3级,花费6000xp ...
现在我想计算特定级别的 exp,可能是 232
我可以通过以下代码得到结果
const calculateXP = (level) => {
let xpNeeded;
let accountXp = 0;
for (let i = 0; i < level; i++) {
xpNeeded = 5000 + (i * 500);
accountXp += xpNeeded;
}
return accountXp;
};
结果是14558000
这是一个丑陋而漫长的解决方案。有没有更短的解决方案?没有从 0 到 N 的循环(我要计算 exp 的级别)?
解决方案
我找到了解决方案 (1)
let level = 232;
let exp = 5000 + (level - 1) * 5000 + (level * (level - 1) / 2) * 500;
console.log(exp);
或者更短的版本(我已经检查过,它适用于我测试过的从 0 到 500000 的所有级别:v)
let exp = 250 * (x * x + 19*x)
从这里的 sumFrom 函数引用
但是如何从 exp 中获得等级,看看这个
const getLevelByExp = (exp) => {
// x^2 + 19x = exp/500
let x1, x2;
let x, y, z, delta;
x = 1;
y = 19;
z = -(exp / 250);
delta = (y * y - 4 * x * z)
x1 = (-y - Math.sqrt(delta)) / (2 * x);
x2 = (-y + Math.sqrt(delta)) / (2 * x);
if (x1 > 0) return x1;
// x2 always bigger than 0
if (x2 > 0) return x2;
}
我已经从(1)中解码了它
您可以通过以下代码测试我的功能
for (let i = 0; i < 20; i++) {
let exp = calculateXP(i);
let decoded = getLevelByExp(exp);
console.log('Level: ' + i, 'Exp: ' + exp, 'Decoded: ' + decoded);
}
输出电平相同
推荐阅读
- r - 如何在 R 的向量中包含变量?
- java - 如何在代码中的确切位置将数据从 firebase 提取到 android studio 中?
- python - 图聚类的 Louvain 算法在 Spark/Scala 和 Python 中运行时给出完全不同的结果,为什么会发生这种情况?
- python - 熊猫如何避免在 groupby nlargest n 中应用
- r - 有没有办法让 RMarkdown 选项卡即使在添加 Shiny 运行时也能显示?
- python - 获取绝对路径时出现问题?
- jquery - 使用Jquery离开ID div时如何清除mousemove
- c - 在 C Windows 控制台中将 ESCAPE 键传递到标准输入缓冲区的问题
- android - 在 Android Studio 项目中包含 OpenCV 会产生“未解决的依赖项”错误
- php - 具有默认内容的条件逻辑和高级自定义字段