Используя методы slice() и map() как правильно сравнивать элементы массива?
Делаю игру Tic Tac Toe, 5 in a row. Чтобы определить победителя использую методы every(), slice() и map(). С помощью этих методов я сравниваю элементы массива. Условие победы по горизонтали и по вертикали определяется. А по диагонали условие победы не определяется почему то?
//Сохраните выбранные координаты
record = [];
var isWin = false;
//Определим неразмещенное состояние шахматной доски как 0.
function recordArray() {
for(var i = 0; i<num; i++){
var arr = [];
for(var j = 0; j < num; j++){
arr.push(0);
}
record.push(arr);
}
}
recordArray();
//Определите, равны ли соседние 5 чисел, если они равны,
//это означает, что победитель был определен
function isEqual(arr){
return arr.every(val => val === arr[0]);
}
//Определяем, соответствует ли отметка на доске
//условию победы
function isVictory(){
var len = record.length;
for(var i = 0; i < record.length; i++){
for(var j=0; j<record[i].length; j++){
if(record[i][j] !==0 ){
if(j < len && i - 1 < len){
//Определяем горизонтальное направление
if (isEqual(record[i].slice(j, j+5))){
isWin = true;
}
//Оценка вертикального направления
if (isEqual(record.slice(i, i+5).map(arr => arr[j]))){
isWin = true;
}
//Определяем направление о диагонали
if (isEqual(record[i].slice(j, j+5)) && isEqual(record.slice(i, i+5).map(arr => arr[j]))){
isWin = true;
}
}
}
}
}
return isWin;
}
isVictory();
Ответы (1 шт):
Проблема в твоем коде заключается в том, что для диагонального направления ты проверяешь неправильно. Нужно добавить два условия для проверки диагоналей: одну диагональ с левого верхнего угла к правому нижнему и другую — с правого верхнего угла к левому нижнему.
Для лево-направо диагонали проверяем элементы, начиная с позиции (i, j) и двигаясь на один шаг вниз и вправо. Для право-налево диагонали проверяем элементы, начиная с позиции (i, j) и двигаясь на один шаг вниз и влево.
function isVictory() {
var len = record.length;
for (var i = 0; i < len; i++) {
for (var j = 0; j < len; j++) {
if (record[i][j] !== 0) {
// Определяем горизонтальное направление
if (j + 5 <= len && isEqual(record[i].slice(j, j + 5))) {
isWin = true;
}
// Оценка вертикального направления
if (i + 5 <= len && isEqual(record.slice(i, i + 5).map(arr => arr[j]))) {
isWin = true;
}
// Оценка диагонали: слева направо (сверху вниз)
if (i + 5 <= len && j + 5 <= len &&
isEqual(record.slice(i, i + 5).map((arr, idx) => arr[j + idx]))) {
isWin = true;
}
// Оценка диагонали: справа налево (сверху вниз)
if (i + 5 <= len && j - 4 >= 0 &&
isEqual(record.slice(i, i + 5).map((arr, idx) => arr[j - idx]))) {
isWin = true;
}
}
}
}
return isWin;
}