aboutsummaryrefslogtreecommitdiff
path: root/src/ghost.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ghost.py')
-rw-r--r--src/ghost.py49
1 files changed, 38 insertions, 11 deletions
diff --git a/src/ghost.py b/src/ghost.py
index e4b4cf1..8568ff4 100644
--- a/src/ghost.py
+++ b/src/ghost.py
@@ -1,7 +1,9 @@
import pygame
+import time
import random
import math
from util import get_sprites
+from timer import Timer
from settings import settings
from mode import MODE
from direction import DIRECTION
@@ -24,6 +26,7 @@ class Ghost():
self.color = color
self.last_move = 3 # this represents the direction based on the dx, dy arrays
self.speed = 3
+ self.timer = None
self.mode = MODE.SCATTERED
def in_bounds(self, pos):
@@ -34,7 +37,6 @@ class Ghost():
return abs(next_pos[0] - tx) + abs(next_pos[1] - ty)
# checks if the current position of pacman is either a dot, big dot or free
-
def is_valid(self, maze, x, y):
if x >= 0 and x < 30: # Necessary to make portals work
is_dot = maze[y][x] == Map.D
@@ -46,6 +48,9 @@ class Ghost():
def get_default_tile(self):
return (75, 75)
+ def get_intial_tile(self):
+ return (12 * 30 + 15, 12 * 30 + 15)
+
# checks collision with pacman and obstacles returns false if there is
# a collision and true otherwise
@@ -63,7 +68,20 @@ class Ghost():
return True
- def get_next_move(self, pacman, maze, screen, blinky):
+ def check_pacman_collision(self, game_state):
+ if game_state.pacman.powerup and abs(game_state.pacman.x - self.x) <= 30 and abs(game_state.pacman.y - self.y) <= 30:
+ initial_position = self.get_intial_tile()
+ self.mode = MODE.EATEN
+ self.timer = Timer(2 * 1000)
+ time.sleep(1)
+ game_state.score += 200
+ self.x = initial_position[0]
+ self.y = initial_position[1]
+ elif not game_state.pacman.powerup and abs(game_state.pacman.x - self.x) <= 30 and abs(game_state.pacman.y - self.y) <= 30:
+ if abs(game_state.pacman.x - self.x) <= 30 and abs(game_state.pacman.y - self.y) <= 30:
+ game_state.is_pacman_alive = False
+
+ def get_next_move(self, game_state, screen):
default_tile = self.get_default_tile()
@@ -73,28 +91,33 @@ class Ghost():
rand_pos = (0, 0)
- if pacman.powerup:
+ if game_state.pacman.powerup and self.mode != MODE.EATEN:
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])
+ elif self.mode == MODE.EATEN:
+ pos = self.get_intial_tile()
+ self.x = pos[0]
+ self.y = 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 +131,9 @@ 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):
+ self.check_pacman_collision(game_state)
+ 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
@@ -120,6 +142,11 @@ class Ghost():
self.last_move = min_idx
def draw(self, screen, powerup, counter):
+ if self.timer is not None:
+ elapsed_time = pygame.time.get_ticks() - self.timer.start
+ if elapsed_time > self.timer.duration:
+ self.mode = MODE.CHASING
+
radius = 30 // 2
pos = (self.x - radius, self.y - radius)
if powerup: