+
+ {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 (
+