aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clyde.py17
-rw-r--r--src/game.py135
-rw-r--r--src/game_state.py46
-rw-r--r--src/ghost.py21
-rw-r--r--src/inky.py12
-rw-r--r--src/pinky.py10
6 files changed, 135 insertions, 106 deletions
diff --git a/src/clyde.py b/src/clyde.py
index 7dcf54e..e48a439 100644
--- a/src/clyde.py
+++ b/src/clyde.py
@@ -22,7 +22,7 @@ class Clyde(Ghost):
return (27 * 30 + 15, 2 * 30 + 15)
@override
- def get_next_move(self, pacman, maze, screen, blinky):
+ def get_next_move(self, game_state, screen):
default_tile = self.get_default_tile()
dx = [1, 0, -1, 0] # right, down, left, up
@@ -31,23 +31,24 @@ class Clyde(Ghost):
inv_dir = [2, 3, 0, 1]
ret = len(dx) * [math.inf]
- bottom_left_corner = (2.5 * 30, (len(maze) - 1 - 1 - 0.5) * 30)
+ bottom_left_corner = (
+ 2.5 * 30, (len(game_state.map.maze) - 1 - 1 - 0.5) * 30)
forbidden = inv_dir[self.last_move]
rand_pos = (0, 0)
- if pacman.powerup:
+ if game_state.pacman.powerup:
self.mode = MODE.FRIGHETENED
rand_pos = random.randint(0, 900), random.randint(0, 990)
- if pacman.powerup is False and self.mode == MODE.FRIGHETENED:
+ if game_state.pacman.powerup is False and self.mode == MODE.FRIGHETENED:
self.mode = MODE.CHASING
for i in range(len(dx)):
nx = self.x + dx[i] * self.speed
ny = self.y + dy[i] * self.speed
- if self.check_collision(nx, ny, 30, 30, maze):
+ if self.check_collision(nx, ny, 30, 30, game_state.map.maze):
if i != forbidden:
if self.mode == MODE.SCATTERED:
ret[i] = self.heuristic(
@@ -56,7 +57,7 @@ class Clyde(Ghost):
ret[i] = self.heuristic(
(nx, ny), rand_pos[0], rand_pos[1])
elif self.mode == MODE.CHASING:
- if self.is_eight_tiles_away(pacman):
+ if self.is_eight_tiles_away(game_state.pacman):
ret[i] = self.heuristic(
(nx, ny), bottom_left_corner[0], bottom_left_corner[1])
if settings.debug:
@@ -64,9 +65,9 @@ class Clyde(Ghost):
(self.x, self.y), 1)
else:
ret[i] = self.heuristic(
- (nx, ny), pacman.x, pacman.y)
+ (nx, ny), game_state.pacman.x, game_state.pacman.y)
if settings.debug:
- pygame.draw.line(screen, self.color, (pacman.x, pacman.y),
+ pygame.draw.line(screen, self.color, (game_state.pacman.x, game_state.pacman.y),
(self.x, self.y), 1)
min_h = min(ret)
diff --git a/src/game.py b/src/game.py
index a904fad..4787c00 100644
--- a/src/game.py
+++ b/src/game.py
@@ -1,23 +1,16 @@
-from blinky import Blinky
-from clyde import Clyde
from direction import DIRECTION
+from game_state import GameState
from mode import MODE
-from inky import Inky
-from pinky import Pinky
-from player import Player
from settings import settings
-import map as Map
+from game_state import WIDTH, HEIGHT, TILE_WIDTH, TILE_HEIGHT
import pygame
-WIDTH = settings.width
-HEIGHT = settings.height
-
class Game():
def __init__(self):
self.settings = settings
- def show_gameover_screen(self, screen, game_over):
+ def show_gameover_screen(self, screen, game_state, sprites):
font = pygame.font.SysFont(None, 48)
# Render the "Game Over" text to a surface
@@ -38,14 +31,18 @@ class Game():
if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
# Reset the game and start again
# Add your own code here to reset the game state
- game_over[0] = False
+ self.reset_game(game_state, sprites)
+ game_state.game_over = False
quit_game = True # Set the flag to True to break out of both loops
break
elif event.type == pygame.QUIT:
- game_over[0] = True
+ game_state.game_over = True
quit_game = True # Set the flag to True to break out of both loops
break
+ def reset_game(self, game_state, sprites):
+ game_state.reset(sprites)
+
def run(self):
# Initialize Pygame
pygame.init()
@@ -64,27 +61,14 @@ class Game():
clyde_sprite = pygame.image.load('../assets/clyde.png').convert_alpha()
inky_sprite = pygame.image.load('../assets/inky.png').convert_alpha()
+ sprites = [sprite_sheet, blinky_sprite,
+ pinky_sprite, clyde_sprite, inky_sprite]
+
# Set the timer to trigger after 10,000 milliseconds (10 seconds)
timer_event = pygame.USEREVENT + 1
pygame.time.set_timer(timer_event, 1000 * 10, 1)
- # our beautiful maze
- maze = Map.Map()
-
- # length of the map grid size
- TILE_WIDTH = WIDTH // len(maze.maze[0])
- TILE_HEIGHT = HEIGHT // len(maze.maze)
-
- # Initialize the player and the ghosts
- player = Player(sprite_sheet)
- blinky = Blinky(blinky_sprite, 12 * TILE_WIDTH +
- 15, 12 * TILE_HEIGHT + 15)
- pinky = Pinky(pinky_sprite, 11 * TILE_WIDTH +
- 15, 12 * TILE_HEIGHT + 15)
- inky = Inky(inky_sprite, 13 * TILE_WIDTH +
- 15, 12 * TILE_HEIGHT + 15)
- clyde = Clyde(clyde_sprite, 14 * TILE_WIDTH +
- 15, 12 * TILE_HEIGHT + 15)
+ game_state = GameState(sprites)
# Set the pacman velocity
dx = 0
@@ -101,10 +85,9 @@ class Game():
if settings.sound:
pygame.mixer.music.play()
siren_sound.play(-1)
- is_game_over = [False]
# Main game loop
- while not is_game_over[0]:
+ while not game_state.game_over:
# setting game fps
clock.tick(settings.fps)
@@ -120,98 +103,96 @@ class Game():
tx = dx
ty = dy
- is_pacman_alive = [True]
-
# Handling events
for event in pygame.event.get():
if event.type == pygame.QUIT:
- is_game_over[0] = True
+ game_state.game_over = True
elif event.type == pygame.KEYDOWN:
# Move the circle based on the pressed key
if event.key == pygame.K_w:
- player.direction = DIRECTION.UP
- ty = -player.speed
+ game_state.pacman.direction = DIRECTION.UP
+ ty = -game_state.pacman.speed
tx = 0 # Necssarry to move only horizontal or vertical
elif event.key == pygame.K_s:
- player.direction = DIRECTION.DOWN
- ty = player.speed
+ game_state.pacman.direction = DIRECTION.DOWN
+ ty = game_state.pacman.speed
tx = 0 # Necssarry to move only horizontal or vertical
elif event.key == pygame.K_a:
- player.direction = DIRECTION.LEFT
- tx = -player.speed
+ game_state.pacman.direction = DIRECTION.LEFT
+ tx = -game_state.pacman.speed
ty = 0 # Necssarry to move only horizontal or vertical
elif event.key == pygame.K_d:
- player.direction = DIRECTION.RIGHT
- tx = player.speed
+ game_state.pacman.direction = DIRECTION.RIGHT
+ tx = game_state.pacman.speed
ty = 0 # Necssarry to move only horizontal or vertical
# Check for the timer event
if event.type == timer_event:
- pinky.mode = MODE.CHASING
- inky.mode = MODE.CHASING
- blinky.mode = MODE.CHASING
- clyde.mode = MODE.CHASING
+ game_state.pinky.mode = MODE.CHASING
+ game_state.inky.mode = MODE.CHASING
+ game_state.blinky.mode = MODE.CHASING
+ game_state.clyde.mode = MODE.CHASING
keys = pygame.key.get_pressed()
# Simulates holding the key which adds better playability for pacman
if keys[pygame.K_w]:
- player.direction = DIRECTION.UP
- ty = -player.speed
+ game_state.pacman.direction = DIRECTION.UP
+ ty = -game_state.pacman.speed
tx = 0
elif keys[pygame.K_s]:
- player.direction = DIRECTION.DOWN
- ty = player.speed
+ game_state.pacman.direction = DIRECTION.DOWN
+ ty = game_state.pacman.speed
tx = 0
elif keys[pygame.K_a]:
- player.direction = DIRECTION.LEFT
- tx = -player.speed
+ game_state.pacman.direction = DIRECTION.LEFT
+ tx = -game_state.pacman.speed
ty = 0
elif keys[pygame.K_d]:
- player.direction = DIRECTION.RIGHT
- tx = player.speed
+ game_state.pacman.direction = DIRECTION.RIGHT
+ tx = game_state.pacman.speed
ty = 0
# if tx and ty doesn't lead to colliding change the current
# dx and dy to them and other wise
# let pacman move in his previous direction
- if player.check_collision(maze, tx, ty, TILE_WIDTH, TILE_HEIGHT):
+ if game_state.pacman.check_collision(game_state.map, tx, ty, TILE_WIDTH, TILE_HEIGHT):
dx = tx
dy = ty
if dx < 0:
- player.direction = DIRECTION.LEFT
+ game_state.pacman.direction = DIRECTION.LEFT
elif dx > 0:
- player.direction = DIRECTION.RIGHT
+ game_state.pacman.direction = DIRECTION.RIGHT
elif dy < 0:
- player.direction = DIRECTION.UP
+ game_state.pacman.direction = DIRECTION.UP
elif dy > 0:
- player.direction = DIRECTION.DOWN
+ game_state.pacman.direction = DIRECTION.DOWN
- if player.check_collision(maze, dx, dy, TILE_WIDTH, TILE_HEIGHT):
- player.x += dx
- player.y += dy
- player.x %= 900
+ if game_state.pacman.check_collision(game_state.map, dx, dy, TILE_WIDTH, TILE_HEIGHT):
+ game_state.pacman.x += dx
+ game_state.pacman.y += dy
+ game_state.pacman.x %= 900
# Move ghosts
- blinky.move(maze.maze, player, screen, is_pacman_alive, blinky)
- pinky.move(maze.maze, player, screen, is_pacman_alive, blinky)
- inky.move(maze.maze, player, screen, is_pacman_alive, blinky)
- clyde.move(maze.maze, player, screen, is_pacman_alive, blinky)
+ game_state.blinky.move(game_state, screen)
+ game_state.pinky.move(game_state, screen)
+ game_state.inky.move(game_state, screen)
+ game_state.clyde.move(game_state, screen)
# Draw the map on each frame
- maze.draw_map(screen)
+ game_state.map.draw_map(screen)
- # Draw the player and the ghosts
- player.draw(screen, counter)
- blinky.draw(screen, player.powerup, counter)
- pinky.draw(screen, player.powerup, counter)
- inky.draw(screen, player.powerup, counter)
- clyde.draw(screen, player.powerup, counter)
+ # Draw the game_state.pacman and the ghosts
+ game_state.pacman.draw(screen, counter)
+ game_state.blinky.draw(screen, game_state.pacman.powerup, counter)
+ game_state.pinky.draw(screen, game_state.pacman.powerup, counter)
+ game_state.inky.draw(screen, game_state.pacman.powerup, counter)
+ game_state.clyde.draw(screen, game_state.pacman.powerup, counter)
- if not is_pacman_alive[0]:
+ if not game_state.is_pacman_alive:
self.show_gameover_screen(
- screen, is_game_over)
- is_pacman_alive[0] = True
+ screen, game_state, sprites)
+ game_state.is_pacman_alive = True
else:
# Update the screen
pygame.display.flip()
diff --git a/src/game_state.py b/src/game_state.py
new file mode 100644
index 0000000..f722873
--- /dev/null
+++ b/src/game_state.py
@@ -0,0 +1,46 @@
+from blinky import Blinky
+from clyde import Clyde
+from inky import Inky
+from pinky import Pinky
+from player import Player
+from settings import settings
+import map as Map
+import pygame
+
+WIDTH = settings.width
+HEIGHT = settings.height
+maze = Map.Map()
+TILE_WIDTH = WIDTH // len(maze.maze[0])
+TILE_HEIGHT = HEIGHT // len(maze.maze)
+
+
+class GameState():
+ def __init__(self, sprites):
+ self.pacman = Player(sprites[0])
+ self.blinky = Blinky(sprites[1], 12 * TILE_WIDTH +
+ 15, 12 * TILE_HEIGHT + 15)
+ self.pinky = Pinky(sprites[2], 11 * TILE_WIDTH +
+ 15, 12 * TILE_HEIGHT + 15)
+ self.inky = Inky(sprites[3], 13 * TILE_WIDTH +
+ 15, 12 * TILE_HEIGHT + 15)
+ self.clyde = Clyde(sprites[4], 14 * TILE_WIDTH +
+ 15, 12 * TILE_HEIGHT + 15)
+ self.map = Map.Map()
+ self.game_over = False
+ self.is_pacman_alive = True
+
+ def reset(self, sprites):
+ self.pacman = Player(sprites[0])
+ self.blinky = Blinky(sprites[1], 12 * TILE_WIDTH +
+ 15, 12 * TILE_HEIGHT + 15)
+ self.pinky = Pinky(sprites[2], 11 * TILE_WIDTH +
+ 15, 12 * TILE_HEIGHT + 15)
+ self.inky = Inky(sprites[3], 13 * TILE_WIDTH +
+ 15, 12 * TILE_HEIGHT + 15)
+ self.clyde = Clyde(sprites[4], 14 * TILE_WIDTH +
+ 15, 12 * TILE_HEIGHT + 15)
+ self.map = Map.Map()
+ self.game_over = False
+ self.is_pacman_alive = True
+ timer_event = pygame.USEREVENT + 1
+ pygame.time.set_timer(timer_event, 1000 * 10, 1)
diff --git a/src/ghost.py b/src/ghost.py
index e4b4cf1..fc3adfe 100644
--- a/src/ghost.py
+++ b/src/ghost.py
@@ -63,7 +63,7 @@ class Ghost():
return True
- def get_next_move(self, pacman, maze, screen, blinky):
+ def get_next_move(self, game_state, screen):
default_tile = self.get_default_tile()
@@ -73,28 +73,29 @@ class Ghost():
rand_pos = (0, 0)
- if pacman.powerup:
+ if game_state.pacman.powerup:
self.mode = MODE.FRIGHETENED
rand_pos = random.randint(0, 900), random.randint(0, 990)
- if pacman.powerup is False and self.mode == MODE.FRIGHETENED:
+ if game_state.pacman.powerup is False and self.mode == MODE.FRIGHETENED:
self.mode = MODE.CHASING
for i in range(len(dx)):
nx = self.x + dx[i] * self.speed
ny = self.y + dy[i] * self.speed
- if self.check_collision(nx, ny, 30, 30, maze):
+ if self.check_collision(nx, ny, 30, 30, game_state.map.maze):
if i != forbidden:
if self.mode == MODE.SCATTERED:
ret[i] = self.heuristic(
(nx, ny), default_tile[0], default_tile[1])
elif self.mode == MODE.CHASING:
- ret[i] = self.heuristic((nx, ny), pacman.x, pacman.y)
+ ret[i] = self.heuristic(
+ (nx, ny), game_state.pacman.x, game_state.pacman.y)
elif self.mode == MODE.FRIGHETENED:
ret[i] = self.heuristic(
(nx, ny), rand_pos[0], rand_pos[1])
if settings.debug:
- pygame.draw.line(screen, self.color, (pacman.x, pacman.y),
+ pygame.draw.line(screen, self.color, (game_state.pacman.x, game_state.pacman.y),
(self.x, self.y), 1)
min_h = min(ret)
@@ -108,10 +109,10 @@ class Ghost():
min_idx = ret.index(min_h)
return min_idx
- def move(self, maze, pacman, screen, is_pacman_alive, blinky):
- if abs(pacman.x - self.x) <= 15 and abs(pacman.y - self.y) <= 15:
- is_pacman_alive[0] = False
- min_idx = self.get_next_move(pacman, maze, screen, blinky)
+ def move(self, game_state, screen):
+ if abs(game_state.pacman.x - self.x) <= 15 and abs(game_state.pacman.y - self.y) <= 15:
+ game_state.is_pacman_alive = False
+ min_idx = self.get_next_move(game_state, screen)
new_dx = dx[min_idx] * self.speed
new_dy = dy[min_idx] * self.speed
self.x += new_dx
diff --git a/src/inky.py b/src/inky.py
index 1f5bb8b..840b60b 100644
--- a/src/inky.py
+++ b/src/inky.py
@@ -48,7 +48,7 @@ class Inky(Ghost):
return target
@override
- def get_next_move(self, pacman, maze, screen, blinky):
+ def get_next_move(self, game_state, screen):
default_tile = self.get_default_tile()
dx = [1, 0, -1, 0]
@@ -67,16 +67,16 @@ class Inky(Ghost):
if self.last_move == 3:
forbidden = 1
- inter_tile = self.get_intermediate_tile(pacman)
- target = self.get_target(inter_tile, blinky)
+ inter_tile = self.get_intermediate_tile(game_state.pacman)
+ target = self.get_target(inter_tile, game_state.blinky)
rand_pos = (0, 0)
- if pacman.powerup:
+ if game_state.pacman.powerup:
self.mode = MODE.FRIGHETENED
rand_pos = random.randint(0, 900), random.randint(0, 990)
- if pacman.powerup is False and self.mode == MODE.FRIGHETENED:
+ if game_state.pacman.powerup is False and self.mode == MODE.FRIGHETENED:
self.mode = MODE.CHASING
if settings.debug:
@@ -87,7 +87,7 @@ class Inky(Ghost):
if i != forbidden:
nx = self.x + dx[i] * self.speed
ny = self.y + dy[i] * self.speed
- if self.check_collision(nx, ny, 30, 30, maze):
+ if self.check_collision(nx, ny, 30, 30, game_state.map.maze):
if self.mode == MODE.SCATTERED:
ret[i] = self.heuristic(
(nx, ny), default_tile[0], default_tile[1])
diff --git a/src/pinky.py b/src/pinky.py
index 29949a7..be9e5dc 100644
--- a/src/pinky.py
+++ b/src/pinky.py
@@ -43,7 +43,7 @@ class Pinky(Ghost):
return (27 * 30 + 15, 30 * 30 + 15)
@override
- def get_next_move(self, pacman, maze, screen, blinky):
+ def get_next_move(self, game_state, screen):
default_tile = self.get_default_tile()
dx = [1, 0, -1, 0]
@@ -64,25 +64,25 @@ class Pinky(Ghost):
rand_pos = (0, 0)
- new_target = self.get_four_tiles_ahead_of_pacman(pacman)
+ new_target = self.get_four_tiles_ahead_of_pacman(game_state.pacman)
if settings.debug:
pygame.draw.circle(screen, self.color,
(new_target[0], new_target[1]), 15)
pygame.draw.circle(screen, self.color,
default_tile, 15)
- if pacman.powerup:
+ if game_state.pacman.powerup:
self.mode = MODE.FRIGHETENED
rand_pos = random.randint(0, 900), random.randint(0, 990)
- if pacman.powerup is False and self.mode == MODE.FRIGHETENED:
+ if game_state.pacman.powerup is False and self.mode == MODE.FRIGHETENED:
self.mode = MODE.CHASING
for i in range(len(dx)):
if i != forbidden:
nx = self.x + dx[i] * self.speed
ny = self.y + dy[i] * self.speed
- if self.check_collision(nx, ny, 30, 30, maze):
+ if self.check_collision(nx, ny, 30, 30, game_state.map.maze):
if self.mode == MODE.SCATTERED:
ret[i] = self.heuristic(
(nx, ny), default_tile[0], default_tile[1])