From 64cbab59dd9719817908c835056e1a95821ca509 Mon Sep 17 00:00:00 2001 From: Shelly Huang Date: Fri, 15 Sep 2017 16:53:52 -0400 Subject: [PATCH] adjusted index.js to make game work --- react-fb-tictactoe/src/index.js | 146 ++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/react-fb-tictactoe/src/index.js b/react-fb-tictactoe/src/index.js index fae3e350..aa469914 100644 --- a/react-fb-tictactoe/src/index.js +++ b/react-fb-tictactoe/src/index.js @@ -6,3 +6,149 @@ import registerServiceWorker from './registerServiceWorker'; ReactDOM.render(, document.getElementById('root')); registerServiceWorker(); + +function Square(props){ + return( + + ); +} + +class Board extends React.Component { + renderSquare(i) { + return ( + this.props.onClick(i)} + /> + ); + } + + render() { + return ( +
+
+ {this.renderSquare(0)} + {this.renderSquare(1)} + {this.renderSquare(2)} +
+
+ {this.renderSquare(3)} + {this.renderSquare(4)} + {this.renderSquare(5)} +
+
+ {this.renderSquare(6)} + {this.renderSquare(7)} + {this.renderSquare(8)} +
+
+ ); + } +} + +class Game extends React.Component { + constructor(){ + super(); + this.state = { + history: [{ + squares: Array(9).fill(null), + }], + stepNumber: 0, + xIsNext: true, + }; + } + + handleClick (i){ + const history = this.state.history.slice(0, this.state.stepNumber +1); + const current = history[history.length - 1]; + const squares = current.squares.slice(); + if(calculateWinner(squares) || squares[i]){ + return; + } + squares[i] = this.state.xIsNext ? 'X' : 'O'; + this.setState({ + history: history.concat([{ + squares: squares, + }]), + stepNumber: history.length, + xIsNext: !this.state.xIsNext, + }); + } + + jumpTo(step){ + this.setState({ + stepNumber: step, + xIsNext: (step%2) === 0, + }); + } + + render() { + const history = this.state.history; + const current = history[this.state.stepNumber]; + const winner = calculateWinner(current.squares); + + const moves = history.map((step, move) => { + const desc = move ? + 'Move #' + move : + 'Game start'; + return ( +
  • + this.jumpTo(move)}>{desc} +
  • + + ); + }); + + + let status; + if(winner){ + status = 'Winner: ' + winner; + }else{ + status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O'); + } + + return ( +
    +
    + this.handleClick(i)} + /> +
    +
    +
    {status}
    +
      {moves}
    +
    +
    + ); + } +} + +// ======================================== + +function calculateWinner(squares){ + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for(let i = 0; i < lines.length; ++i){ + const[a, b, c] = lines[i]; + if(squares[a] && squares[a] === squares[b] && squares[a] === squares[c]){ + return squares[a]; + } + } + return null; +} + +ReactDOM.render( + , + document.getElementById('root') +);