1
- const segmentSize = 5
2
- const margin = 5
3
- const max = 100 - margin - segmentSize
4
- const min = margin
5
-
6
1
const snake = {
7
2
direction : 'left' ,
8
- body : [ ] ,
9
3
length : 5 ,
4
+ segmentSize : 5 ,
10
5
elem : document . querySelector ( '#snake' ) ,
6
+ segments : [ ] ,
11
7
}
12
8
13
- // Initialize snake body
9
+ const game = { margin : 5 }
10
+ game . leftEdge = game . margin
11
+ game . topEdge = game . margin
12
+ game . rightEdge = 100 - snake . segmentSize - game . margin
13
+ game . bottomEdge = 100 - snake . segmentSize - game . margin
14
+
14
15
for ( let i = 0 ; i < snake . length ; i ++ ) {
15
- snake . body . push ( { top : 50 , left : 50 + i * segmentSize } )
16
+ snake . segments . push ( {
17
+ top : 50 ,
18
+ left : 50 + i * snake . segmentSize ,
19
+ elem : snake . elem . children [ i ] ,
20
+ } )
16
21
}
17
22
18
- // Movement logic
19
23
function updateDirection ( ) {
20
- const head = snake . body [ 0 ]
21
- const { top, left, direction } = snake
22
-
23
- if ( snake . direction === 'up' && head . top <= min ) {
24
- snake . direction = 'left'
25
- } else if ( snake . direction === 'left' && head . left <= min ) {
26
- snake . direction = 'down'
27
- } else if ( snake . direction === 'down' && head . top >= max ) {
24
+ const head = snake . segments [ 0 ]
25
+ if ( snake . direction == 'down' && head . top >= game . bottomEdge ) {
28
26
snake . direction = 'right'
29
- } else if ( snake . direction === 'right' && head . left >= max ) {
27
+ } else if ( snake . direction == 'right' && head . left >= game . rightEdge ) {
30
28
snake . direction = 'up'
29
+ } else if ( snake . direction == 'up' && head . top <= game . topEdge ) {
30
+ snake . direction = 'left'
31
+ } else if ( snake . direction == 'left' && head . left <= game . leftEdge ) {
32
+ snake . direction = 'down'
31
33
}
32
34
}
33
35
34
36
function moveSnake ( ) {
35
- const head = { ...snake . body [ 0 ] }
37
+ moveTail ( )
38
+ moveHead ( )
39
+ }
36
40
37
- switch ( snake . direction ) {
38
- case 'up' :
39
- head . top -= segmentSize
40
- break
41
- case 'down' :
42
- head . top += segmentSize
43
- break
44
- case 'left' :
45
- head . left -= segmentSize
46
- break
47
- case 'right' :
48
- head . left += segmentSize
49
- break
41
+ function moveHead ( ) {
42
+ if ( snake . direction == 'left' ) {
43
+ snake . segments [ 0 ] . left = snake . segments [ 0 ] . left - snake . segmentSize
44
+ }
45
+ if ( snake . direction == 'right' ) {
46
+ snake . segments [ 0 ] . left = snake . segments [ 0 ] . left + snake . segmentSize
47
+ }
48
+ if ( snake . direction == 'down' ) {
49
+ snake . segments [ 0 ] . top = snake . segments [ 0 ] . top + snake . segmentSize
50
+ }
51
+ if ( snake . direction == 'up' ) {
52
+ snake . segments [ 0 ] . top = snake . segments [ 0 ] . top - snake . segmentSize
50
53
}
54
+ }
51
55
52
- // Add new head, remove tail
53
- snake . body . unshift ( head )
54
- snake . body . pop ( )
56
+ function moveTail ( ) {
57
+ for ( let i = snake . length - 1 ; i > 0 ; i -- ) {
58
+ const thisSegment = snake . segments [ i ]
59
+ const aheadSegment = snake . segments [ i - 1 ]
60
+ thisSegment . left = aheadSegment . left
61
+ thisSegment . top = aheadSegment . top
62
+ }
55
63
}
56
64
57
65
function renderSnake ( ) {
58
- //log(document.body.children)
59
- //log(game.children)
60
- for ( let i = 0 ; i < snake . body . length ; i ++ ) {
61
- const seg = snake . elem . children [ i ]
62
- const { top, left } = snake . body [ i ]
63
- seg . style . top = `${ top } %`
64
- seg . style . left = `${ left } %`
65
- seg . style . width = `${ segmentSize } %`
66
- seg . style . height = `${ segmentSize } %`
67
- }
66
+ snake . segments . forEach ( ( segment ) => {
67
+ segment . elem . style . left = `${ segment . left } %`
68
+ segment . elem . style . top = `${ segment . top } %`
69
+ } )
68
70
}
69
71
70
72
let loopsRuns = 0
@@ -79,4 +81,5 @@ function gameLoop() {
79
81
requestAnimationFrame ( gameLoop )
80
82
}
81
83
84
+ renderSnake ( )
82
85
requestAnimationFrame ( gameLoop )
0 commit comments