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);