-1

次のような JavaScript コードを書いています。

function rollTrigger() {
var roll = Math.round(Math.random()*999999999+1);
var result = document.getElementById("result");

if (roll <= 50900000) {
    result.innerHTML = "Category 0";
    BoLPamount += 1;
    document.getElementById("boxlesserprizes").innerHTML = "Box of Lesser Prizes " + BoLPamount; 
    log.innerHTML += "<br />Trigger - win = true; Category 0"; //LOG        
} else if (roll <= 900000) {
    result.innerHTML = "Category A";
    log.innerHTML += "<br />Trigger - win = true; Category A"; //LOG
} else if (roll <= 360000) {
    result.innerHTML = "Category B";
    log.innerHTML += "<br />Trigger - win = true; Category B"; //LOG
} else if (roll <= 211890) {
    result.innerHTML = "Category C";
    log.innerHTML += "<br />Trigger - win = true; Category C"; //LOG
} else if (roll <= 109020) {
    result.innerHTML = "Category D";
    log.innerHTML += "<br />Trigger - win = true; Category D"; //LOG
} else if (roll <= 56505) {
    result.innerHTML = "Category E";
    log.innerHTML += "<br />Trigger - win = true; Category E"; //LOG
} else if (roll <= 34888) {
    result.innerHTML = "Category F";
    log.innerHTML += "<br />Trigger - win = true; Category F"; //LOG
} else if (roll <= 15574) {
    result.innerHTML = "Category G";
    log.innerHTML += "<br />Trigger - win = true; Category G"; //LOG
} else {
    result.innerHTML = "MEH";
    log.innerHTML += "<br />Trigger - win = false"; //LOG
};
document.getElementById("roll").innerHTML = roll;

};

しかし、それは正しく機能していません...たとえば、乱数が40200000の場合、想定どおり「カテゴリ0」が表示されますが、乱数が10であっても、「カテゴリG」ではなく「カテゴリ0」が表示されます。何が問題なのですか?

4

3 に答える 3

5

if (roll <= 50900000)
10 は 50900000 より小さいですね。
if ステートメントの順序を逆にすると、すべてがうまくいくはずです。

于 2012-11-23T23:09:25.860 に答える
2

番号 10 では、if (10 <= 50900000) が true であるため、最初の条件に入るからです。

範囲を指定する必要があります。

if(roll > 900000 && roll <= 50900000)

または、より低い条件から最高の条件まで

 if (roll <= 15574) 
 {
    result.innerHTML = "Category F";
    log.innerHTML += "<br />Trigger - win = true; Category F"; //LOG
 }
 else if (roll <= 34888) 
   {
     ...

等々。

于 2012-11-23T23:09:01.600 に答える
2

ifテストが正しい順序になるように、テストを並べ替える必要があります。すべてが を使用している場合は<=、最初に最も低い値と比較し、次に高い値と比較する必要があります。そうしないと、必要以上の数値に一致します。

if/else個人的には、無数のテストではなく、テーブル駆動のアプローチをお勧めします。

var rollTests = [
    {value: 15574, resultHTML: "Category G", logHTML: "<br />Trigger - win = true", logHTML: "Category G"},
    {value: 34888, resultHTML: "Category F", logHTML: "<br />Trigger - win = true", logHTML: "Category F"},
    // the rest of the values here ordered by the comparison value ....
];

for (var i = 0, len = rollTests.length; i < len; i++) {
    if (roll <= rollTests[i].value) {
        result.innerHTML = rollTests[i].resultHTML;
        log.innerHTML = rollTests[i].logHTML;
        break;
    }
}

またはさらにコンパクト:

var rollTests = [
    {value: 15574, category: "G"},
    {value: 34888, category: "F"},
    // the rest of the values here ordered by the comparison value ....
];

var logHTML;    
for (var i = 0, len = rollTests.length; i < len; i++) {
    if (roll <= rollTests[i].value) {
        logHTML = "Category " + rollTests[i].category;
        log.innerHTML = logHTML;
        result.innerHTML = "<br />Trigger - win = true; " + logHTML;
        break;
    }
}
于 2012-11-23T23:10:16.753 に答える