@@ -3,13 +3,35 @@ import cs from 'classnames';
3
3
4
4
import './App.css' ;
5
5
6
+ const TICK_RATE = 100 ;
6
7
const GRID_SIZE = 35 ;
7
8
const GRID = [ ] ;
8
9
9
10
for ( let i = 0 ; i <= GRID_SIZE ; i ++ ) {
10
11
GRID . push ( i ) ;
11
12
}
12
13
14
+ const DIRECTIONS = {
15
+ UP : 'UP' ,
16
+ BOTTOM : 'BOTTOM' ,
17
+ RIGHT : 'RIGHT' ,
18
+ LEFT : 'LEFT' ,
19
+ } ;
20
+
21
+ const DIRECTION_TICKS = {
22
+ UP : ( x , y ) => ( { x, y : y - 1 } ) ,
23
+ BOTTOM : ( x , y ) => ( { x, y : y + 1 } ) ,
24
+ RIGHT : ( x , y ) => ( { x : x + 1 , y } ) ,
25
+ LEFT : ( x , y ) => ( { x : x - 1 , y } ) ,
26
+ } ;
27
+
28
+ const KEY_CODES_MAPPER = {
29
+ 38 : 'UP' ,
30
+ 39 : 'RIGHT' ,
31
+ 37 : 'LEFT' ,
32
+ 40 : 'BOTTOM' ,
33
+ } ;
34
+
13
35
const isBorder = ( x , y ) =>
14
36
x === 0 || y === 0 || x === GRID_SIZE || y === GRID_SIZE ;
15
37
@@ -26,11 +48,31 @@ const getCellCs = (snake, snack, x, y) =>
26
48
}
27
49
) ;
28
50
51
+ const applySnakePosition = ( prevState ) => {
52
+ const directionFn = DIRECTION_TICKS [ prevState . playground . direction ] ;
53
+ const coordinate = directionFn ( prevState . snake . coordinate . x , prevState . snake . coordinate . y ) ;
54
+
55
+ return {
56
+ snake : {
57
+ coordinate,
58
+ } ,
59
+ } ;
60
+ } ;
61
+
62
+ const doChangeDirection = ( direction ) => ( ) => ( {
63
+ playground : {
64
+ direction,
65
+ } ,
66
+ } ) ;
67
+
29
68
class App extends Component {
30
69
constructor ( props ) {
31
70
super ( props ) ;
32
71
33
72
this . state = {
73
+ playground : {
74
+ direction : DIRECTIONS . RIGHT ,
75
+ } ,
34
76
snake : {
35
77
coordinate : {
36
78
x : 20 ,
@@ -46,6 +88,28 @@ class App extends Component {
46
88
} ;
47
89
}
48
90
91
+ componentDidMount ( ) {
92
+ this . interval = setInterval ( this . onTick , TICK_RATE ) ;
93
+
94
+ window . addEventListener ( 'keyup' , this . onChangeDirection , false ) ;
95
+ }
96
+
97
+ componentWillUnmount ( ) {
98
+ clearInterval ( this . interval ) ;
99
+
100
+ window . removeEventListener ( 'keyup' , this . onChangeDirection , false ) ;
101
+ }
102
+
103
+ onChangeDirection = ( event ) => {
104
+ if ( KEY_CODES_MAPPER [ event . keyCode ] ) {
105
+ this . setState ( doChangeDirection ( KEY_CODES_MAPPER [ event . keyCode ] ) ) ;
106
+ }
107
+ }
108
+
109
+ onTick = ( ) => {
110
+ this . setState ( applySnakePosition ) ;
111
+ }
112
+
49
113
render ( ) {
50
114
const {
51
115
snake,
0 commit comments