我对board.reduce((a,e,i)感到困惑。到目前为止,我在循环内执行四个循环,以检查是否有人在我的井字游戏中拥有自己的游戏。但是此功能看起来很小,而且很难理解。可以对这一点进行澄清:checkwin()函数。此外,该对象是否将gameWon返回为Array类型的对象。此外,该语句的工作原理是:for(让winCombos [gameWon.index]的索引)
对象值:squareID是{0、1、2、3、4、5、6、7、8,}之一 玩家是A或B board是[0,1,2,3,4,5,6,7,8]的数组
function turn(squareId, player) {
origBoard[squareId] = player;
document.getElementById(squareId).innerHTML = player;
let gameWon = checkWin(origBoard, player);
if (gameWon) gameOver(gameWon);
checkTie();
}
function checkWin(board, player) {
let plays = board.reduce((a, e, i) => (e === player) ? a.concat(i) : a, []);
let gameWon = null;
for (let [index, win] of winCombos.entries()) {
if (win.every(elem => plays.indexOf(elem) > -1)) {
gameWon = {index: index, player: player};
break;
}
}
return gameWon;
}
function gameOver(gameWon){
for (let index of winCombos[gameWon.index]) {
document.getElementById(index).style.backgroundColor =
gameWon.player === huPlayer ? "blue" : "red";
}
for (let i=0; i < cells.length; i++) {
cells[i].removeEventListener('click', turnClick, false);
}
declareWinner(gameWon.player === huPlayer ? "You win!" : "You lose");
}
答案 0 :(得分:1)
for (let [index, win] of winCombos.entries()) {
if (win.every(elem => plays.indexOf(elem) > -1)) {
gameWon = {index: index, player: player};
break;
}
我在理解这部分时遇到了一些麻烦,尤其是带有 if 条件的部分
答案 1 :(得分:0)
let plays = board.reduce((a, e, i) => (e === player) ? a.concat(i) : a, [])
与
相同let results = [];
for (let i = 0; i < board.length; i++) {
const e = board[i];
if (e === player) {
results = results.concat(i);
}
}
let plays = result;
Reduce接受一个数组并将一个函数应用于每个元素以给出结果,这与具有更好的变量名的reduce相同
board.reduce((result, item, index) => (item === player) ? result.concat(index) : result, [])
[]是空的起始结果数组,结果是前一次迭代的结果,item是数组中的当前项目,而index是数组中的当前索引。每次迭代我们都返回结果,或者如果当前是播放器,则我们将其合并。
答案 2 :(得分:0)
此处是同一函数,但更改了一些名称并添加了空格以提高可读性:
function checkWin(board, playerSymbol) {
let plays = board.reduce((accumulator, position, index) => {
if (position === playerSymbol) { // i.e. the X or O player claimed the square
return accumulator.concat(index);
}
return accumulator;
}, []);
let gameWon = null;
for (let [index, win] of winCombos.entries()) {
if (win.every(elem => plays.indexOf(elem) > -1)) {
gameWon = {index: index, player: player};
break;
}
}
return gameWon;
}
此处的主要见解是您将电路板视为二维的。但这不是必须的:您可以将3x3网格表示为长度为9的数组,并执行index % 3
来获取行。比嵌套循环快得多。
因此plays
变量只是一个表示3x3板的数组长度9,而reduce会创建一个由玩家声明的每个正方形的数组。然后,它会根据一系列已知的获胜组合(例如[1,2,3],[1,5,9],[3,5,7] ...)进行核对,以查看玩家是否赢得了比赛。>