From 926395257bba7110ce5cb4abdb595deb6628e4ac Mon Sep 17 00:00:00 2001 From: Robin Wieruch Date: Sat, 2 Sep 2017 17:03:26 +0200 Subject: [PATCH] part 05 --- src/App.css | 4 ++++ src/App.js | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/App.css b/src/App.css index e5a8aae..31c5386 100644 --- a/src/App.css +++ b/src/App.css @@ -34,4 +34,8 @@ .grid-cell-snack { background-color: blue; +} + +.grid-cell-hit { + background-color: red; } \ No newline at end of file diff --git a/src/App.js b/src/App.js index 5ba1bce..3cfcbd7 100644 --- a/src/App.js +++ b/src/App.js @@ -56,16 +56,29 @@ const getSnakeHead = (snake) => const getSnakeWithoutStub = (snake) => snake.coordinates.slice(0, snake.coordinates.length - 1); +const getSnakeTail = (snake) => + snake.coordinates.slice(1); + +const getIsSnakeOutside = (snake) => + getSnakeHead(snake).x >= GRID_SIZE || + getSnakeHead(snake).y >= GRID_SIZE || + getSnakeHead(snake).x <= 0 || + getSnakeHead(snake).y <= 0; + +const getIsSnakeClumy = (snake) => + isSnake(getSnakeHead(snake).x, getSnakeHead(snake).y, getSnakeTail(snake)); + const getIsSnakeEating = ({ snake, snack }) => isPosition(getSnakeHead(snake).x, getSnakeHead(snake).y, snack.coordinate.x, snack.coordinate.y); -const getCellCs = (snake, snack, x, y) => +const getCellCs = (isGameOver, snake, snack, x, y) => cs( 'grid-cell', { 'grid-cell-border': isBorder(x, y), 'grid-cell-snake': isSnake(x, y, snake.coordinates), 'grid-cell-snack': isPosition(x, y, snack.coordinate.x, snack.coordinate.y), + 'grid-cell-hit': isGameOver && isPosition(x, y, getSnakeHead(snake).x, getSnakeHead(snake).y), } ); @@ -95,6 +108,12 @@ const applySnakePosition = (prevState) => { }; }; +const applyGameOver = (prevState) => ({ + playground: { + isGameOver: true + }, +}); + const doChangeDirection = (direction) => () => ({ playground: { direction, @@ -108,6 +127,7 @@ class App extends Component { this.state = { playground: { direction: DIRECTIONS.RIGHT, + isGameOver: false, }, snake: { coordinates: [getRandomCoordinate()], @@ -137,13 +157,16 @@ class App extends Component { } onTick = () => { - this.setState(applySnakePosition); + getIsSnakeOutside(this.state.snake) || getIsSnakeClumy(this.state.snake) + ? this.setState(applyGameOver) + : this.setState(applySnakePosition); } render() { const { snake, snack, + playground, } = this.state; return ( @@ -152,13 +175,14 @@ class App extends Component { ); } } -const Grid = ({ snake, snack }) => +const Grid = ({ isGameOver, snake, snack }) =>
{GRID.map(y => key={y} snake={snake} snack={snack} + isGameOver={isGameOver} /> )}
-const Row = ({ snake, snack, y }) => +const Row = ({ isGameOver, snake, snack, y }) =>
{GRID.map(x => key={x} snake={snake} snack={snack} + isGameOver={isGameOver} /> )}
-const Cell = ({ snake, snack, x, y }) => -
+const Cell = ({ isGameOver, snake, snack, x, y }) => +
export default App; \ No newline at end of file