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