2016-05-04 5 views
-2

今、私の問題は私が何をしても、私が試した指定レベルの代わりにレベル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が返されます。

どのような考えですか?

+3

のようにこのコードを使用します。

する最も簡単な&最速の方法は、XPの配列のうちlevel値取得します私の目... – Cristy

+1

うーん....便利なコードをお願いします –

+4

WOW 'XPlevel(XP、レベル); 'は非常に有用です! JK、関数に渡している値を見せてください! –

答えて

3

まず、このようなコードは絶対に使用しないでください。複数の行の配列やハッシュテーブルを使って意味的に類似したチェックを行うステートメントを複数記述しないでください。

あなたの関数は次のように書き換えることができます:プレイヤーがそのレベルと見なされるためにXPが十分であれば

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ループが最高レベルをチェックから始まります。そうでなければ、プレーヤーが実際にはより低いレベルであることを意味し、したがって、レベル1を意味するインデックス0に達するまで、チェックされるレベル値を減少させます。これは、XPが十分に満足する最初のレベルに達すると、実際に正しいレベルであることを意味します。

これは、リニア検索の代わりにバイナリ検索を行うことで改善される可能性がありますが、この機能が頻繁に呼び出されないと仮定して、O(max_level)の複雑さは十分です。

また、levelはあなたの関数の入力値と出力値の両方ですか?

0

(XPのものの横に...)あなたは基本的にはif level == 1 return 1です。これは無意味です。
論理的には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

関連する問題