From a81e07a3c47358b0c351bc1914519835a73566cb Mon Sep 17 00:00:00 2001 From: Nhi Tran Date: Fri, 15 Sep 2017 11:13:23 -0400 Subject: [PATCH] Finish week-02-project --- react-fb-tictactoe/package.json | 2 +- react-fb-tictactoe/src/TicTacToe/index.js | 154 +++++++++++++++++++--- 2 files changed, 135 insertions(+), 21 deletions(-) diff --git a/react-fb-tictactoe/package.json b/react-fb-tictactoe/package.json index 8927e3a5..e03acde1 100644 --- a/react-fb-tictactoe/package.json +++ b/react-fb-tictactoe/package.json @@ -13,4 +13,4 @@ "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" } -} \ No newline at end of file +} diff --git a/react-fb-tictactoe/src/TicTacToe/index.js b/react-fb-tictactoe/src/TicTacToe/index.js index 56944d57..5ecbcdbe 100644 --- a/react-fb-tictactoe/src/TicTacToe/index.js +++ b/react-fb-tictactoe/src/TicTacToe/index.js @@ -2,34 +2,48 @@ import React, { Component } from 'react'; import './TicTacToe.css' -/* - * Changes from original tutorial - * - Here we import Component, so we can replace - * class Square extends React.Component - * with - * class Square extends Component - */ -class Square extends Component { - render() { - return ( - +function Square(props){ + return ( + ); - } } class Board extends Component { renderSquare(i) { - return ; + return ( this.props.onClick(i)} + /> + ); } render() { - const status = 'Next player: X'; + /*Another way to fill the board*/ + // const winner = calculateWinner(this.state.squares); + // let status; + // var rows =[]; + // var cells = []; + // var numbers = 0; + // for(var i = 0; i < 3; i++) + // { + // for(var j = 0; j < 3; j++) + // { + // cells.push(this.renderSquare(numbers)); + // numbers++; + // } + // rows.push(
{cells}
) + // cells = []; + // } return ( + /* +
+ {rows} +
+ */
-
{status}
{this.renderSquare(0)} {this.renderSquare(1)} @@ -51,15 +65,88 @@ class Board extends Component { } class Game extends Component { + constructor(){ + super(); + this.state = { + history: [ + { + squares: Array(9).fill(null), + } + ], + stepNumber: 0, + xIsNext: true, + }; + } + + jumpTo(step){ + this.setState({ + stepNumber: step, + xIsNext: (step % 2) === 0 + }); + } + + 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, + }); + } + 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 */}
    -
      {/* todo */}
    +
    {status}
    +
      {moves}
    ); @@ -67,3 +154,30 @@ class Game extends Component { } export default Game; + + +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; +} +