Skip to content

Commit 213e0de

Browse files
committed
Video Version
This is the final code as shown in the video tutorial.
1 parent 49edf3e commit 213e0de

File tree

11 files changed

+255
-252
lines changed

11 files changed

+255
-252
lines changed

Graphics/spaceship.png

1.6 KB
Loading

Sounds/explosion.ogg

10.7 KB
Binary file not shown.

Sounds/laser.ogg

15.8 KB
Binary file not shown.

Sounds/music.ogg

1.13 MB
Binary file not shown.

alien.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,17 @@ def __init__(self, screen_width, offset):
1717
self.screen_width = screen_width
1818
self.offset = offset
1919
self.image = pygame.image.load("Graphics/mystery.png")
20-
x = random.choice([0, screen_width - self.image.get_width()])
21-
if x == 0:
20+
21+
x = random.choice([self.offset/2, self.screen_width + self.offset - self.image.get_width()])
22+
if x == self.offset/2:
2223
self.speed = 3
2324
else:
2425
self.speed = -3
25-
self.rect = self.image.get_rect(topleft = (x, 80))
26+
27+
self.rect = self.image.get_rect(topleft = (x, 90))
2628

2729
def update(self):
28-
self.rect.x += self.speed
30+
self.rect.x += self.speed
2931
if self.rect.right > self.screen_width + self.offset/2:
3032
self.kill()
3133
elif self.rect.left < self.offset/2:

game.py

Lines changed: 148 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,146 +1,153 @@
11
import pygame, random
22
from spaceship import Spaceship
3-
from alien import Alien
4-
from alien import MysteryShip
53
from obstacle import Obstacle
4+
from obstacle import grid
5+
from alien import Alien
66
from laser import Laser
7+
from alien import MysteryShip
78

8-
class Game():
9-
def __init__(self, screen_width, screen_height, offset):
10-
11-
self.lives = 3
12-
self.lives_surface = pygame.image.load("Graphics/ship.png").convert_alpha()
13-
self.score = 0
14-
self.highscore = 0
15-
self.load_highscore()
16-
17-
self.screen_width = screen_width
18-
self.screen_height = screen_height
19-
self.offset = offset
20-
self.spaceship = pygame.sprite.GroupSingle()
21-
self.spaceship.add(Spaceship(screen_width, screen_height, offset))
22-
self.obstacle_1 = Obstacle(screen_width/4 - 110,screen_height - 100)
23-
self.obstacle_2 = Obstacle((screen_width/4)*2 - 110,screen_height - 100)
24-
self.obstacle_3 = Obstacle((screen_width/4)*3 - 110,screen_height - 100)
25-
self.obstacle_4 = Obstacle((screen_width/4)*4 - 110,screen_height - 100)
26-
self.aliens = pygame.sprite.Group()
27-
self.alien_lasers = pygame.sprite.Group()
28-
self.mystery_ship = pygame.sprite.GroupSingle()
29-
self.alien_direction = 1
30-
self.run = True
31-
self.create_aliens()
32-
33-
def create_mystery_ship(self):
34-
self.mystery_ship.add(MysteryShip(self.screen_width, self.offset))
35-
36-
def check_for_collisions(self):
37-
#Spaceship Laser
38-
if self.spaceship.sprite.lasers:
39-
for laser in self.spaceship.sprite.lasers:
40-
for obstacle in [self.obstacle_1, self.obstacle_2, self.obstacle_3, self.obstacle_4]:
41-
if pygame.sprite.spritecollide(laser, obstacle.blocks, True):
42-
laser.kill()
43-
44-
aliens_hit = pygame.sprite.spritecollide(laser, self.aliens, True)
45-
if aliens_hit:
46-
for alien in aliens_hit:
47-
self.score += alien.type * 100
48-
self.check_for_highscore()
49-
laser.kill()
50-
51-
if pygame.sprite.spritecollide(laser, self.mystery_ship, True):
52-
self.score += 500
53-
self.check_for_highscore()
54-
laser.kill()
55-
56-
#Aliens Laser
57-
if self.alien_lasers:
58-
for laser in self.alien_lasers:
59-
for obstacle in [self.obstacle_1, self.obstacle_2, self.obstacle_3, self.obstacle_4]:
60-
if pygame.sprite.spritecollide(laser, obstacle.blocks, True):
61-
laser.kill()
62-
if pygame.sprite.spritecollide(laser, self.spaceship, False):
63-
laser.kill()
64-
self.lives -= 1
65-
if self.lives == 0:
66-
self.game_over()
67-
68-
if self.aliens:
69-
for alien in self.aliens:
70-
pygame.sprite.spritecollide(alien, self.obstacle_1.blocks, True)
71-
pygame.sprite.spritecollide(alien, self.obstacle_2.blocks, True)
72-
pygame.sprite.spritecollide(alien, self.obstacle_3.blocks, True)
73-
pygame.sprite.spritecollide(alien, self.obstacle_4.blocks, True)
74-
75-
if pygame.sprite.spritecollide(alien, self.spaceship, False):
76-
self.game_over()
77-
78-
def create_aliens(self):
79-
for row in range(5):
80-
for column in range(11):
81-
x = column * 55
82-
y = row * 55
83-
if row == 0:
84-
alien_sprite = Alien(3, 75 + x + self.offset/2, 80 + y + self.offset)
85-
elif row == 1 or row == 2:
86-
alien_sprite = Alien(2, 75 + x + self.offset/2, 80 + y + self.offset)
87-
else:
88-
alien_sprite = Alien(1, 75 + x + self.offset/2, 80 + y + self.offset)
89-
self.aliens.add(alien_sprite)
90-
91-
def alien_position_checker(self):
92-
alien_sprites = self.aliens.sprites()
93-
for alien in alien_sprites:
94-
if alien.rect.right >= self.screen_width + self.offset/2:
95-
self.alien_direction = -1
96-
self.alien_move_down(2)
97-
elif alien.rect.left <= self.offset/2:
98-
self.alien_direction = 1
99-
self.alien_move_down(2)
100-
101-
def alien_move_down(self, distance):
102-
if self.aliens:
103-
for alien in self.aliens.sprites():
104-
alien.rect.y += distance
105-
106-
def alien_shoot_laser(self):
107-
if self.aliens.sprites():
108-
random_alien = random.choice(self.aliens.sprites())
109-
laser_sprite = Laser(random_alien.rect.center, -6, self.screen_height)
110-
self.alien_lasers.add(laser_sprite)
111-
112-
def game_over(self):
113-
self.run = False
114-
115-
def reset(self):
116-
self.run = True
117-
self.lives = 3
118-
self.spaceship.sprite.reset()
119-
self.aliens.empty()
120-
self.create_aliens()
121-
self.spaceship.sprite.lasers.empty()
122-
self.alien_lasers.empty()
123-
124-
# Recreate the obstacles
125-
self.obstacle_1 = Obstacle(self.screen_width / 4 - 110, self.screen_height - 100)
126-
self.obstacle_2 = Obstacle((self.screen_width / 4) * 2 - 110, self.screen_height - 100)
127-
self.obstacle_3 = Obstacle((self.screen_width / 4) * 3 - 110, self.screen_height - 100)
128-
self.obstacle_4 = Obstacle((self.screen_width / 4) * 4 - 110, self.screen_height - 100)
129-
130-
self.score = 0
131-
132-
def check_for_highscore(self):
133-
if self.score > self.highscore:
134-
self.highscore = self.score
135-
136-
# Save the highscore to a file
137-
with open('highscore.txt', 'w') as file:
138-
file.write(str(self.highscore))
139-
140-
def load_highscore(self):
141-
try:
142-
with open('highscore.txt', 'r') as file:
143-
self.highscore = int(file.read())
144-
except FileNotFoundError:
145-
# If the file doesn't exist, set a default highscore
146-
self.highscore = 0
9+
class Game:
10+
def __init__(self, screen_width, screen_height, offset):
11+
self.screen_width = screen_width
12+
self.screen_height = screen_height
13+
self.offset = offset
14+
self.spaceship_group = pygame.sprite.GroupSingle()
15+
self.spaceship_group.add(Spaceship(self.screen_width, self.screen_height, self.offset))
16+
self.obstacles = self.create_obstacles()
17+
self.aliens_group = pygame.sprite.Group()
18+
self.create_aliens()
19+
self.aliens_direction = 1
20+
self.alien_lasers_group = pygame.sprite.Group()
21+
self.mystery_ship_group = pygame.sprite.GroupSingle()
22+
self.lives = 3
23+
self.run = True
24+
self.score = 0
25+
self.highscore = 0
26+
self.explosion_sound = pygame.mixer.Sound("Sounds/explosion.ogg")
27+
self.load_highscore()
28+
pygame.mixer.music.load("Sounds/music.ogg")
29+
pygame.mixer.music.play(-1)
30+
31+
def create_obstacles(self):
32+
obstacle_width = len(grid[0]) * 3
33+
gap = (self.screen_width + self.offset - (4 * obstacle_width))/5
34+
obstacles = []
35+
for i in range(4):
36+
offset_x = (i + 1) * gap + i * obstacle_width
37+
obstacle = Obstacle(offset_x, self.screen_height - 100)
38+
obstacles.append(obstacle)
39+
return obstacles
40+
41+
def create_aliens(self):
42+
for row in range(5):
43+
for column in range(11):
44+
x = 75 + column * 55
45+
y = 110 + row * 55
46+
47+
if row == 0:
48+
alien_type = 3
49+
elif row in (1,2):
50+
alien_type = 2
51+
else:
52+
alien_type = 1
53+
54+
alien = Alien(alien_type, x + self.offset/2, y)
55+
self.aliens_group.add(alien)
56+
57+
def move_aliens(self):
58+
self.aliens_group.update(self.aliens_direction)
59+
60+
alien_sprites = self.aliens_group.sprites()
61+
for alien in alien_sprites:
62+
if alien.rect.right >= self.screen_width + self.offset/2:
63+
self.aliens_direction = -1
64+
self.alien_move_down(2)
65+
elif alien.rect.left <= self.offset/2:
66+
self.aliens_direction = 1
67+
self.alien_move_down(2)
68+
69+
def alien_move_down(self, distance):
70+
if self.aliens_group:
71+
for alien in self.aliens_group.sprites():
72+
alien.rect.y += distance
73+
74+
def alien_shoot_laser(self):
75+
if self.aliens_group.sprites():
76+
random_alien = random.choice(self.aliens_group.sprites())
77+
laser_sprite = Laser(random_alien.rect.center, -6, self.screen_height)
78+
self.alien_lasers_group.add(laser_sprite)
79+
80+
def create_mystery_ship(self):
81+
self.mystery_ship_group.add(MysteryShip(self.screen_width, self.offset))
82+
83+
def check_for_collisions(self):
84+
#Spaceship
85+
if self.spaceship_group.sprite.lasers_group:
86+
for laser_sprite in self.spaceship_group.sprite.lasers_group:
87+
88+
aliens_hit = pygame.sprite.spritecollide(laser_sprite, self.aliens_group, True)
89+
if aliens_hit:
90+
self.explosion_sound.play()
91+
for alien in aliens_hit:
92+
self.score += alien.type * 100
93+
self.check_for_highscore()
94+
laser_sprite.kill()
95+
96+
if pygame.sprite.spritecollide(laser_sprite, self.mystery_ship_group, True):
97+
self.score += 500
98+
self.explosion_sound.play()
99+
self.check_for_highscore()
100+
laser_sprite.kill()
101+
102+
for obstacle in self.obstacles:
103+
if pygame.sprite.spritecollide(laser_sprite, obstacle.blocks_group, True):
104+
laser_sprite.kill()
105+
106+
#Alien Lasers
107+
if self.alien_lasers_group:
108+
for laser_sprite in self.alien_lasers_group:
109+
if pygame.sprite.spritecollide(laser_sprite, self.spaceship_group, False):
110+
laser_sprite.kill()
111+
self.lives -= 1
112+
if self.lives == 0:
113+
self.game_over()
114+
115+
for obstacle in self.obstacles:
116+
if pygame.sprite.spritecollide(laser_sprite, obstacle.blocks_group, True):
117+
laser_sprite.kill()
118+
119+
if self.aliens_group:
120+
for alien in self.aliens_group:
121+
for obstacle in self.obstacles:
122+
pygame.sprite.spritecollide(alien, obstacle.blocks_group, True)
123+
124+
if pygame.sprite.spritecollide(alien, self.spaceship_group, False):
125+
self.game_over()
126+
127+
def game_over(self):
128+
self.run = False
129+
130+
def reset(self):
131+
self.run = True
132+
self.lives = 3
133+
self.spaceship_group.sprite.reset()
134+
self.aliens_group.empty()
135+
self.alien_lasers_group.empty()
136+
self.create_aliens()
137+
self.mystery_ship_group.empty()
138+
self.obstacles = self.create_obstacles()
139+
self.score = 0
140+
141+
def check_for_highscore(self):
142+
if self.score > self.highscore:
143+
self.highscore = self.score
144+
145+
with open("highscore.txt", "w") as file:
146+
file.write(str(self.highscore))
147+
148+
def load_highscore(self):
149+
try:
150+
with open("highscore.txt", "r") as file:
151+
self.highscore = int(file.read())
152+
except FileNotFoundError:
153+
self.highscore = 0

highscore.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

laser.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
import pygame
22

3-
class Laser(pygame.sprite .Sprite):
4-
def __init__(self, pos, speed, screen_height):
3+
class Laser(pygame.sprite.Sprite):
4+
def __init__(self, position, speed, screen_height):
55
super().__init__()
66
self.image = pygame.Surface((4,15))
77
self.image.fill((243, 216, 63))
8-
self.rect = self.image.get_rect(center = pos)
8+
self.rect = self.image.get_rect(center = position)
99
self.speed = speed
1010
self.screen_height = screen_height
1111

12-
def destroy(self):
13-
if self.rect.y <= 0 or self.rect.y >= self.screen_height + 50:
14-
self.kill()
15-
1612
def update(self):
1713
self.rect.y -= self.speed
18-
self.destroy()
14+
if self.rect.y > self.screen_height + 15 or self.rect.y < 0:
15+
self.kill()

0 commit comments

Comments
 (0)