Skip to content

Commit 67ca2fd

Browse files
committed
Update snake example
1 parent ce613cb commit 67ca2fd

File tree

2 files changed

+55
-45
lines changed

2 files changed

+55
-45
lines changed

bootcamp_content/projects/snake/exercises/slithery-snake/example.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,16 @@ body {
88
background: rgb(141, 175, 76);
99
position: relative;
1010

11+
#snake {
12+
position: absolute;
13+
inset: 0;
14+
}
15+
1116
.snake-segment {
1217
position: absolute;
1318
background: black;
1419
border: 2px solid rgb(141, 175, 76);
20+
width: 5%;
21+
height: 5%;
1522
}
1623
}
Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,72 @@
1-
const segmentSize = 5
2-
const margin = 5
3-
const max = 100 - margin - segmentSize
4-
const min = margin
5-
61
const snake = {
72
direction: 'left',
8-
body: [],
93
length: 5,
4+
segmentSize: 5,
105
elem: document.querySelector('#snake'),
6+
segments: [],
117
}
128

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+
1415
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+
})
1621
}
1722

18-
// Movement logic
1923
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) {
2826
snake.direction = 'right'
29-
} else if (snake.direction === 'right' && head.left >= max) {
27+
} else if (snake.direction == 'right' && head.left >= game.rightEdge) {
3028
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'
3133
}
3234
}
3335

3436
function moveSnake() {
35-
const head = { ...snake.body[0] }
37+
moveTail()
38+
moveHead()
39+
}
3640

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
5053
}
54+
}
5155

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+
}
5563
}
5664

5765
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+
})
6870
}
6971

7072
let loopsRuns = 0
@@ -79,4 +81,5 @@ function gameLoop() {
7981
requestAnimationFrame(gameLoop)
8082
}
8183

84+
renderSnake()
8285
requestAnimationFrame(gameLoop)

0 commit comments

Comments
 (0)