@@ -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+
3541const 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
5679const 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-
87107const 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+
93122class 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
166200const Cell = ( { snake, snack, x, y } ) =>
167- < div className = { getCellCs ( sname , snack , x , y ) } /> ;
201+ < div className = { getCellCs ( snake , snack , x , y ) } /> ;
168202
169203export default App ;
0 commit comments