Skip to content

Commit 3f2a7c8

Browse files
committed
dont allow snake to go out of the grid
1 parent 856d76e commit 3f2a7c8

File tree

1 file changed

+44
-10
lines changed

1 file changed

+44
-10
lines changed

src/App.js

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ const DIRECTION_TICKS = {
3232
LEFT: (x, y) => ({ x: x - 1, y }),
3333
};
3434

35+
const getIsGameOver = (state) =>
36+
state.playground.isGameOver;
37+
38+
const getIsAllowedToChangeDirection = (state, e) =>
39+
!getIsGameOver(state) && KEY_CODES_MAPPER[e.keyCode];
40+
3541
const getRandomCoordinate = () =>
3642
({
3743
x: Math.floor(Math.random() * GRID_SIZE),
@@ -51,14 +57,31 @@ const isSnake = (x, y, snakeCoordinates) => {
5157
return false;
5258
};
5359

60+
const getSnakeHead = (snake) =>
61+
snake.coordinates[0];
62+
63+
// apply FP
64+
const getIsSnakeOutside = (snake) =>
65+
getSnakeHead(snake).x >= GRID_SIZE ||
66+
getSnakeHead(snake).y >= GRID_SIZE ||
67+
getSnakeHead(snake).x < 0 ||
68+
getSnakeHead(snake).y < 0;
69+
70+
const getIsSnakeClumy = (snake) =>
71+
false;
72+
73+
// apply FP
74+
const getIsSnakeEating = ({ snake, snack }) =>
75+
isPosition(getSnakeHead(snake).x, getSnakeHead(snake).y, snack.coordinate.x, snack.coordinate.y);
76+
5477
// TODO compose instead: direction ticks
5578
// TODO make last a previous compose step
5679
const applySnakePosition = (prevState) => {
5780
const isSnakeEating = getIsSnakeEating(prevState);
5881

59-
const snakeHead = DIRECTION_TICKS[prevState.controls.direction](
60-
prevState.snake.coordinates[0].x,
61-
prevState.snake.coordinates[0].y,
82+
const snakeHead = DIRECTION_TICKS[prevState.playground.direction](
83+
getSnakeHead(prevState.snake).x,
84+
getSnakeHead(prevState.snake).y,
6285
);
6386

6487
// TODO babel stage
@@ -81,22 +104,29 @@ const applySnakePosition = (prevState) => {
81104
};
82105
};
83106

84-
const getIsSnakeEating = ({ snake, snack }) =>
85-
isPosition(snake.coordinates[0].x, snake.coordinates[0].y, snack.coordinate.x, snack.coordinate.y);
86-
87107
const doChangeDirection = (direction) => () => ({
88-
controls: {
108+
playground: {
89109
direction,
90110
},
91111
});
92112

113+
const getCellCs = (snake, snack, x, y) =>
114+
cs(
115+
'grid-cell',
116+
{
117+
'grid-cell-snake': isSnake(x, y, snake.coordinates),
118+
'grid-cell-snack': isPosition(x, y, snack.coordinate.x, snack.coordinate.y),
119+
}
120+
);
121+
93122
class App extends Component {
94123
constructor(props) {
95124
super(props);
96125

97126
this.state = {
98-
controls: {
127+
playground: {
99128
direction: CONTROLS.RIGHT,
129+
isGameOver: false,
100130
},
101131
snake: {
102132
coordinates: [getRandomCoordinate()],
@@ -120,11 +150,15 @@ class App extends Component {
120150
}
121151

122152
onTick = () => {
153+
if (getIsSnakeOutside(this.state.snake) || getIsSnakeClumy(this.state.snake)) {
154+
return;
155+
}
156+
123157
this.setState(applySnakePosition);
124158
}
125159

126160
onChangeDirection = (e) => {
127-
if (KEY_CODES_MAPPER[e.keyCode]) {
161+
if (getIsAllowedToChangeDirection(this.state, e)) {
128162
this.setState(doChangeDirection(KEY_CODES_MAPPER[e.keyCode]));
129163
}
130164
}
@@ -164,6 +198,6 @@ const Row = ({ snake, snack, y }) =>
164198
</div>
165199

166200
const Cell = ({ snake, snack, x, y }) =>
167-
<div className={getCellCs(sname, snack, x, y)} />;
201+
<div className={getCellCs(snake, snack, x, y)} />;
168202

169203
export default App;

0 commit comments

Comments
 (0)