首页 > 解决方案 > yahtzee 的threeofakind 和fourofakind 函数

问题描述

我在我的 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;
            }
        }
    }

标签: javascript

解决方案


循环的限制是 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;
    }
}

推荐阅读