Используя методы 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 шт):

Автор решения: Owlly

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

Для лево-направо диагонали проверяем элементы, начиная с позиции (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;
}
→ Ссылка