@@ -32,6 +32,12 @@ const DIRECTION_TICKS = {
32
32
LEFT : ( x , y ) => ( { x : x - 1 , y } ) ,
33
33
} ;
34
34
35
+ const getIsGameOver = ( state ) =>
36
+ state . playground . isGameOver ;
37
+
38
+ const getIsAllowedToChangeDirection = ( state , e ) =>
39
+ ! getIsGameOver ( state ) && KEY_CODES_MAPPER [ e . keyCode ] ;
40
+
35
41
const getRandomCoordinate = ( ) =>
36
42
( {
37
43
x : Math . floor ( Math . random ( ) * GRID_SIZE ) ,
@@ -51,14 +57,31 @@ const isSnake = (x, y, snakeCoordinates) => {
51
57
return false ;
52
58
} ;
53
59
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
+
54
77
// TODO compose instead: direction ticks
55
78
// TODO make last a previous compose step
56
79
const applySnakePosition = ( prevState ) => {
57
80
const isSnakeEating = getIsSnakeEating ( prevState ) ;
58
81
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 ,
62
85
) ;
63
86
64
87
// TODO babel stage
@@ -81,22 +104,29 @@ const applySnakePosition = (prevState) => {
81
104
} ;
82
105
} ;
83
106
84
- const getIsSnakeEating = ( { snake, snack } ) =>
85
- isPosition ( snake . coordinates [ 0 ] . x , snake . coordinates [ 0 ] . y , snack . coordinate . x , snack . coordinate . y ) ;
86
-
87
107
const doChangeDirection = ( direction ) => ( ) => ( {
88
- controls : {
108
+ playground : {
89
109
direction,
90
110
} ,
91
111
} ) ;
92
112
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
+
93
122
class App extends Component {
94
123
constructor ( props ) {
95
124
super ( props ) ;
96
125
97
126
this . state = {
98
- controls : {
127
+ playground : {
99
128
direction : CONTROLS . RIGHT ,
129
+ isGameOver : false ,
100
130
} ,
101
131
snake : {
102
132
coordinates : [ getRandomCoordinate ( ) ] ,
@@ -120,11 +150,15 @@ class App extends Component {
120
150
}
121
151
122
152
onTick = ( ) => {
153
+ if ( getIsSnakeOutside ( this . state . snake ) || getIsSnakeClumy ( this . state . snake ) ) {
154
+ return ;
155
+ }
156
+
123
157
this . setState ( applySnakePosition ) ;
124
158
}
125
159
126
160
onChangeDirection = ( e ) => {
127
- if ( KEY_CODES_MAPPER [ e . keyCode ] ) {
161
+ if ( getIsAllowedToChangeDirection ( this . state , e ) ) {
128
162
this . setState ( doChangeDirection ( KEY_CODES_MAPPER [ e . keyCode ] ) ) ;
129
163
}
130
164
}
@@ -164,6 +198,6 @@ const Row = ({ snake, snack, y }) =>
164
198
</ div >
165
199
166
200
const Cell = ( { snake, snack, x, y } ) =>
167
- < div className = { getCellCs ( sname , snack , x , y ) } /> ;
201
+ < div className = { getCellCs ( snake , snack , x , y ) } /> ;
168
202
169
203
export default App ;
0 commit comments