Skip to content

Commit e2b3e26

Browse files
committed
Refactored the game to use classes
1 parent f37a429 commit e2b3e26

File tree

4 files changed

+148
-0
lines changed

4 files changed

+148
-0
lines changed

refactored/color.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Color:
2+
RED = (255,0,0)
3+
BLUE = (0,0,255)
4+
YELLOW = (255,255,0)
5+
BLACK = (0,0,0)

refactored/game.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from color import Color
2+
from player import BasePlayer, Enemy
3+
import random
4+
import pygame
5+
6+
class Screen:
7+
def __init__(self, width=800, height=600, background_color=Color.BLACK, font_type="monospace", font_size=35, clock_tick=30):
8+
self.width = width
9+
self.height = height
10+
self.background_color = background_color
11+
self.screen = pygame.display.set_mode((width, height))
12+
self.font = pygame.font.SysFont(font_type, font_size)
13+
self.clock = pygame.time.Clock()
14+
self.clock_tick = clock_tick
15+
16+
def refresh_background(self):
17+
self.screen.fill(self.background_color)
18+
19+
def draw_score_label(self, score, color=Color.YELLOW):
20+
text = f"Score: {score}"
21+
label = self.font.render(text, 1, color)
22+
self.screen.blit(label, (self.width-200, self.height-40))
23+
24+
def draw_enemies(self, enemy_list):
25+
for enemy in enemy_list:
26+
enemy.draw(self.screen)
27+
28+
def draw_player(self, player):
29+
player.draw(self.screen)
30+
31+
def update_screen(self, enemy_list, player, score):
32+
self.refresh_background()
33+
self.draw_enemies(enemy_list)
34+
self.draw_player(player)
35+
self.draw_score_label(score)
36+
37+
self.clock.tick(self.clock_tick)
38+
pygame.display.update()
39+
40+
class Game:
41+
def __init__(self, speed=10, score=0, max_enemies=10, delay=0.1):
42+
self.speed = speed
43+
self.score = score
44+
self.max_enemies = max_enemies
45+
self.delay = delay
46+
47+
self.enemy_list = []
48+
49+
def set_level(self):
50+
if self.score < 20:
51+
self.speed = 5
52+
elif self.score < 40:
53+
self.speed = 8
54+
elif self.score < 60:
55+
self.speed = 12
56+
else:
57+
self.speed = 15
58+
59+
def drop_enemies(self, screen_width):
60+
delay = random.random()
61+
if len(self.enemy_list) < self.max_enemies and delay < self.delay:
62+
random_x = random.randint(0, screen_width-Enemy.size)
63+
new_enemy = Enemy(random_x, 0)
64+
self.enemy_list.append(new_enemy)
65+
66+
def update_enemy_positions(self, screen_height):
67+
updated_enemy_list = []
68+
for enemy in self.enemy_list:
69+
if enemy.y >= 0 and enemy.y < screen_height:
70+
enemy.y += self.speed
71+
updated_enemy_list.append(enemy)
72+
else: # Enemy is no longer on screen, increase score
73+
self.score += 1
74+
self.enemy_list = updated_enemy_list
75+
76+
def collision_check(self, player):
77+
for enemy in self.enemy_list:
78+
if enemy.detect_collision(player):
79+
return True
80+
return False

refactored/main.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import pygame
2+
from player import HumanPlayer
3+
from game import Screen, Game
4+
5+
def main():
6+
pygame.init()
7+
8+
screen = Screen(height=1000)
9+
player = HumanPlayer(screen.width/2, screen.height-2*HumanPlayer.size)
10+
game = Game()
11+
12+
game_over = False
13+
while not game_over:
14+
for event in pygame.event.get():
15+
if event.type == pygame.QUIT:
16+
sys.exit()
17+
if event.type == pygame.KEYDOWN:
18+
if event.key == pygame.K_LEFT:
19+
player.x -= player.size
20+
elif event.key == pygame.K_RIGHT:
21+
player.x += player.size
22+
23+
game.drop_enemies(screen.width)
24+
game.update_enemy_positions(screen.height)
25+
game.set_level()
26+
27+
screen.update_screen(game.enemy_list, player, game.score)
28+
29+
if game.collision_check(player):
30+
game_over = True
31+
break
32+
33+
34+
if __name__ == '__main__':
35+
main()

refactored/player.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from color import Color
2+
import pygame
3+
4+
class BasePlayer:
5+
def __init__(self, x, y, size=50, color=Color.RED):
6+
self.x = x
7+
self.y = y
8+
self.size = size
9+
self.color = color
10+
11+
def draw(self, screen):
12+
pygame.draw.rect(screen, self.color, (self.x, self.y, self.size, self.size))
13+
14+
def detect_collision(self, other):
15+
if (other.x >= self.x and other.x < (self.x + self.size)) or (self.x >= other.x and self.x < (other.x + other.size)):
16+
if (other.y >= self.y and other.y < (self.y + self.size)) or (self.y >= other.y and self.y < (other.y + other.size)):
17+
return True
18+
return False
19+
20+
class Enemy(BasePlayer):
21+
size = 50
22+
def __init__(self, x, y):
23+
super().__init__(x, y, size=self.size, color=Color.BLUE)
24+
25+
class HumanPlayer(BasePlayer):
26+
size = 75
27+
def __init__(self, x, y):
28+
super().__init__(x, y, size=self.size, color=Color.RED)

0 commit comments

Comments
 (0)