{"version":3,"sources":["App.js","index.js"],"names":["Fill","EMPTY","X","O","Object","freeze","Game","props","state","current","board","onClick","bind","calcNext","minimax","Math","random","row","floor","col","player","i","empty","j","b","p","JSON","parse","stringify","this","emptyCells","isWinner","outcome","oponent","win","lose","draw","ret","push","length","move","console","log","setState","next","className","React","Component","Square","value","Title","Board","squares","key","App","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.0597a333.chunk.js","sourcesContent":["import React from 'react';\nimport './App.css';\n\nconst App = () => ;\n\nconst Fill = {\n EMPTY: \"\",\n X: \"X\",\n O: \"O\",\n};\n\nObject.freeze(Fill);\n\nconst WIN = 1;\nconst DRAW = 0;\nconst LOSE = -1;\nconst RUNNING = -2;\n\nclass Game extends React.Component {\n\n\tconstructor(props) {\n\t\t\n\t\tsuper(props)\n\t\tthis.state = {\n\t\t\tcurrent: RUNNING,\n\t\t\tboard: [[Fill.EMPTY,Fill.EMPTY,Fill.EMPTY],\n\t\t\t\t\t\t\t[Fill.EMPTY,Fill.EMPTY,Fill.EMPTY],\n\t\t\t\t\t\t\t[Fill.EMPTY,Fill.EMPTY,Fill.EMPTY]]\n\t\t}\n\n\t\tthis.onClick = this.onClick.bind(this);\n\t\tthis.calcNext = this.calcNext.bind(this);\n\t\tthis.minimax = this.minimax.bind(this);\n\n\t\tconst ai = Math.random() < 0.5 ? true : false;\n\n\t\tif(ai) {\n\t\t\tconst row = Math.floor(Math.random() * 3);\n\t\t\tconst col = Math.floor(Math.random() * 3);\n\t\t\tthis.state.board[row][col] = Fill.O;\n\t\t}\n\t}\n\n\tisWinner(board, player) {\n\n\t\tfor(var i=0;i<3;i++) {\n\n\t\t\tif(board[i][0] === player \n\t\t\t\t&& board[i][1] === player \n\t\t\t\t&& board[i][2] === player){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(board[0][i] === player \n\t\t\t\t&& board[1][i] === player \n\t\t\t\t&& board[2][i] === player){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (board[0][0] === player \n\t\t\t&& board[1][1] === player \n\t\t\t&& board[2][2] === player) {\n\t\t\treturn true;\n\t\t}\n\t\tif (board[0][2] === player \n\t\t\t&& board[1][1] === player \n\t\t\t&& board[2][0] === player) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\temptyCells(board) {\n\n\t\tvar empty = 0;\n\t\tfor(let i=0;i<3;i++){\n\t\t\tfor(let j=0;j<3;j++){\n\t\t\t\tif(board[i][j] === Fill.EMPTY) {\n\t\t\t\t\tempty++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn empty;\n\t}\n\n\tminimax(b, p) {\n\n\t\tconst board = JSON.parse(JSON.stringify(b)); \n\t\tconst empty = this.emptyCells(board);\n\n\t\tif(this.isWinner(board, p)) {\n\t\t\treturn {outcome: WIN};\n\t\t}\n\n\t\tconst oponent = p => p === Fill.X ? Fill.O : Fill.X;\n\t\tif(this.isWinner(board, oponent(p))) {\n\t\t\treturn {outcome: LOSE};\n\t\t}\n\n\t\tif(empty === 0) {\n\t\t\treturn {outcome: DRAW};\n\t\t}\n\n\t\tconst win = []\n\t\tconst lose = []\n\t\tconst draw = []\n\n\t\tfor(let i=0;i<3;i++){\n\t\t\tfor(let j=0;j<3;j++){\n\t\t\t\tif(board[i][j] === Fill.EMPTY) {\n\n\t\t\t\t\tboard[i][j] = p;\n\t\t\t\t\tconst ret = this.minimax(board, oponent(p));\n\t\t\t\t\tboard[i][j] = Fill.EMPTY;\n\n\t\t\t\t\tif(ret.outcome === LOSE) win.push({i,j});\n\t\t\t\t\telse if(ret.outcome === WIN) lose.push({i,j});\n\t\t\t\t\telse draw.push({i,j});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(win.length > 0) {\n\t\t\treturn {outcome: WIN, move: win[0]};\n\t\t}\n\t\tif(draw.length > 0) {\n\t\t\treturn {outcome: DRAW, move: draw[0]};\n\t\t}\n\t\treturn {outcome: LOSE, move: lose[0]};\n\t}\n\n\tcalcNext() {\n\n\t\tconst board = this.state.board;\n\t\tconst ret = this.minimax(board, Fill.O);\n\t\tconsole.log(ret);\n\t\treturn ret.move;\n\t}\n\n\tonClick(i,j) {\n\n\t\tif(this.state.current !== RUNNING) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst board = this.state.board;\n\n\t\tif(board[i][j] !== Fill.EMPTY) {\n\t\t\treturn;\n\t\t}\n\n\t\tboard[i][j] = Fill.X;\n\t\tif(this.isWinner(board, Fill.X)) {\n\t\t\tthis.setState({board: board, current:LOSE});\n\t\t\treturn;\n\t\t}\n\t\tif(this.emptyCells(board) === 0) {\n\t\t\tthis.setState({board: board, current:DRAW});\n\t\t\treturn;\n\t\t}\n\n\t\tvar next = this.calcNext();\n\n\t\tboard[next.i][next.j] = Fill.O;\n\t\tif(this.isWinner(board, Fill.O)) {\n\t\t\tthis.setState({board: board, current:WIN});\n\t\t\treturn;\n\t\t}\n\t\tif(this.emptyCells(board) === 0) {\n\t\t\tthis.setState({board: board, current:DRAW});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({board: board});\n\t}\n\n\trender() {\n\t\treturn (\n\t\t\t
\n\t\t\t\t\n\t\t\t\t<Board onClick = {this.onClick} board = {this.state.board} />\n\t\t\t</div>\n\t\t);\n\t}\n};\n\nconst Square = ({onClick, value}) => (\n\n\t<button className = \"square\" onClick = {onClick}>{Fill[value]}</button>\n);\n\nconst Title = ({current}) => (\n\n\t<div className = \"title\">\n\t\t{current === WIN ? \"You lost\" \n\t\t: current === LOSE ? \"Your won\" \n\t\t: current === DRAW ? \"Draw\" : \"Your turn\"}\n\t</div>\n);\n\nconst Board = ({board, onClick}) => {\n\n\tconst squares = []\n\tfor(let i=0;i<3;i++){\n\t\tfor(let j=0;j<3;j++){\n\t\t\tsquares.push(<Square key = {i*3+j} \n\t\t\t\tvalue = {board[i][j]} onClick = {() => onClick(i,j)} />)\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className = \"board\">\n\t\t\t{squares}\n\t\t</div>\n\t);\n};\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n document.getElementById('root')\n);\n\nif (module.hot) { \n\tmodule.hot.accept()\n}\n\n"],"sourceRoot":""}