Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Tic Tac Toe水平检查不工作(减少)_Javascript_Node.js - Fatal编程技术网

Javascript Tic Tac Toe水平检查不工作(减少)

Javascript Tic Tac Toe水平检查不工作(减少),javascript,node.js,Javascript,Node.js,我正在做一个井字游戏,我得到了以下代码: let matrix = 3; let moves = [[2,2,2], [1,0,2], [1,0,1]]; let checkWinner = () => { let winner; // Horizontal Check for (let i = 0; i < matrix; i++) { winner = moves[i].reduce(

我正在做一个井字游戏,我得到了以下代码:

let matrix = 3;
let moves = [[2,2,2],
             [1,0,2],
             [1,0,1]];

let checkWinner = () => {
    let winner;

    // Horizontal Check
    for (let i = 0; i < matrix; i++) {
        winner = moves[i].reduce((a, b) => (a === b) ? a : 0);
        if (winner)
            return winner;
    }

    // Vertical Check
    for (let i = 0; i < matrix; i++) {
        winner = moves.reduce((a, b) => {
            return a[i] === b[i] ? a[i] : 0;
        });
        if (winner)
            return winner;
    }
}

let winner = checkWinner();
if (winner) {
    console.log('player '+  winner + ' won the game');
}
let矩阵=3;
let moves=[[2,2,2],
[1,0,2],
[1,0,1]];
让checkWinner=()=>{
让胜利者;
//水平检查
for(设i=0;i(a==b)?a:0);
国际单项体育联合会(优胜者)
返回赢家;
}
//垂直检查
for(设i=0;i{
返回a[i]==b[i]?a[i]:0;
});
国际单项体育联合会(优胜者)
返回赢家;
}
}
让winner=checkWinner();
国际单项体育联合会(优胜者){
log('player'+winner+'winder the game');
}
这里的水平检查有效,但垂直检查无效。从逻辑上讲,垂直检查的代码对我来说是有意义的,它应该可以工作。我认为这与reduce函数有关


有人能告诉我垂直检查出了什么问题,并告诉我如何让它工作吗?

您从传递给
reduce
的函数返回的值成为它的下一个第一个参数,因此您需要返回
a
而不是
a[I]
并检查
if(winner[I])

通过将列转换为与行外观相同的内容,并使用一个函数执行两项检查,这可能会变得更好:

const lineWinner = line =>
    line.reduce((a, b) => a === b ? a : 0);

const checkWinner = () => {
    // Horizontal Check
    for (let i = 0; i < matrix; i++) {
        const line = moves[i];
        const winner = lineWinner(line);
        if (winner)
            return winner;
    }

    // Vertical Check
    for (let i = 0; i < matrix; i++) {
        const line = moves.map(row => row[i]);
        const winner = lineWinner(line);
        if (winner)
            return winner;
    }
};

从传递给
reduce
的函数返回的值将成为它的下一个第一个参数,因此需要返回
a
而不是
a[i]
,并检查
if(winner[i])

通过将列转换为与行外观相同的内容,并使用一个函数执行两项检查,这可能会变得更好:

const lineWinner = line =>
    line.reduce((a, b) => a === b ? a : 0);

const checkWinner = () => {
    // Horizontal Check
    for (let i = 0; i < matrix; i++) {
        const line = moves[i];
        const winner = lineWinner(line);
        if (winner)
            return winner;
    }

    // Vertical Check
    for (let i = 0; i < matrix; i++) {
        const line = moves.map(row => row[i]);
        const winner = lineWinner(line);
        if (winner)
            return winner;
    }
};
const lineWinner = line =>
    line.reduce((a, b) => a === b ? a : 0);

const column = i => moves.map(row => row[i]);

const checkWinner = () =>
    moves.reduce(
        (winner, row, i) =>
            winner ||
            lineWinner(row) ||
            lineWinner(column(i)),
        0);