Skip to content

Commit 0075f68

Browse files
committed
Initial commit
0 parents  commit 0075f68

File tree

5 files changed

+233
-0
lines changed

5 files changed

+233
-0
lines changed

boom.wav

25.3 KB
Binary file not shown.

game.py

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
import ugame
2+
import stage
3+
import random
4+
import time
5+
6+
import board
7+
import audioio
8+
9+
10+
class Ship(stage.Sprite):
11+
def __init__(self):
12+
super().__init__(tiles, 4, 56, 102)
13+
self.dx = 0
14+
self.x = 56
15+
self.tick = 0
16+
self.dead = False
17+
18+
def update(self):
19+
super().update()
20+
self.tick = not self.tick
21+
22+
keys = ugame.buttons.get_pressed()
23+
self.set_frame(4, 0 if self.tick else 4)
24+
if keys & ugame.K_RIGHT:
25+
self.dx = min(self.dx + 1, 4)
26+
self.set_frame(5, 0)
27+
elif keys & ugame.K_LEFT:
28+
self.dx = max(self.dx - 1, -4)
29+
self.set_frame(5, 4)
30+
else:
31+
self.dx = self.dx // 2
32+
if keys & ugame.K_X:
33+
if missile.y <= -16:
34+
missile.move(self.x, self.y)
35+
sound.play(pew_sound)
36+
elif missile1.y <= 16:
37+
missile1.move(self.x, self.y)
38+
sound.play(pew_sound)
39+
elif missile2.y <= 16:
40+
missile2.move(self.x, self.y)
41+
sound.play(pew_sound)
42+
if keys & ugame.K_O:
43+
pause(" Pause...")
44+
self.x = max(min(self.x + self.dx, 112), 0)
45+
self.move(self.x, self.y)
46+
47+
48+
class Saucer(stage.Sprite):
49+
def __init__(self):
50+
super().__init__(tiles, 9, 0, 0)
51+
self.tick = 0
52+
self.dx = 4
53+
54+
def update(self):
55+
super().update()
56+
self.tick = (self.tick + 1) % 6
57+
self.layer.frame(9, 0 if self.tick >= 3 else 4)
58+
if self.x >= 128 or self.x <= -16:
59+
self.dx = -self.dx
60+
self.move(self.x + self.dx, self.y)
61+
if abs(self.x - ship.x) < 4 and bomb.y >= 128:
62+
bomb.move(self.x, self.y)
63+
64+
65+
class Bomb(stage.Sprite):
66+
def __init__(self):
67+
super().__init__(tiles, 6, 0, 128)
68+
self.boom = 0
69+
70+
def update(self):
71+
super().update()
72+
if self.y >= 128:
73+
return
74+
if self.boom:
75+
if self.boom == 1:
76+
sound.play(boom_sound)
77+
self.set_frame(12 + self.boom, 0)
78+
self.boom += 1
79+
if self.boom > 4:
80+
self.boom = 0
81+
ship.dead = True
82+
self.move(self.x, 128)
83+
return
84+
self.move(self.x, self.y + 8)
85+
self.set_frame(6, 0 if self.y % 16 else 4)
86+
if stage.collide(self.x + 4, self.y + 4, self.x + 12, self.y + 12,
87+
ship.x + 4, ship.y + 4, ship.x + 12, ship.y + 12):
88+
self.boom = 1
89+
90+
91+
class Missile(stage.Sprite):
92+
def __init__(self, power):
93+
super().__init__(tiles, 12, 0, -32)
94+
self.boom = 0
95+
self.power = power
96+
97+
def update(self):
98+
super().update()
99+
if self.boom:
100+
if self.boom == 1:
101+
sound.play(boom_sound)
102+
self.set_frame(12 + self.boom)
103+
self.boom += 1
104+
if self.boom > 4:
105+
self.boom = 0
106+
self.kill()
107+
aliens.tile(self.ax, self.ay, 0)
108+
aliens.dirty = True
109+
return
110+
111+
if self.y <= -32:
112+
return
113+
self.move(self.x, self.y - 8)
114+
self.set_frame(12 - self.power, 0 if self.y % 16 == 6 else 4)
115+
self.ax = (self.x + 8 - aliens.x) // 16
116+
self.ay = (self.y + 4 - aliens.y) // 16
117+
if aliens.tile(self.ax, self.ay) and (self.x + 10 - aliens.x) % 16 > 4:
118+
aliens.tile(self.ax, self.ay, 7)
119+
self.move(self.x, self.y - 4)
120+
self.boom = 1
121+
122+
def kill(self):
123+
self.move(self.x, -32)
124+
self.set_frame(12 - self.power)
125+
126+
127+
class Aliens(stage.Grid):
128+
def __init__(self):
129+
super().__init__(tiles, 7, 3)
130+
for y in range(3):
131+
for x in range(7):
132+
self.tile(x, y, 8)
133+
self.tick = self.left = self.right = self.descend = 0
134+
self.dx = 2
135+
self.dirty = False
136+
137+
def update(self):
138+
self.tick = (self.tick + 1) % 4
139+
self.layer.frame(0, 0 if self.tick >= 2 else 4)
140+
if self.tick in (0, 2):
141+
if self.x >= 14 + self.right or self.x <= 2 - self.left:
142+
self.y += 1
143+
self.descend += 1
144+
if self.descend >= 4:
145+
self.descend = 0
146+
self.dx = -self.dx
147+
self.x += self.dx
148+
else:
149+
self.x += self.dx
150+
self.move(self.x, self.y)
151+
152+
def reform(self):
153+
self.left = 16 * 6
154+
self.right = 16 * 6
155+
for x in range(7):
156+
for y in range(3):
157+
if self.tile(x, y):
158+
self.left = min(16 * x, self.left)
159+
self.right = min(96 - 16 * x, self.right)
160+
self.dirty = False
161+
162+
163+
class Sound:
164+
def __init__(self):
165+
self.audio = None
166+
167+
def play(self, f):
168+
if self.audio and self.audio.playing:
169+
self.audio.stop()
170+
f.seek(0)
171+
del self.audio
172+
try:
173+
self.audio = audioio.AudioOut(board.SPEAKER, f)
174+
self.audio.play()
175+
except MemoryError:
176+
self.audio = None
177+
178+
179+
def pause(info):
180+
while ugame.buttons.get_pressed() & ugame.K_O:
181+
time.sleep(0.25)
182+
text.cursor(0, 0)
183+
text.text(info)
184+
game.render_block()
185+
while not ugame.buttons.get_pressed() & ugame.K_O:
186+
time.sleep(0.25)
187+
text.clear()
188+
game.render_block()
189+
190+
191+
tiles = stage.Bank.from_bmp16("tiles.bmp")
192+
while True:
193+
space = stage.Grid(tiles)
194+
aliens = Aliens()
195+
game = stage.Stage(ugame.display, 12)
196+
for y in range(8):
197+
for x in range(8):
198+
space.tile(x, y, 1)
199+
for i in range(8):
200+
space.tile(random.randint(0, 7), random.randint(0, 7),
201+
random.randint(2, 3))
202+
aliens.move(8, 17)
203+
saucer = Saucer()
204+
bomb = Bomb()
205+
ship = Ship()
206+
missile = Missile(0)
207+
missile1 = Missile(1)
208+
missile2 = Missile(2)
209+
text = stage.Text(9, 1)
210+
text.move(28, 60)
211+
sprites = [saucer, bomb, ship, missile, missile1, missile2]
212+
game.layers = [text] + sprites + [aliens, space]
213+
game.render_block()
214+
pew_sound = open("pew.wav", 'rb')
215+
boom_sound = open("boom.wav", 'rb')
216+
sound = Sound()
217+
218+
while aliens.left + aliens.right < 112 and aliens.y < 80 and not ship.dead:
219+
for sprite in sprites:
220+
sprite.update()
221+
aliens.update()
222+
game.render_sprites(sprites)
223+
game.render_block(aliens.x + aliens.left - 1, aliens.y - 1,
224+
aliens.x + 113 - aliens.right, aliens.y + 48)
225+
if aliens.dirty:
226+
aliens.reform()
227+
game.tick()
228+
229+
if ship.dead or aliens.y >= 80:
230+
pause("Game Over")
231+
else:
232+
pause("You won!")

main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import game

pew.wav

9.13 KB
Binary file not shown.

tiles.bmp

2.18 KB
Binary file not shown.

0 commit comments

Comments
 (0)