Есть ли другой способ минимизировать мой длинный Javascript, если нужно проверить строки и столбцы в игре suduko?

1

Я занимаюсь javascript и делаю игру судуко. Я нажимаю() некоторые числа внутри массива.

var sudukoNmb = [1,2,3,3,2,1,2,1,3]

и у меня есть это условие, чтобы читать числа по строкам и столбцам, но я думаю, что это не правильный путь.

if(sudukoNmb[0] === sudukoNmb[1] || sudukoNmb[0] === sudukoNmb[2] || sudukoNmb[1] === sudukoNmb[2] ||
  sudukoNmb[0] === sudukoNmb[3] || sudukoNmb[0] === sudukoNmb[6] || sudukoNmb[3] === sudukoNmb[6] ||
  sudukoNmb[1] === sudukoNmb[4] || sudukoNmb[1] === sudukoNmb[7] || sudukoNmb[4] === sudukoNmb[7] ||
  sudukoNmb[3] === sudukoNmb[4] || sudukoNmb[3] === sudukoNmb[5] || sudukoNmb[4] === sudukoNmb[5] ||
  sudukoNmb[6] === sudukoNmb[7] || sudukoNmb[6] === sudukoNmb[8] || sudukoNmb[7] === sudukoNmb[8] ||
  sudukoNmb[2] === sudukoNmb[5] || sudukoNmb[2] === sudukoNmb[8] || sudukoNmb[5] === sudukoNmb[8]) {
  console.log('error')
} else {
  console.log('correct')
}

Есть ли другой способ минимизировать это условие?

Примечание: эти числа на самом деле поступают из индексов строк и столбцов 2D-массива (3x3), отображаемых в 1D-массиве. (sudukoNmb [3] для первой ячейки второго ряда и так далее...)

  • 3
    Да с петлей.
  • 0
    Спасибо за ответ. Да, я пробовал это с петлей. Но я не понимаю, так как у меня также есть 0 == 1; 0 == 2; 0 == 3 и 0 == 6.
Показать ещё 3 комментария
Теги:

3 ответа

1
Лучший ответ

Его относительно трудно понять логику вашего состояния, но я обнаружил, что он сравнивает строки и столбцы 2D-массива (3x3), хранящиеся в 1D-массиве (всего 9 элементов).

Таким образом, массив содержит следующие элементы:

0 1 2
3 4 5
6 7 8

и мы должны проверять каждую строку или столбец так, чтобы они не имели одинаковых значений в каждой горизонтальной или вертикальной линии. Например:

  • первая строка: 0,1,2 => мы проверим: 0,1/0,2/1,2
  • второй ряд: 3,4,5 => мы проверим: 3,4/3,5/4,5
  • третий ряд: 6,7,8 => мы проверим: 6,7/6,8/7,8

поэтому формула для строк: check i,(i+1)/i,(i+2)/(i+1),(i+2)

а также

  • первая колонка: 0, 3, 6 => мы проверим: 0,3/0,6/3,6
  • второй столбец: 1, 4, 7 => мы проверим: 1,4/1,7/4,7
  • третья колонка: 2, 5, 8 => мы проверим: 2,5/2,8/5,8

поэтому формула для строк: check i,(i+3)/i,(i+2*3)/(i+3),(i+2*3)

мы можем объединить обе формулы в один общий:

check i,(i+n) / i,(i+2*n) / (i+n),(i+2*n)

где n - 1 для строк и 3 для столбцов.

следующий код может проверять значения в каждом столбце или строке:

var sudukoNmb = [1,2,3, 4,5,6, 7,5,9];

function checkLine(a, i, n) //a:array, i: first cell index, n: offset to get next cell in row or column
{
	return (a[i]===a[i+n] || a[i]===a[i+2*n] || a[i+n]===a[i+2*n]);
}

var msg = "OK";

for(var j=0; j<2; j++)
{
  //if (checkLine(sudukoNmb, j, 3)) {msg="Error"; break;} //to check columns
  //if (checkLine(sudukoNmb, j*3, 1)) {msg="Error"; break;} //to check rows
  if (checkLine(sudukoNmb, j, 3) || checkLine(sudukoNmb, j*3, 1))
    {msg = "Error"; break;}
}

console.log("Check result is: " + msg);
  • 0
    Это превосходный ответ, потому что он четко объясняет мышление, необходимое для написания решения. Я лично рекомендую удалить теги script из кода, потому что OP не указывает на то, что это выполняется внутри HTML
  • 0
    @slebetman спасибо за ваш комментарий. на самом деле, этот script тег произошел из-за фрагмента кода html-панели stackoverflow ... в любом случае, я перемещаю код на панель js, чтобы удалить его.
0

Предполагается, что девять значений "sudoku box" являются уникальными, поэтому можно было бы использовать класс Set ES6, он сохраняет уникальные значения.

var sudukoNmb = [1,2,3,3,2,1,2,1,3]

if (new Set(sudukoNmb).size === 9) { // Set instance has [1,2,3] only
    console.log('correct')
} else {
    console.log('error')
}
  • 0
    Это не то, что ОП хочет проверить. ваш код вернет false, если каждые 2 ячейки имеют одинаковое значение, но ОП хочет сравнивать ячейки только в строках и столбцах! например, он должен возвращать правильное значение для sudukoNmb = [1,2,3, 4,5,6, 3,8,9] поскольку повторяющиеся 3 не находятся в той же строке или столбце, но ваш код возвращает ошибку!
  • 0
    Эмман Р.: «Я практиковал javascript и создал игру suduko», «эти числа на самом деле взяты из индексов строк и столбцов двумерного массива (3x3), отображенного в одномерный массив», Леон Плата: «Девять значений «Судоку коробки» должны быть уникальными
Показать ещё 2 комментария
0

Попробуй это

var sudukoNmb = [1,2,3,3,2,1,2,1,3],
allow  = [[1,2,3,6], [2,4,7], [5,8], [6,4,5], [7,5], [8], [7,8], [8]];
var f = 0;
allow.forEach(function(v,i){
    v.forEach(function(vv){
        if(sudukoNmb[i] == sudukoNmb[vv]) f=1;
    })
})
if(f) console.log('error')
else console.log('correct')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню