Мой код для обнаружения и подсчета очков 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;
}
}
}
Ваша логика ошибочна. Во-первых, разве dice.length не всегда должно быть 5 в игре на яхтзи? Ограничивая цикл числом i < (dice.length - nnb), вы на самом деле выполняете его только один раз, сравнивая первое значение кубика с другими, что делает цикл ненужным. По этой же причине не учитывается случай, когда значение первого кубика отличается от остальных.
Что делать, если ваш ввод 1,5,1,5,1? Лично я бы использовал другой подход, если вы не подразумеваете, что ваш рулон будет отсортирован перед вызовом этого. В любом случае, что вы подразумеваете под «выход не определен»? Выхода нет нигде.
Да, массив сначала сортируется по убыванию.
@DaveNewton OP, вероятно, делает console.info(score), но поскольку эта переменная никогда не инициализируется значением, а условие if в цикле никогда не выполняется, она возвращает undefined.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Предел вашего цикла отключен на 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;
}
}
Ваши циклы требуют, чтобы одинаковые элементы были последовательными. Вы сортируете массив, прежде чем попасть сюда?