aboutsummaryrefslogtreecommitdiff
path: root/src/game.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.py')
-rw-r--r--src/game.py246
1 files changed, 164 insertions, 82 deletions
diff --git a/src/game.py b/src/game.py
index 37739e3..a7efb67 100644
--- a/src/game.py
+++ b/src/game.py
@@ -1,21 +1,102 @@
-from blinky import Blinky
-from clyde import Clyde
from direction import DIRECTION
-from inky import Inky
-from pinky import Pinky
-from player import Player
+from game_state import GameState
+from mode import MODE
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_state, sprites):
+ font = pygame.font.SysFont(None, 64)
+
+ # Render the "Game Over" text to a surface
+ game_over_text_1 = font.render(
+ "Game Over", True, (255, 255, 255))
+ game_over_text_2 = font.render(
+ "Press R to try again or Q to quit.", True, (255, 255, 255))
+
+ # Blit the "Game Over" text onto the screen
+ text_rect_1 = game_over_text_1.get_rect(
+ center=(WIDTH/2, HEIGHT/2 - 75))
+ text_rect_2 = game_over_text_2.get_rect(
+ center=(WIDTH/2, HEIGHT/2))
+
+ screen.blit(game_over_text_1, text_rect_1)
+ screen.blit(game_over_text_2, text_rect_2)
+
+ # Update the display
+ pygame.display.flip()
+
+ quit_game = False # Initialize the flag variable
+ while not quit_game:
+ for event in pygame.event.get():
+ 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
+ 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.KEYDOWN and event.key == pygame.K_q:
+ game_state.game_over = True
+ quit_game = True
+ break
+ elif event.type == pygame.QUIT:
+ game_state.game_over = True
+ quit_game = True # Set the flag to True to break out of both loops
+ break
+
+ def show_wining_screen(self, screen, game_state, sprites):
+ font = pygame.font.SysFont(None, 64)
+
+ # Render the "Game Over" text to a surface
+ wining_text_1 = font.render(
+ "Congratulation You Won!!", True, (255, 255, 255))
+ wining_text_2 = font.render(
+ "Press R to play again or Q to quit", True, (255, 255, 255))
+
+ text_rect_1 = wining_text_1.get_rect(
+ center=(WIDTH/2, HEIGHT/2 - 75))
+ text_rect_2 = wining_text_2.get_rect(
+ center=(WIDTH/2, HEIGHT/2))
+
+ # Blit the "Game Over" text onto the screen
+ text_rect_1 = wining_text_1.get_rect(
+ center=(WIDTH/2, HEIGHT/2))
+ text_rect_2 = wining_text_2.get_rect(
+ center=(WIDTH/2, HEIGHT/2 + 100))
+ screen.blit(wining_text_1, text_rect_1)
+ screen.blit(wining_text_2, text_rect_2)
+
+ # Update the display
+ pygame.display.flip()
+
+ quit_game = False # Initialize the flag variable
+ while not quit_game:
+ for event in pygame.event.get():
+ 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
+ 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.KEYDOWN and event.key == pygame.K_q:
+ game_state.game_over = True
+ quit_game = True
+ break
+ elif event.type == pygame.QUIT:
+ 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()
@@ -24,27 +105,24 @@ class Game():
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# Sprite sheet for pacman
- sprite_sheet = pygame.image.load( '../assets/pacman_left_sprite.png').convert_alpha()
+ sprite_sheet = pygame.image.load(
+ '../assets/pacman_left_sprite.png').convert_alpha()
# Sprite sheets for the ghosts
- blinky_sprite = pygame.image.load('../assets/blinky.png').convert_alpha()
- pinky_sprite = pygame.image.load( '../assets/pinky.png').convert_alpha()
- clyde_sprite = pygame.image.load( '../assets/clyde.png').convert_alpha()
- inky_sprite = pygame.image.load( '../assets/inky.png').convert_alpha()
+ blinky_sprite = pygame.image.load(
+ '../assets/blinky.png').convert_alpha()
+ pinky_sprite = pygame.image.load('../assets/pinky.png').convert_alpha()
+ clyde_sprite = pygame.image.load('../assets/clyde.png').convert_alpha()
+ inky_sprite = pygame.image.load('../assets/inky.png').convert_alpha()
- # our beautiful maze
- maze = Map.Map()
+ sprites = [sprite_sheet, blinky_sprite,
+ pinky_sprite, inky_sprite, clyde_sprite]
- # length of the map grid size
- TILE_WIDTH = WIDTH // len(maze.maze[0])
- TILE_HEIGHT = HEIGHT // len(maze.maze)
+ # 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)
- # Initialize the player and the ghosts
- player = Player(sprite_sheet)
- blinky = Blinky(blinky_sprite,75, 75)
- pinky = Pinky(pinky_sprite, 27 * 30, 30 * 30 + 15)
- inky = Inky(inky_sprite, 75, 30 * 30 + 15)
- clyde = Clyde(clyde_sprite, 27 * 30 + 15, 75)
+ game_state = GameState(sprites)
# Set the pacman velocity
dx = 0
@@ -57,15 +135,13 @@ class Game():
pygame.mixer.music.load('../assets/sfx/game_start.wav')
siren_sound = pygame.mixer.Sound('../assets/sfx/siren_1.wav')
- munch_sound = pygame.mixer.Sound('../assets/sfx/munch_1.wav')
-
- pygame.mixer.music.play()
- siren_sound.play(-1)
- is_game_over = [False]
+ if settings.sound:
+ pygame.mixer.music.play()
+ siren_sound.play(-1)
# Main game loop
- while not is_game_over[0]:
+ while not game_state.game_over:
# setting game fps
clock.tick(settings.fps)
@@ -84,95 +160,101 @@ class Game():
# Handling events
for event in pygame.event.get():
if event.type == pygame.QUIT:
- is_game_over = False
+ 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:
+ 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
+ # 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, 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
-
- if player.check_collision(maze, dx, dy, TILE_WIDTH, TILE_HEIGHT):
- player.x += dx
- player.y += dy
- player.x %= 900
+ game_state.pacman.direction = DIRECTION.DOWN
+ if game_state.pacman.check_collision(game_state, dx, dy, TILE_WIDTH, TILE_HEIGHT):
+ game_state.pacman.x += dx
+ game_state.pacman.y += dy
+ game_state.pacman.x %= 900 # logic for portal
# Move ghosts
- blinky.move(maze.maze, player, screen, is_game_over)
- pinky.move(maze.maze, player, screen, is_game_over)
- inky.move(maze.maze, player, screen, is_game_over)
- clyde.move(maze.maze, player, screen, is_game_over)
+ 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)
-
- # Draw the player and the ghosts
- player.draw(screen, counter)
- blinky.draw(screen)
- pinky.draw(screen)
- inky.draw(screen)
- clyde.draw(screen)
+ game_state.map.draw_map(screen)
+ # 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)
- # Update the screen
- pygame.display.flip()
-
- # Quit Pygame
-
- #pygame.quit()
- screen = pygame.display.set_mode((1280, 720))
- pygame.mixer.music.stop()
- siren_sound.stop()
-
+ if game_state.food == 246:
+ self.show_wining_screen(screen, game_state, sprites)
+ if not game_state.is_pacman_alive:
+ self.show_gameover_screen(
+ screen, game_state, sprites)
+ game_state.is_pacman_alive = True
+ else:
+ # Update the screen
+ pygame.display.flip()
+ # Quit Pygame
+ print(game_state.score)
+ pygame.quit()