Last active 1751739830

a snake game that runs on the Myte playground !

Revision 7edc1d0ca284487a4eac929efd9bcb69d6671202

snake.nv Raw Playground
1| 'INSTRUCTIONS' | ~~
2 you can move using the WASD keys !
3
4|| '@include' (
5 https://gist.casuallyblue.dev/autumn/056799f483464c668e0a6a2d9db099df/raw/HEAD/game.nv
6 https://gist.casuallyblue.dev/autumn/e1c6774f800249be87a94240042135db/raw/HEAD/reduce.nv
7)
8
9'DOM' (<query h2 <style text-align = center > >)
10
11'snake' . head 5 11 . body 4 11 . body 3 11
12'direction' right
13'movement speed' 5
14'timer' 0
15'food' 19 11
16'score' 0
17'cell size' 16
18'grid size' 23
19
20'' start game
21'' set score text
22
23| '' start game 'cell size' $cell? 'grid size' $grid?
24| '' (@reduce @main =
25 start a { $cell $grid * } by { $cell $grid * } game .)
26
27| '' game loop
28| '' check if w is pressed
29 '' check if a is pressed
30 '' check if s is pressed
31 '' check if d is pressed
32 '' check if r is pressed
33 '' update movement timer
34 '' check if snake can eat food
35 '' draw background
36 '' draw snake
37 '' draw food
38 '' check if snake died
39 '' next frame
40
41| 'key pressed' w 'direction' down? |
42| 'key pressed' a 'direction' right? |
43| 'key pressed' s 'direction' up? |
44| 'key pressed' d 'direction' left? |
45| 'key pressed' w 'direction' $_ | 'direction' up
46| 'key pressed' a 'direction' $_ | 'direction' left
47| 'key pressed' s 'direction' $_ | 'direction' down
48| 'key pressed' d 'direction' $_ | 'direction' right
49
50| '' move 'direction' up? | '' move snake 'vector' + 0 - 1
51| '' move 'direction' left? | '' move snake 'vector' - 1 + 0
52| '' move 'direction' down? | '' move snake 'vector' + 0 + 1
53| '' move 'direction' right? | '' move snake 'vector' + 1 + 0
54
55| '' move snake? 'vector' $1 $2 $3 $4 'snake' head $x $y 'grid size' $size?
56| 'new body position' $x $y
57 '' (@reduce seen = head { $x $2 $1 0 $size 1 - wrap }
58 { $y $4 $3 0 $size 1 - wrap } .)
59
60| '' move snake? 'snake' body $x $y 'new body position' $nx $ny
61| 'new body position' $x $y
62 'seen' body $nx $ny
63
64| '' move snake 'new body position' $x $y | '' reset snake
65
66| '' update movement timer 'paused'? |
67| '' update movement timer 'movement speed' $speed? 'timer' $speed
68| '' move 'timer' 0
69
70| '' update movement timer 'timer' $time
71| '' (@reduce timer = { $time 1 + } .)
72
73| '' check if snake can eat food 'snake' head $x $y? 'food' $x $y?
74| '' move food to random location
75 '' extend snake
76 '' increase score
77 '' set score text
78| '' check if snake can eat food |
79
80| '' move food to random location 'food' $x $y 'grid size' $max?
81| '' (@reduce food = { 0 $max random } { 0 $max random } .)
82
83| '' increase score 'score' $score
84| '' (@reduce score = { $score 1 + } .)
85
86| '' set score text 'score' $score?
87| 'DOM' (<query h2 @clear @append [Score: ] @append $score >)
88
89| '' extend snake? 'snake' $segment $x $y | 'seen' $segment $x $y
90| '' extend snake | '' duplicate tail segment
91| '' duplicate tail segment 'seen' $segment $x $y?
92| 'snake' $segment $x $y '' reset snake
93
94| '' check if snake died? 'snake' head $x $y | 'head' $x $y
95| '' check if snake died 'snake' body $x $y 'head' $x $y? |
96 '' . reset snake . replace head . snake died
97| '' check if snake died? 'snake' body $x $y | 'seen' body $x $y
98| '' check if snake died | '' reset snake '' replace head
99| '' replace head 'head' $x $y | 'snake' head $x $y
100
101| '' snake died 'score' $score?
102| 'paused'
103 'DOM' (<query h2 @clear @append
104 [Game over! Press R to restart. Score: ]
105 @append $score
106 >)
107
108| 'key pressed' r 'paused' | '' reset game
109| 'key pressed' r |
110
111| '' reset game? 'seen' $segment $x $y |
112| '' reset game? 'snake' $segment $x $y |
113| '' reset game 'direction' $direction 'food' $x $y 'score' $score
114| 'snake' . head 5 11 . body 4 11 . body 3 11
115 'direction' right
116 'food' 19 11
117 'score' 0 '' set score text
118
119| '' draw background
120| '@graphics' clear #000c0f
121
122| '' draw snake? 'snake' head $x $y 'pixel_position' $px $py 'cell size' $size?
123| '@graphics' draw square $px $py $size #5af7ff
124 'seen' head $x $y
125
126| '' draw snake? 'snake' body $x $y 'pixel_position' $px $py 'cell size' $size?
127| '' (@reduce @graphics = draw square
128 { $px 1 + } { $py 1 + } { $size 2 - } #10b0b0 .)
129 'seen' body $x $y
130
131| '' draw snake? 'snake' $segment $x $y?
132| '' convert $x $y to pixel position
133
134| '' draw snake | '' reset snake
135
136| '' draw food 'pixel_position' $x $y 'cell size' $size?
137| '@graphics' draw circle $x $y $size #f0b050
138| '' draw food? 'food' $x $y?
139| '' convert $x $y to pixel position
140
141| '@graphics' draw square $x $y $size $color '@@canvas context' $c?
142| '@js' $c.fillStyle = $color;
143 $c.fillRect($x, $y, $size, $size);
144
145| '@graphics' draw circle $x $y $width $color '@@canvas context' $c?
146| '@js' $c.beginPath();
147 const r = $width / 2;
148 $c.arc(Number($x) + r, Number($y) + r, r, 0, 2 * Math.PI);
149 $c.fillStyle = $color;
150 $c.fill();
151
152| '' convert $x $y to pixel position 'cell size' $scalar?
153| '' (@reduce pixel_position = { $x $scalar * } { $y $scalar * } .)
154
155| '' reset snake? 'seen' $segment $x $y | 'snake' $segment $x $y
156| '' reset snake |
157