(2)
const getBoard = (index: number) => {
setBoard(board.slice(0, index).concat(turn).concat(board.slice(index+1, 9)));
setTurn(turn === 1 ? 0 : 1)
}
const allEqual = (arr: number[]) => arr.includes(2) ? false : arr.every(v => v === arr[0])
const getRow = (r: number) => board.slice(r * 3, (r * 3) + 3);
const getCol: any = (c: number, arr=board) => arr.length <= 3 ? arr[c] : [arr[c]].concat(getCol(c, arr.slice(3)))
const getLeftDiagonal: any = (i: number = 0) =>
i < 3 ? [getRow(i)[i]].concat(getLeftDiagonal(i+1)) : [];
const getRightDiagonal: any = (i: number = 2) =>
i >= 0 ? [getRow(2-i)[i]].concat(getRightDiagonal(i-1)) : [];
const checkHorMatch: any = (rowNum: number = 0) =>
rowNum <= 2 && (allEqual(getRow(rowNum)) ? setWinner(turn === 1 ? 0 : 1) : checkHorMatch(rowNum+1))
const checkVerMatch: any = (colNum: number = 0) =>
colNum <= 2 && (allEqual(getCol(colNum)) ? setWinner(turn === 1 ? 0 : 1) : checkVerMatch(colNum+1))
const checkDiagonalMatch: any = () => {
(allEqual(getLeftDiagonal()) || allEqual(getRightDiagonal())) && setWinner(turn === 1 ? 0 : 1)
}
const endGame = (winner: number) => {
const gameWinner = winner < 2 ? (winner === 1 ? "X" : "O") : "Draw";
// clean up before alerting
setBoard([2,2,2,2,2,2,2,2,2]);
setWinner(2);
gameWinner === "Draw" || gameWinner === "X"
? props.setScoreX(props.scoreX + 1)
: props.setScoreO(props.scoreO + 1)
alert(`WINNER: ${gameWinner}`)
}
useEffect(() => {
checkHorMatch();
checkVerMatch();
checkDiagonalMatch();
winner < 2 && endGame(winner);
board.includes(2) || endGame(2);
})
return (
{
board.map(
(i, index) =>
)
}
);
}
export default Grid;