-
Notifications
You must be signed in to change notification settings - Fork 2
/
snake.py
93 lines (82 loc) · 2.76 KB
/
snake.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from visuals.cube import *
from display import *
from keyboard import *
import random
import time
key_directions = {
'w': Direction.BACK,
'a': Direction.LEFT,
's': Direction.FRONT,
'd': Direction.RIGHT,
'e': Direction.UP,
'x': Direction.DOWN,
}
class Game:
def __init__(self):
self.snake = [Pos(SIZE // 2, SIZE // 2, 1), Pos(SIZE // 2, SIZE // 2, 0)]
self.make_fruit()
self.direction = Direction.FRONT
def make_fruit(self):
all_positions = [Pos(x, y, z) for x in range(SIZE) for y in range(SIZE) for z in range(SIZE) if Pos(x, y, z) not in self.snake]
if len(all_positions) > 0:
self.fruit = random.choice(all_positions)
else:
self.fruit = None
def draw(self):
c = Cube()
c.set(self.fruit, Colour.red())
c.set(self.snake[0], Colour.white())
for i, p in enumerate(self.snake[1:]):
c.set(p, Colour((0, Colour.brightness - 0.8 * i * (Colour.brightness / (len(self.snake) - 1)), 0)))
return c
def get_next_position(self):
return self.snake[0] + self.direction.value
def can_advance(self):
next_pos = self.get_next_position()
return next_pos.is_in_bounds() and next_pos not in self.snake[:-1]
def advance(self):
self.snake.insert(0, self.get_next_position())
if self.snake[0] == self.fruit:
self.make_fruit()
else:
self.snake = self.snake[0:-1]
def play_game(get_next_move):
with Display() as d:
keyboard = Keyboard()
while True:
game = Game()
# consume any pending keyboard input
keyboard.get_last_char(options = key_directions.keys())
while True:
d.display(game.draw().get_colours())
game.direction = get_next_move(game, keyboard)
if not game.can_advance():
break
game.advance()
if game.fruit is None:
# Nowhere left to place fruit: player wins
break
if game.fruit is None:
print("YOU WIN!")
print("score: " + str(len(game.snake)))
for i in range(5):
d.display(Cube(colour = (Colour.green() if game.fruit is None else Colour.red())).get_colours())
time.sleep(0.1)
d.display(Cube().get_colours())
time.sleep(0.1)
def get_next_move_time_based(game, keyboard):
time.sleep(1)
char = keyboard.get_last_char(options = key_directions.keys())
if char != '':
new_dir = key_directions[char]
if (new_dir.value + game.direction.value) != Pos(0, 0, 0):
return new_dir
return game.direction
def get_next_move_turn_based(game, keyboard):
while True:
char = keyboard.wait_for_char(options = key_directions.keys())
new_dir = key_directions[char]
if (new_dir.value + game.direction.value) != Pos(0, 0, 0):
return new_dir
if __name__ == "__main__":
play_game(get_next_move = get_next_move_turn_based)