从经验值获得等级 - 不考虑等级

时间:2016-05-04 18:19:34

标签: javascript

好的,现在我的问题是无论我做什么,它只会将信息显示为1级而不是我尝试的指定级别。代码如下

function XPlevel(XP, level) {
    if((XP >= 0 && XP < 300) && level === 1) {
        level = 1;
    } else if ((XP >= 300 && XP <900) || level === 2) {
        level = 2;
    } else if ((XP >= 900 && XP <2700) || level ===3) {
        level = 3;
    } else if ((XP >= 2700 && XP < 6500) || level === 4){
        level = 4;
    } else if ((XP >= 6500 & XP < 14000) || level === 5){
        level = 5;
    } else if ((XP >= 14000 && XP < 23000) || level === 6) {
        level = 6;
    } else if ((XP >= 23000 && XP < 34000) || level === 7) {
        level = 7;
    } else if ((XP >= 34000 && XP < 48000) || level === 8) {
        level = 8;
    } else if ((XP >= 48000 && XP < 64000) || level === 9) {
        level = 9;
    } else if ((XP >= 64000 && XP < 85000) || level === 10) {
        level = 10;
    } else if ((XP >= 85000 && XP < 100000) || level === 11) {
        level = 11;
    } else if ((XP >= 100000 && XP < 120000) || level === 12) {
        level = 12;
    } else if ((XP >= 120000 && XP < 140000) || level === 13) {
        level = 13;
    } else if ((XP >= 140000 && XP < 165000) || level === 14) {
        level = 14;
    } else if ((XP >= 165000 && XP < 195000) || level === 15) {
        level = 15;
    } else if ((XP >= 195000 && XP < 225000) || level === 16) {
        level = 16;
    } else if ((XP >= 225000 && XP < 265000) || level === 17) {
        level = 17;
    } else if ((XP >= 265000 && XP < 305000) || level === 18) {
        level = 18;
    } else if ((XP >= 305000 && XP < 355000) || level === 19) {
        level = 19;
    } else {
        level = 20;
    }

    return level;
}

XPlevel(XP, level);

因此,当我插入一个等级为5的角色时,它会让我回到1级。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

首先,永远不要这样的代码,永远不要有多个if-else语句,这些语句可以使用数行或哈希表在几行中进行语义相似的检查。

您的功能可以像这样重写:

var xp_required = [0, 300, 900, 2700, 6500]; // ...etc, you fill this table with the XP required to be at Level = index + 1 (indices start at 0 in Arrays).
 // XP for level:  1   2    3    4     5  ...
function getLevel(xp) {
   for(var level = xp_required.length - 1; level >= 0; --level) {
     if(xp >= xp_required[level] {
        return level + 1; // The +1 is needed because Array's index starts at 0 but levels start at 1
     }
   }
   console.log("XP value can not be negative. The given value was: " + xp);
   return 0;
}

for循环从最高级别开始,检查XP是否足以让玩家被视为该级别。如果不是,则表示玩家实际上是较低级别,因此递减要检查的级别值(直到我们达到索引0,这意味着级别1)。这意味着一旦我们达到XP足够的第一级,就意味着它确实是正确的级别。

作为一个注释,这可以通过二进制搜索而不是线性搜索来改进,但我认为通常不会调用此函数,因此O(max_level)复杂度足够好。

另外,为什么level都是函数的输入和输出值?

答案 1 :(得分:0)

(除了XP的东西......)你基本上做if level == 1 return 1这是荒谬的 如果您已经知道level而不是逻辑,则无需检查级别。

最简单的&amp; 从XP数组中获取level的最快方法

function getLevel(XP) {
  var LV = 0;
  [0, 300, 900, 2700, 6500, 14000].some(function(v, i) {
    LV = i;        // Level = index
    return v > XP; // We have the LV value! Break out of loop (if condition is met)!
  });
  return LV;
}

使用

var level = getLevel(2699);  // 3

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some