yahtzee的threeofakind和fourofakind函数

时间:2019-05-07 17:48:45

标签: javascript

我的yahtzee游戏中用于检测ThreeOfAKind和fourOfAKind并对其进行评分的代码仅在某些时间有效。如果我将数组[5,1,1,1,1]输入到fourOfAKind循环中,则输出将处于未定义状态,我无法弄清原因。这是我的代码:

    //threeOfAKind
    if(nnb==3){
        for(i = 0; i < (dice.length - nnb); i++){
            if((dice[i] == dice[i+1]) 
            && (dice[i] == dice[i+2])){
                score = dice[i]*nnb;
            }
        }
    }
    //fourOfAKind
    else if(nnb==4){
        for(i = 0; i < (dice.length - nnb); i++){
            if((dice[i] == dice[i+1]) 
            && (dice[i] == dice[i+2])
            && (dice[i] == dice[i+3])){
                score = dice[i]*nnb;
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

您的循环数限制为1,应该为dice.length - nnb + 1,也可以将条件更改为<=。例如。如果您要查找3种,则需要检查从0、1和2开始的范围;自5-3 = 2起,您需要在循环中包含i = 2

一旦发现满足条件,就应该跳出循环。

    //threeOfAKind
    if(nnb==3){
        for(i = 0; i <= (dice.length - nnb); i++){
            if((dice[i] == dice[i+1]) 
            && (dice[i] == dice[i+2])){
                score = dice[i]*nnb;
                break;
            }
        }
    }
    //fourOfAKind
    else if(nnb==4){
        for(i = 0; i <= (dice.length - nnb); i++){
            if((dice[i] == dice[i+1]) 
            && (dice[i] == dice[i+2])
            && (dice[i] == dice[i+3])){
                score = dice[i]*nnb;
                break;
            }
        }
    }

您可以将其概括为适用于任何nnb值的单个循环,因此您不必对索引进行硬编码。

for (let i = 0; i <= dice.length - nnb; i++) {
    let first = dice[i];
    let matched = true;
    for (let j = 1; j < nnb; j++) {
        if (dice[i+j] != first) {
            matched = false;
            break;
        }
    }
    if (matched) {
        score = first * nnb;
        break;
    }
}