def __init__(self, screen, row, col, maze): super(Player, self).__init__() self.screen = screen self.s_rect = screen.get_rect() self.im = PhotoRect(screen, "character\\character_up\\character_up_1", 64, 64) self.im.rect.centerx = col*64 + 32 self.im.rect.centery = row*64 + 32 self.maze = maze self.rect = self.im.rect self.moving_up = False self.moving_down = False self.moving_right = False self.moving_left = False self.speed = 64 self.state = 1 self.death_state = 1 self.dir = "right" self.speed_timer = pygame.time.get_ticks() self.row = row self.col = col self.walls = ['T', 'B', 'R', 'L', 'G', 'M', 'N', 'O', 'Y', 'Z', 'W', 'X', 'S'] self.dead = False self.sound_timer = pygame.time.get_ticks() self.finished = False
def __init__(self): pygame.init() pygame.mixer.init() self.screen = pygame.display.set_mode((896, 896)) self.screen_rect = self.screen.get_rect() self.font = pygame.font.Font(None, 50) self.font2 = pygame.font.Font(None, 25) self.won = False self.lost = False pygame.display.set_caption("Bobby The Destroyer") self.clock = pygame.time.Clock() this_folder = os.path.dirname(os.path.abspath(__file__)) my_file = os.path.join(this_folder, 'maze_old.txt') self.level = Level(self.screen, my_file) self.player = Player(self.screen, 1, 1, self.level) self.guard = Guard(self.screen, 12, 1, self.player, self.level) self.bombs = [] self.numfin = 0 self.bombs.append(Bomb(self.screen, 3, 5, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 3, 8, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 10, 7, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 10, 6, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 12, 2, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 12, 10, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 7, 3, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 7, 10, self.player, self.guard)) self.game_active = True self.bg = PhotoRect(self.screen, "background", 896, 896)
def __init__(self, screen, row, col, player, level): self.row = row self.col = col self.screen = screen self.goal_col = 12 # [m] self.goal_row = 12 # [m] self.matrix_size = 1.0 # [m] self.rob_size = 0.0 # [m] self.player = player self.level = level self.velocity = 120 self.pathx, self.pathy = [], [] self.ph = PhotoRect(self.screen, "enemy\\enemy_down\\enemy_down_1", 64, 64) self.ph.rect.centerx = col * 64 + 32 self.ph.rect.centery = row * 64 + 32 self.rect = self.ph.rect self.obs_xpos = [] self.obs_ypos = [] self.prow1 = 12 self.pcol1 = 1 self.prow2 = 12 self.pcol2 = 12 self.prow3 = 8 self.pcol3 = 12 self.prow4 = 8 self.pcol4 = 1 self.anim_timer = pygame.time.get_ticks() self.state = 1 self.speed_timer = pygame.time.get_ticks() self.prepare() self.seen = False
class Bomb(Sprite): def __init__(self, screen, row, col, pla, guard): super(Bomb, self).__init__() self.player = pla self.guard = guard self.screen = screen self.s_rect = screen.get_rect() self.im = PhotoRect(screen, "bomb\\bomb_0", 64, 64) self.im.rect.centerx = col * 64 + 32 self.im.rect.centery = row * 64 + 32 self.rect = self.im.rect self.row = row self.col = col self.timer = pygame.time.get_ticks() self.finished = False self.detonating = False self.stepped = False self.state = 1 def boom(self): if not self.finished: if self.player.col == self.col and self.player.row == self.row and not self.stepped: self.stepped = True self.timer = pygame.time.get_ticks() elif self.stepped and pygame.time.get_ticks() - self.timer >= 200 and not self.detonating: self.detonating = True self.timer = pygame.time.get_ticks() # Check guards for if they hear it in this spot self.guard.get_path(self.row, self.col) self.guard.faster() elif self.detonating and pygame.time.get_ticks() - self.timer >= 100: self.timer = pygame.time.get_ticks() temp = "bomb\\bomb_" + str(self.state) self.rect = self.im.rect self.im = PhotoRect(self.screen, temp, 64, 64) self.im.rect = self.rect if self.state >= 10: self.finished = True # Manipulate finishing game else: self.state += 1 def blitme(self): if not self.finished: self.im.blitme()
def __init__(self, screen, row, col, pla, guard): super(Bomb, self).__init__() self.player = pla self.guard = guard self.screen = screen self.s_rect = screen.get_rect() self.im = PhotoRect(screen, "bomb\\bomb_0", 64, 64) self.im.rect.centerx = col * 64 + 32 self.im.rect.centery = row * 64 + 32 self.rect = self.im.rect self.row = row self.col = col self.timer = pygame.time.get_ticks() self.finished = False self.detonating = False self.stepped = False self.state = 1
def update(self): if pygame.time.get_ticks() - self.speed_timer >= self.velocity: self.speed_timer = pygame.time.get_ticks() if self.row == self.player.row and self.col == self.player.col: self.player.dead = True if self.row == self.goal_row and self.col == self.goal_col: if self.seen: self.seen = False if self.row == self.prow1 and self.col == self.pcol1: self.get_path(self.prow2, self.pcol2) elif self.row == self.prow2 and self.col == self.pcol2: self.get_path(self.prow3, self.pcol3) elif self.row == self.prow3 and self.col == self.pcol3: self.get_path(self.prow4, self.pcol4) elif self.row == self.prow4 and self.col == self.pcol4: self.get_path(self.prow1, self.pcol1) else: self.get_path(self.prow1, self.pcol1) self.col = self.pathx.pop() self.row = self.pathy.pop() self.ph.rect.centerx = self.col * 64 + 32 self.ph.rect.centery = self.row * 64 + 32 self.rect = self.ph.rect elif self.row != self.goal_row or self.col != self.goal_col: self.col = self.pathx.pop() self.row = self.pathy.pop() self.ph.rect.centerx = self.col * 64 + 32 self.ph.rect.centery = self.row * 64 + 32 self.rect = self.ph.rect if pygame.time.get_ticks() - self.anim_timer >= 10: self.anim_timer = pygame.time.get_ticks() if self.state < 10: self.state += 1 else: self.state = 1 temp = "enemy\\enemy_down\\enemy_down_" + str(self.state) self.rect = self.ph.rect self.ph = PhotoRect(self.screen, temp, 64, 64) self.ph.rect = self.rect
def boom(self): if not self.finished: if self.player.col == self.col and self.player.row == self.row and not self.stepped: self.stepped = True self.timer = pygame.time.get_ticks() elif self.stepped and pygame.time.get_ticks() - self.timer >= 200 and not self.detonating: self.detonating = True self.timer = pygame.time.get_ticks() # Check guards for if they hear it in this spot self.guard.get_path(self.row, self.col) self.guard.faster() elif self.detonating and pygame.time.get_ticks() - self.timer >= 100: self.timer = pygame.time.get_ticks() temp = "bomb\\bomb_" + str(self.state) self.rect = self.im.rect self.im = PhotoRect(self.screen, temp, 64, 64) self.im.rect = self.rect if self.state >= 10: self.finished = True # Manipulate finishing game else: self.state += 1
def __init__(self, screen, levelfile): self.screen = screen self.filename = levelfile with open(self.filename, 'r') as f: self.rows = f.read().splitlines() self.mblocks = [] sz = Level.WALL_SIZE self.mblock = PhotoRect(screen, "block", sz, sz) self.deltax = self.deltay = sz self.build()
class Player(Sprite): def __init__(self, screen, row, col, maze): super(Player, self).__init__() self.screen = screen self.s_rect = screen.get_rect() self.im = PhotoRect(screen, "character\\character_up\\character_up_1", 64, 64) self.im.rect.centerx = col*64 + 32 self.im.rect.centery = row*64 + 32 self.maze = maze self.rect = self.im.rect self.moving_up = False self.moving_down = False self.moving_right = False self.moving_left = False self.speed = 64 self.state = 1 self.death_state = 1 self.dir = "right" self.speed_timer = pygame.time.get_ticks() self.row = row self.col = col self.walls = ['T', 'B', 'R', 'L', 'G', 'M', 'N', 'O', 'Y', 'Z', 'W', 'X', 'S'] self.dead = False self.sound_timer = pygame.time.get_ticks() self.finished = False def update(self): temp = "" if not self.dead: if self.moving_up and pygame.time.get_ticks() - self.speed_timer >= 100: temp = self.maze.rows[self.row-1] val = temp[self.col] if val not in self.walls: self.im.rect.y -= self.speed self.row -= 1 self.im.blitme() self.speed_timer = pygame.time.get_ticks() self.dir = 'up' temp = "character\\character_up\\character_up_" + str(self.state) elif self.moving_down and pygame.time.get_ticks() - self.speed_timer >= 100: temp = self.maze.rows[self.row+1] val = temp[self.col] if val not in self.walls: self.row += 1 self.im.rect.y += self.speed self.im.blitme() self.speed_timer = pygame.time.get_ticks() self.dir = 'down' temp = "character\\character_down\\character_down_" + str(self.state) elif self.moving_right and pygame.time.get_ticks() - self.speed_timer >= 100: temp = self.maze.rows[self.row] if self.col < 27: val = temp[self.col+1] else: val = temp[0] if val not in self.walls: self.im.rect.x += self.speed self.col += 1 self.im.blitme() self.speed_timer = pygame.time.get_ticks() self.dir = 'right' temp = "character\\character_right\\character_right_" + str(self.state) elif self.moving_left and pygame.time.get_ticks() - self.speed_timer >= 100: temp = self.maze.rows[self.row] val = temp[self.col-1] if val not in self.walls: self.im.rect.x -= self.speed self.col -= 1 self.im.blitme() self.speed_timer = pygame.time.get_ticks() self.dir = 'left' temp = "character\\character_left\\character_left_" + str(self.state) elif not (self.moving_left or self.moving_right or self.moving_up or self.moving_down) \ and pygame.time.get_ticks() - self.speed_timer >= 100: temp = "character\\character_" + self.dir + "\\character_" + self.dir + "_1" self.state = 1 else: return temp self.rect = self.im.rect self.im = PhotoRect(self.screen, temp, 64, 64) self.im.rect = self.rect if self.state >= 6: self.state = 1 else: self.state += 1 else: self.finished = True def blitme(self): self.im.blitme()
def update(self): temp = "" if not self.dead: if self.moving_up and pygame.time.get_ticks() - self.speed_timer >= 100: temp = self.maze.rows[self.row-1] val = temp[self.col] if val not in self.walls: self.im.rect.y -= self.speed self.row -= 1 self.im.blitme() self.speed_timer = pygame.time.get_ticks() self.dir = 'up' temp = "character\\character_up\\character_up_" + str(self.state) elif self.moving_down and pygame.time.get_ticks() - self.speed_timer >= 100: temp = self.maze.rows[self.row+1] val = temp[self.col] if val not in self.walls: self.row += 1 self.im.rect.y += self.speed self.im.blitme() self.speed_timer = pygame.time.get_ticks() self.dir = 'down' temp = "character\\character_down\\character_down_" + str(self.state) elif self.moving_right and pygame.time.get_ticks() - self.speed_timer >= 100: temp = self.maze.rows[self.row] if self.col < 27: val = temp[self.col+1] else: val = temp[0] if val not in self.walls: self.im.rect.x += self.speed self.col += 1 self.im.blitme() self.speed_timer = pygame.time.get_ticks() self.dir = 'right' temp = "character\\character_right\\character_right_" + str(self.state) elif self.moving_left and pygame.time.get_ticks() - self.speed_timer >= 100: temp = self.maze.rows[self.row] val = temp[self.col-1] if val not in self.walls: self.im.rect.x -= self.speed self.col -= 1 self.im.blitme() self.speed_timer = pygame.time.get_ticks() self.dir = 'left' temp = "character\\character_left\\character_left_" + str(self.state) elif not (self.moving_left or self.moving_right or self.moving_up or self.moving_down) \ and pygame.time.get_ticks() - self.speed_timer >= 100: temp = "character\\character_" + self.dir + "\\character_" + self.dir + "_1" self.state = 1 else: return temp self.rect = self.im.rect self.im = PhotoRect(self.screen, temp, 64, 64) self.im.rect = self.rect if self.state >= 6: self.state = 1 else: self.state += 1 else: self.finished = True
class Guard: def __init__(self, screen, row, col, player, level): self.row = row self.col = col self.screen = screen self.goal_col = 12 # [m] self.goal_row = 12 # [m] self.matrix_size = 1.0 # [m] self.rob_size = 0.0 # [m] self.player = player self.level = level self.velocity = 120 self.pathx, self.pathy = [], [] self.ph = PhotoRect(self.screen, "enemy\\enemy_down\\enemy_down_1", 64, 64) self.ph.rect.centerx = col * 64 + 32 self.ph.rect.centery = row * 64 + 32 self.rect = self.ph.rect self.obs_xpos = [] self.obs_ypos = [] self.prow1 = 12 self.pcol1 = 1 self.prow2 = 12 self.pcol2 = 12 self.prow3 = 8 self.pcol3 = 12 self.prow4 = 8 self.pcol4 = 1 self.anim_timer = pygame.time.get_ticks() self.state = 1 self.speed_timer = pygame.time.get_ticks() self.prepare() self.seen = False def prepare(self): for i in range(13): self.obs_xpos.append(i) self.obs_ypos.append(0.0) for i in range(13): self.obs_xpos.append(13.0) self.obs_ypos.append(i) for i in range(14): self.obs_xpos.append(i) self.obs_ypos.append(13.0) for i in range(14): self.obs_xpos.append(0.0) self.obs_ypos.append(i) ####################################################### for i in range(1): self.obs_xpos.append(12) self.obs_ypos.append(i + 7) ####################################################### for i in range(1): self.obs_xpos.append(11) self.obs_ypos.append(i + 11) for i in range(4): self.obs_xpos.append(11) self.obs_ypos.append(i + 2) ####################################################### for i in range(1): self.obs_xpos.append(10) self.obs_ypos.append(i + 11) for i in range(1): self.obs_xpos.append(10) self.obs_ypos.append(i + 9) for i in range(4): self.obs_xpos.append(10) self.obs_ypos.append(i + 2) ###################################################### for i in range(1): self.obs_xpos.append(9) self.obs_ypos.append(i + 11) for i in range(1): self.obs_xpos.append(9) self.obs_ypos.append(i + 9) ####################################################### for i in range(4): self.obs_xpos.append(8) self.obs_ypos.append(i + 4) for i in range(1): self.obs_xpos.append(8) self.obs_ypos.append(i + 2) ######################################################## for i in range(1): self.obs_xpos.append(7) self.obs_ypos.append(i + 11) for i in range(1): self.obs_xpos.append(7) self.obs_ypos.append(i + 9) for i in range(1): self.obs_xpos.append(7) self.obs_ypos.append(i + 6) for i in range(1): self.obs_xpos.append(7) self.obs_ypos.append(i + 2) ####################################################### for i in range(1): self.obs_xpos.append(6) self.obs_ypos.append(i + 11) for i in range(1): self.obs_xpos.append(6) self.obs_ypos.append(i + 9) for i in range(1): self.obs_xpos.append(6) self.obs_ypos.append(i + 6) for i in range(1): self.obs_xpos.append(6) self.obs_ypos.append(i + 2) ######################################################### for i in range(4): self.obs_xpos.append(5) self.obs_ypos.append(i + 4) for i in range(1): self.obs_xpos.append(5) self.obs_ypos.append(i + 2) ######################################################### for i in range(1): self.obs_xpos.append(4) self.obs_ypos.append(i + 11) for i in range(1): self.obs_xpos.append(4) self.obs_ypos.append(i + 9) ########################################################## for i in range(1): self.obs_xpos.append(3) self.obs_ypos.append(i + 11) for i in range(1): self.obs_xpos.append(3) self.obs_ypos.append(i + 9) for i in range(4): self.obs_xpos.append(3) self.obs_ypos.append(i + 2) ########################################################## for i in range(1): self.obs_xpos.append(2) self.obs_ypos.append(i + 11) for i in range(4): self.obs_xpos.append(2) self.obs_ypos.append(i + 2) ########################################################## for i in range(1): self.obs_xpos.append(1) self.obs_ypos.append(i + 7) self.get_path(self.goal_row, self.goal_col) def get_path(self, grow, gcol): self.goal_col, self.goal_row = gcol, grow self.pathx, self.pathy = a_star_alg(self.col, self.row, gcol, grow, self.obs_xpos, self.obs_ypos, self.matrix_size, self.rob_size) def update(self): if pygame.time.get_ticks() - self.speed_timer >= self.velocity: self.speed_timer = pygame.time.get_ticks() if self.row == self.player.row and self.col == self.player.col: self.player.dead = True if self.row == self.goal_row and self.col == self.goal_col: if self.seen: self.seen = False if self.row == self.prow1 and self.col == self.pcol1: self.get_path(self.prow2, self.pcol2) elif self.row == self.prow2 and self.col == self.pcol2: self.get_path(self.prow3, self.pcol3) elif self.row == self.prow3 and self.col == self.pcol3: self.get_path(self.prow4, self.pcol4) elif self.row == self.prow4 and self.col == self.pcol4: self.get_path(self.prow1, self.pcol1) else: self.get_path(self.prow1, self.pcol1) self.col = self.pathx.pop() self.row = self.pathy.pop() self.ph.rect.centerx = self.col * 64 + 32 self.ph.rect.centery = self.row * 64 + 32 self.rect = self.ph.rect elif self.row != self.goal_row or self.col != self.goal_col: self.col = self.pathx.pop() self.row = self.pathy.pop() self.ph.rect.centerx = self.col * 64 + 32 self.ph.rect.centery = self.row * 64 + 32 self.rect = self.ph.rect if pygame.time.get_ticks() - self.anim_timer >= 10: self.anim_timer = pygame.time.get_ticks() if self.state < 10: self.state += 1 else: self.state = 1 temp = "enemy\\enemy_down\\enemy_down_" + str(self.state) self.rect = self.ph.rect self.ph = PhotoRect(self.screen, temp, 64, 64) self.ph.rect = self.rect def sight(self): if not self.player.dead and not self.seen: if self.player.row == self.row: if self.player.col < self.col: for x in range(self.player.col, int(self.col)): if self.level.rows[int(self.row)][x] == 'M': return False self.seen = True self.get_path(self.player.row, self.player.col) elif self.player.col > self.col: for x in range(int(self.col), self.player.col): if self.level.rows[int(self.row)][x] == 'M': return False self.seen = True self.get_path(self.player.row, self.player.col) elif self.player.col == self.col: if self.player.row < self.row: for x in range(self.player.row, int(self.row)): if self.level.rows[x][int(self.col)] == 'M': return False self.seen = True self.get_path(self.player.row, self.player.col) elif self.player.row > self.row: for x in range(int(self.row), self.player.row): if self.level.rows[x][int(self.col)] == 'M': return False self.seen = True self.get_path(self.player.row, self.player.col) def faster(self): self.velocity = self.velocity * 0.8 def blitme(self): self.ph.blitme()
class Game: BLACK = (47, 47, 47) def __init__(self): pygame.init() pygame.mixer.init() self.screen = pygame.display.set_mode((896, 896)) self.screen_rect = self.screen.get_rect() self.font = pygame.font.Font(None, 50) self.font2 = pygame.font.Font(None, 25) self.won = False self.lost = False pygame.display.set_caption("Bobby The Destroyer") self.clock = pygame.time.Clock() this_folder = os.path.dirname(os.path.abspath(__file__)) my_file = os.path.join(this_folder, 'maze_old.txt') self.level = Level(self.screen, my_file) self.player = Player(self.screen, 1, 1, self.level) self.guard = Guard(self.screen, 12, 1, self.player, self.level) self.bombs = [] self.numfin = 0 self.bombs.append(Bomb(self.screen, 3, 5, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 3, 8, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 10, 7, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 10, 6, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 12, 2, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 12, 10, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 7, 3, self.player, self.guard)) self.bombs.append(Bomb(self.screen, 7, 10, self.player, self.guard)) self.game_active = True self.bg = PhotoRect(self.screen, "background", 896, 896) def update_screen(self): self.screen.fill(Game.BLACK) if self.player.finished: self.game_active = False elif self.numfin == 8: self.game_active = False surface = self.font.render("YOU WIN!", True, (255, 255, 255)) text_rect = surface.get_rect(center=(self.screen_rect.centerx, self.screen_rect.centerx)) self.screen.blit(surface, text_rect) if self.game_active: self.bg.blitme() self.level.blitme() self.player.update() self.player.blitme() self.guard.sight() # added this self.guard.update() self.guard.blitme() for b in self.bombs: b.boom() b.blitme() if b.finished: self.numfin += 1 self.bombs.remove(b) elif self.player.dead: surface = self.font.render("GAME OVER", True, (255, 255, 255)) text_rect = surface.get_rect(center=(self.screen_rect.centerx, self.screen_rect.centerx)) self.screen.blit(surface, text_rect) pygame.display.flip() def play(self): loop = GameLoop(self.player, self.level) while not loop.finished: loop.check_events() self.update_screen() self.clock.tick(60) self.won = loop.won