Skip to content
This repository was archived by the owner on Mar 8, 2022. It is now read-only.

Commit fcf4e61

Browse files
author
Ethan
committed
Add and control snake
1 parent 2bf7380 commit fcf4e61

File tree

3 files changed

+88
-6
lines changed

3 files changed

+88
-6
lines changed

snek/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
from .sprites import *
77
from .ui import *
88
from .scenes import *
9+
from .snek import Snek
910
from .client import Client

snek/scenes.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -78,26 +78,26 @@ def draw(self):
7878

7979

8080
class MainScene(Scene):
81-
__slots__ = Scene.__slots__ + ("background", "apple")
81+
__slots__ = Scene.__slots__ + ("background", "apple", "snek")
8282

8383
def __init__(self, client):
8484
super().__init__(client)
8585
self.background = snek.Sprite(pg.image.load("./assets/backgrounds/board.png").convert(), 0, 0)
8686
self.apple = snek.AppleSprite(pg.image.load("./assets/sprites/apple.png").convert_alpha())
87+
self.snek = snek.Snek(pg.image.load("./assets/sprites/snekpart.png").convert_alpha())
8788

8889
def handle_events(self, events):
8990
for event in events:
9091
if event.type == pg.KEYDOWN:
91-
self.apple.teleport()
92-
events.remove(event)
92+
self.snek.change_direction(event.key)
9393
return events
9494

9595
def update(self, delta):
9696
self.timer += delta
97-
98-
if self.timer % 1 < 0.002:
99-
self.apple.teleport()
97+
self.snek.move(delta)
10098

10199
def draw(self):
102100
# self.wnd.blit(self.background)
103101
self.wnd.blit(self.apple)
102+
for part in self.snek.body:
103+
self.wnd.blit(part)

snek/snek.py

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
from collections import deque
2+
from enum import Enum
3+
4+
import pygame as pg
5+
6+
import snek
7+
8+
9+
class Direction(Enum):
10+
UP = 0
11+
DOWN = 1
12+
LEFT = 2
13+
RIGHT = 3
14+
15+
16+
DIRECTION_MAPPING = {
17+
pg.K_UP: (Direction.UP, Direction.DOWN),
18+
pg.K_DOWN: (Direction.DOWN, Direction.UP),
19+
pg.K_LEFT: (Direction.LEFT, Direction.RIGHT),
20+
pg.K_RIGHT: (Direction.RIGHT, Direction.LEFT),
21+
}
22+
23+
24+
class Snek:
25+
__slots__ = ("part", "body", "maxlen", "direction", "speed", "movement_delay", "direction_changed")
26+
27+
def __init__(self, part):
28+
self.part = part
29+
30+
w = self.part.get_width()
31+
h = self.part.get_height()
32+
x = round((snek.WINDOW_WIDTH / 2) / w) * w
33+
y = round((snek.WINDOW_HEIGHT / 2) / h) * h
34+
35+
self.body = deque(
36+
[snek.Sprite(self.part, x, y), snek.Sprite(self.part, x - w, y)]
37+
)
38+
self.maxlen = 2
39+
self.direction = Direction.RIGHT
40+
self.speed = 10
41+
self.movement_delay = 0.
42+
self.direction_changed = False
43+
44+
@property
45+
def movement_interval(self):
46+
return 1 / self.speed
47+
48+
def change_direction(self, key):
49+
if not self.direction_changed:
50+
for k, (d, o) in DIRECTION_MAPPING.items():
51+
if key == k:
52+
if self.direction != o:
53+
self.direction = d
54+
self.direction_changed = True
55+
break
56+
57+
def shift(self, x, y):
58+
self.body.appendleft(snek.Sprite(self.part, x, y))
59+
if len(self.body) > self.maxlen:
60+
self.body.pop()
61+
62+
def extend(self):
63+
self.maxlen += 1
64+
self.speed += 1
65+
66+
def move(self, delta):
67+
if self.movement_delay < self.movement_interval:
68+
self.movement_delay += delta
69+
return
70+
71+
head = self.body[0]
72+
movement = [
73+
(head.x, head.y - head.h),
74+
(head.x, head.y + head.h),
75+
(head.x - head.w, head.y),
76+
(head.x + head.w, head.y)
77+
][self.direction.value]
78+
79+
self.shift(*movement)
80+
self.movement_delay = 0
81+
self.direction_changed = False

0 commit comments

Comments
 (0)