首页 > 解决方案 > 在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 的级别)?

标签: javascriptloops

解决方案


我找到了解决方案 (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);
}

输出电平相同


推荐阅读