From 89ffd511000413257a54b276a23b1a931d0b22e2 Mon Sep 17 00:00:00 2001 From: MikunoNaka Date: Wed, 21 Jul 2021 23:51:04 +0530 Subject: implemented basic checking winner/draw in multiplayer --- src/server/index.js | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/src/server/index.js b/src/server/index.js index f8b5ca7..31af8c4 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -4,16 +4,104 @@ const http = require('http').Server(app); const path = require('path'); const io = require('socket.io')(http); -app.use(express.static(path.join(__dirname, '../../build'))); +const allEqual = (arr) => + arr.includes(2) ? false : arr.every(i => i === arr[0]) + +const getRow = (board, r) => board.slice(r * 3, (r * 3) + 3); +const getRows = (board, r = 0) => + r <= 2 ? [getRow(board, r)].concat(getRows(board, r+1)) : getRow(board, r) + +const getCol = (board, c) => board.map((i) => i[c]) +const getCols = (rows, c = 0) => + c < 2 ? [getCol(rows, c)].concat(getCols(rows, c+1)) : [getCol(rows, c)] + +const getLeftDiagonal = (board, i = 0) => + i < 3 ? [getRow(board, i)[i]].concat(getLeftDiagonal(board, i+1)) : []; + +const getRightDiagonal = (board, i = 2) => + i >= 0 ? [getRow(board, 2-i)[i]].concat(getRightDiagonal(board, i-1)) : []; + +// const endGame = (winner: number) => { +// const gameWinner = winner < 2 ? (winner === 1 ? "X" : "O") : "Draw"; +// props.setMessage(`WINNER: ${gameWinner}`); +// props.setShowMessage(true); +// gameWinner === "Draw" || (gameWinner === "X" +// ? props.setScoreX(props.scoreX + 1) +// : props.setScoreO(props.scoreO + 1)); +// setBoard([2,2,2,2,2,2,2,2,2]); +// winner < 2 && props.setTurn(winner); // set turn to prev. winner +// } +// +// useEffect(() => { +// if (board.includes(0) || board.includes(1)) { +// const rows = getRows(); +// (rows.some((i: number[]) => allEqual(i)) +// || getCols(rows).some((i: number[]) => allEqual(i)) +// || [getLeftDiagonal(), getRightDiagonal()].some((i) => allEqual(i)) +// ) ? endGame(turn === 0 ? 1 : 0) : (board.includes(2) || endGame(2)); +// } +// }); io.on('connection', (socket) => { socket.on('update-remote-board', (board) => { + if (board.includes(0) || board.includes(1)) { + const rows = getRows(board); + (rows.some((i) => allEqual(i)) + || getCols(rows).some((i) => allEqual(i)) + || [getLeftDiagonal(board), getRightDiagonal(board)].some((i) => allEqual(i)) + ) ? console.log("win") : (board.includes(2) || console.log("maybe draw")) + // ? endGame(turn === 0 ? 1 : 0) : (board.includes(2) || endGame(2)); + } io.emit('update-client-board', board) }) }); +// serve static front end +app.use(express.static(path.join(__dirname, '../../build'))); + // Start the server const PORT = process.env.PORT || 5000; http.listen(PORT, () => { console.log(`App listening on port ${PORT}`); }); + + +/* + * const allEqual = (arr: number[]) => + arr.includes(2) ? false : arr.every(i => i === arr[0]) + + const getRow = (r: number) => board.slice(r * 3, (r * 3) + 3); + const getRows: any = (r: number = 0) => + r <= 2 ? [getRow(r)].concat(getRows(r+1)) : getRow(r) + + const getCol = (arr: number[][], c: number) => arr.map((i: any) => i[c]) + const getCols: any = (rows: number[][], c: number = 0) => + c < 2 ? [getCol(rows, c)].concat(getCols(rows, c+1)) : [getCol(rows, c)] + + 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 endGame = (winner: number) => { + const gameWinner = winner < 2 ? (winner === 1 ? "X" : "O") : "Draw"; + props.setMessage(`WINNER: ${gameWinner}`); + props.setShowMessage(true); + gameWinner === "Draw" || (gameWinner === "X" + ? props.setScoreX(props.scoreX + 1) + : props.setScoreO(props.scoreO + 1)); + setBoard([2,2,2,2,2,2,2,2,2]); + winner < 2 && props.setTurn(winner); // set turn to prev. winner + } + + useEffect(() => { + if (board.includes(0) || board.includes(1)) { + const rows = getRows(); + (rows.some((i: number[]) => allEqual(i)) + || getCols(rows).some((i: number[]) => allEqual(i)) + || [getLeftDiagonal(), getRightDiagonal()].some((i) => allEqual(i)) + ) ? endGame(turn === 0 ? 1 : 0) : (board.includes(2) || endGame(2)); + } + }); + */ -- cgit v1.2.3