From 7e645538c2d895caf3e26ab32aa33c972e47516d Mon Sep 17 00:00:00 2001 From: Vish Misir Date: Sun, 17 Sep 2017 14:55:00 -0400 Subject: [PATCH] Implement tic-tac-toe game --- react-fb-tictactoe/src/TicTacToe/index.js | 74 +++++++++++++++++++---- 1 file changed, 63 insertions(+), 11 deletions(-) diff --git a/react-fb-tictactoe/src/TicTacToe/index.js b/react-fb-tictactoe/src/TicTacToe/index.js index 56944d57..06b10441 100644 --- a/react-fb-tictactoe/src/TicTacToe/index.js +++ b/react-fb-tictactoe/src/TicTacToe/index.js @@ -1,7 +1,6 @@ import React, { Component } from 'react'; import './TicTacToe.css' - /* * Changes from original tutorial * - Here we import Component, so we can replace @@ -9,23 +8,55 @@ import './TicTacToe.css' * with * class Square extends Component */ -class Square extends Component { - render() { - return ( - - ); - } + +/* The Square component renders a single + ); } +/* The Board component renders 9 squares */ class Board extends Component { + constructor() { + super(); + this.state = { + squares: Array(9).fill(null), + xIsNext: true, + }; + } + + handleClick(i) { + const squares = this.state.squares.slice(); + if (calculateWinner(squares) || squares[i]) { + return; + } + squares[i] = this.state.xIsNext ? 'X' : 'O'; + this.setState({ + squares: squares, + xIsNext: !this.state.xIsNext, + }); + } + renderSquare(i) { - return ; + return ( + this.handleClick(i)} + /> + ); } render() { - const status = 'Next player: X'; + const winner = calculateWinner(this.state.squares); + let status; + if (winner) { + status = 'Winner: ' + winner; + } else { + status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O'); + } return (
@@ -50,6 +81,7 @@ class Board extends Component { } } +/* The Game component renders a board with some placeholders */ class Game extends Component { render() { return ( @@ -67,3 +99,23 @@ 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; +}