2016-05-04 33 views
-2

好的,現在我的問題是,不管我做什麼,它只會提供一級信息,而不是我嘗試的指定級別。代碼如下從經驗值中獲取等級 - 不考慮等級

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。

有什麼想法?

+3

此代碼......好痛我的眼睛... – Cristy

+1

嗯....有用的代碼請 –

+4

WOW'XPlevel(XP,級別);'是非常有幫助的! JK,向我們展示您傳遞給函數的值! –

回答

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足夠的第一個水平,這意味着這確實是正確的水平。

作爲一個說明,這可以通過二進制搜索而不是線性搜索來改善,但我認爲這個函數並不經常被調用,所以複雜度足夠好。

此外,爲什麼level都是您的函數的輸入和輸出值?

0

(除了XP的東西...)你基本上在做if level == 1 return 1這是無意義的。
如果你已經知道level比邏輯上你不需要檢查的水平。

最簡單的&最快的方式得到一個level了XP陣列的值

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