Skip to content

Commit 5d4128c

Browse files
committed
python: readd keyget snake
Otherwise the cli snake is broken Signed-off-by: Daniel Schaefer <[email protected]>
1 parent a6c0258 commit 5d4128c

File tree

7 files changed

+221
-106
lines changed

7 files changed

+221
-106
lines changed

python/inputmodule/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
GameOfLifeStartParam,
1919
GameControlVal,
2020
)
21-
from inputmodule.gui.games import (
21+
from inputmodule.games import (
2222
snake,
2323
snake_embedded,
2424
pong_embedded,

python/inputmodule/games.py

Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
from getkey import getkey, keys
2+
import random
3+
from datetime import datetime, timedelta
4+
import time
5+
import threading
6+
7+
from inputmodule.inputmodule import (
8+
GameControlVal,
9+
send_command,
10+
CommandVals,
11+
Game,
12+
)
13+
from inputmodule.inputmodule.ledmatrix import (
14+
show_string,
15+
WIDTH,
16+
HEIGHT,
17+
render_matrix,
18+
)
19+
20+
# Constants
21+
ARG_UP = 0
22+
ARG_DOWN = 1
23+
ARG_LEFT = 2
24+
ARG_RIGHT = 3
25+
ARG_QUIT = 4
26+
ARG_2LEFT = 5
27+
ARG_2RIGHT = 6
28+
29+
# Variables
30+
direction = None
31+
body = []
32+
33+
34+
def opposite_direction(direction):
35+
if direction == keys.RIGHT:
36+
return keys.LEFT
37+
elif direction == keys.LEFT:
38+
return keys.RIGHT
39+
elif direction == keys.UP:
40+
return keys.DOWN
41+
elif direction == keys.DOWN:
42+
return keys.UP
43+
return direction
44+
45+
46+
47+
def snake_keyscan():
48+
global direction
49+
global body
50+
51+
while True:
52+
current_dir = direction
53+
key = getkey()
54+
if key in [keys.RIGHT, keys.UP, keys.LEFT, keys.DOWN]:
55+
# Don't allow accidental suicide if we have a body
56+
if key == opposite_direction(current_dir) and body:
57+
continue
58+
direction = key
59+
60+
61+
def snake_embedded_keyscan(dev):
62+
while True:
63+
key_arg = None
64+
key = getkey()
65+
if key == keys.UP:
66+
key_arg = GameControlVal.Up
67+
elif key == keys.DOWN:
68+
key_arg = GameControlVal.Down
69+
elif key == keys.LEFT:
70+
key_arg = GameControlVal.Left
71+
elif key == keys.RIGHT:
72+
key_arg = GameControlVal.Right
73+
elif key == "q":
74+
# Quit
75+
key_arg = GameControlVal.Quit
76+
if key_arg is not None:
77+
send_command(dev, CommandVals.GameControl, [key_arg])
78+
79+
80+
def game_over(dev):
81+
global body
82+
while True:
83+
show_string(dev, "GAME ")
84+
time.sleep(0.75)
85+
show_string(dev, "OVER!")
86+
time.sleep(0.75)
87+
score = len(body)
88+
show_string(dev, f"{score:>3} P")
89+
time.sleep(0.75)
90+
91+
92+
def pong_embedded(dev):
93+
# Start game
94+
send_command(dev, CommandVals.StartGame, [Game.Pong])
95+
96+
while True:
97+
key_arg = None
98+
key = getkey()
99+
if key == keys.LEFT:
100+
key_arg = ARG_LEFT
101+
elif key == keys.RIGHT:
102+
key_arg = ARG_RIGHT
103+
elif key == "a":
104+
key_arg = ARG_2LEFT
105+
elif key == "d":
106+
key_arg = ARG_2RIGHT
107+
elif key == "q":
108+
# Quit
109+
key_arg = ARG_QUIT
110+
if key_arg is not None:
111+
send_command(dev, CommandVals.GameControl, [key_arg])
112+
113+
114+
def game_of_life_embedded(dev, arg):
115+
# Start game
116+
# TODO: Add a way to stop it
117+
print("Game", int(arg))
118+
send_command(dev, CommandVals.StartGame, [Game.GameOfLife, int(arg)])
119+
120+
121+
def snake_embedded(dev):
122+
# Start game
123+
send_command(dev, CommandVals.StartGame, [Game.Snake])
124+
125+
snake_embedded_keyscan(dev)
126+
127+
128+
def snake(dev):
129+
global direction
130+
global body
131+
head = (0, 0)
132+
direction = keys.DOWN
133+
food = (0, 0)
134+
while food == head:
135+
food = (random.randint(0, WIDTH - 1), random.randint(0, HEIGHT - 1))
136+
137+
# Setting
138+
WRAP = False
139+
140+
thread = threading.Thread(target=snake_keyscan, args=(), daemon=True)
141+
thread.start()
142+
143+
prev = datetime.now()
144+
while True:
145+
now = datetime.now()
146+
delta = (now - prev) / timedelta(milliseconds=1)
147+
148+
if delta > 200:
149+
prev = now
150+
else:
151+
continue
152+
153+
# Update position
154+
(x, y) = head
155+
oldhead = head
156+
if direction == keys.RIGHT:
157+
head = (x + 1, y)
158+
elif direction == keys.LEFT:
159+
head = (x - 1, y)
160+
elif direction == keys.UP:
161+
head = (x, y - 1)
162+
elif direction == keys.DOWN:
163+
head = (x, y + 1)
164+
165+
# Detect edge condition
166+
(x, y) = head
167+
if head in body:
168+
return game_over(dev)
169+
elif x >= WIDTH or x < 0 or y >= HEIGHT or y < 0:
170+
if WRAP:
171+
if x >= WIDTH:
172+
x = 0
173+
elif x < 0:
174+
x = WIDTH - 1
175+
elif y >= HEIGHT:
176+
y = 0
177+
elif y < 0:
178+
y = HEIGHT - 1
179+
head = (x, y)
180+
else:
181+
return game_over(dev)
182+
elif head == food:
183+
body.insert(0, oldhead)
184+
while food == head:
185+
food = (random.randint(0, WIDTH - 1),
186+
random.randint(0, HEIGHT - 1))
187+
elif body:
188+
body.pop()
189+
body.insert(0, oldhead)
190+
191+
# Draw on screen
192+
matrix = [[0 for _ in range(HEIGHT)] for _ in range(WIDTH)]
193+
matrix[x][y] = 1
194+
matrix[food[0]][food[1]] = 1
195+
for bodypart in body:
196+
(x, y) = bodypart
197+
matrix[x][y] = 1
198+
render_matrix(dev, matrix)
199+
200+
201+
def wpm_demo(dev):
202+
"""Capture keypresses and calculate the WPM of the last 10 seconds
203+
TODO: I'm not sure my calculation is right."""
204+
start = datetime.now()
205+
keypresses = []
206+
while True:
207+
_ = getkey()
208+
209+
now = datetime.now()
210+
keypresses = [x for x in keypresses if (now - x).total_seconds() < 10]
211+
keypresses.append(now)
212+
# Word is five letters
213+
wpm = (len(keypresses) / 5) * 6
214+
215+
total_time = (now - start).total_seconds()
216+
if total_time < 10:
217+
wpm = wpm / (total_time / 10)
218+
219+
show_string(dev, " " + str(int(wpm)))

python/inputmodule/gui/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@
1616
Game,
1717
GameControlVal
1818
)
19-
from inputmodule.gui.games import snake
20-
from inputmodule.gui.games import ledris
19+
from inputmodule.gui.pygames import snake, ledris
2120
from inputmodule.gui.ledmatrix import countdown, random_eq, clock
2221
from inputmodule.gui.gui_threading import stop_thread, is_dev_disconnected
2322
from inputmodule.inputmodule.ledmatrix import (

python/inputmodule/gui/games/__init__.py

Lines changed: 0 additions & 103 deletions
This file was deleted.

python/inputmodule/gui/pygames/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)