diff --git a/Pac-Man.py b/Pac-Man.py index d83362e..f6e6304 100644 --- a/Pac-Man.py +++ b/Pac-Man.py @@ -1,54 +1,61 @@ import os import sys import pygame +import Spirits pygame.init() pygame.key.set_repeat(200, 70) - - -FPS = 50 +FPS = 60 WIDTH = 24 * 28 HEIGHT = 24 * 34 STEP = 24 karta = [] - +dots = 0 +score = 0 +pac = 'pacman.jpg' screen = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() player = None - -# группы спрайтов +pill = False +t = 0 +killed_spirits = 1 +red_eat = False +pink_eat = False +blue_eat = False +orange_eat = False all_sprites = pygame.sprite.Group() tiles_group = pygame.sprite.Group() player_group = pygame.sprite.Group() +dots_group = pygame.sprite.Group() -def load_image(name, colorkey=None): +def load_image(name, color_key=None): fullname = os.path.join('data', name) - image = pygame.image.load(fullname).convert() - if colorkey is not None: - if colorkey == -1: + try: + image = pygame.image.load(fullname).convert() + except pygame.error as message: + print('Cannot load image:', name) + raise SystemExit(message) + if color_key is not None: + if color_key == -1: color_key = image.get_at((0, 0)) image.set_colorkey(color_key) else: image = image.convert_alpha() return image + def load_level(filename): filename = "data/" + filename - # читаем уровень, убирая символы перевода строки with open(filename, 'r') as mapFile: level_map = [line.strip() for line in mapFile] - - # и подсчитываем максимальную длину max_width = max(map(len, level_map)) - - # дополняем каждую строку пустыми клетками ('.') return list(map(lambda x: x.ljust(max_width, '.'), level_map)) + def generate_level(level): global karta s = [] - new_player, x, y = None, None, None for y in range(len(level)): for x in range(len(level[y])): if level[y][x] == '.': @@ -79,27 +86,51 @@ def generate_level(level): Tile('right_down', x, y) s.append('1') elif level[y][x] == '@': - new_player = Player(x, y, 25, 14) + new_player = Pacman(x, y, 25, 14) + s.append('.') + elif level[y][x] == 'd': + Dot(x, y) + s.append('.') + elif level[y][x] == 'D': + Big_Dot(x, y) s.append('.') if len(s) == 28: karta.append(s) s = [] - # вернем игрока, а также размер поля в клетках + karta[16][22] = 'x' + karta[16][5] = 'x' + karta[14][14] = 'S' + karta[15][15] = '1' + karta[16][15] = 'O' + karta[17][15] = '1' + karta[16][13] = 'B' + karta[17][13] = '1' + karta[17][14] = '1' + karta[15][11] = '1' + karta[15][12] = '1' + karta[15][13] = '1' + karta[15][16] = '1' + karta[17][11] = '1' + karta[17][12] = '1' + karta[17][16] = '1' + karta[16][11] = '1' for elem in karta: print(elem) return new_player, x, y + def terminate(): pygame.quit() sys.exit() + def start_screen(): intro_text = ["ЗАСТАВКА", "", "Правила игры", "Если в правилах несколько строк,", "приходится выводить их построчно"] - fon = pygame.transform.scale(load_image('pacman.jpg'), (WIDTH, HEIGHT)) + fon = pygame.transform.scale(load_image('fon.png'), (WIDTH, HEIGHT)) screen.blit(fon, (0, 0)) font = pygame.font.Font(None, 30) text_coord = 50 @@ -117,15 +148,22 @@ def start_screen(): if event.type == pygame.QUIT: terminate() elif event.type == pygame.KEYDOWN or event.type == pygame.MOUSEBUTTONDOWN: - return # начинаем игру + return pygame.display.flip() clock.tick(FPS) + tile_images = {'empty': load_image('black.jpg'), 'vert': load_image('vert.jpg'), 'hor': load_image('hor.jpg'), 'left_up': load_image('left_up.jpg'), 'left_down': load_image('left_down.jpg'), 'right_up': load_image('right_up.jpg'), 'right_down': load_image('right_down.jpg'), 'vert2': load_image('vert2.jpg'), 'hor2': load_image('hor2.jpg')} player_image = load_image('pacman.jpg') +blinky_image = load_image('blinky_1.jpg') +pinky_image = load_image('pinky_1.jpg') +clyde_image = load_image('clyde_1.jpg') +inky_image = load_image('inky_1.jpg') +dot_image = load_image('dot.jpg') +big_dot_image = load_image('big_dot.jpg') tile_width = tile_height = 24 @@ -136,41 +174,576 @@ def __init__(self, tile_type, pos_x, pos_y): self.rect = self.image.get_rect().move(tile_width * pos_x, tile_height * pos_y) -class Player(pygame.sprite.Sprite): +class Pacman(pygame.sprite.Sprite): def __init__(self, pos_x, pos_y, choord_x, choord_y): super().__init__(player_group, all_sprites) self.image = player_image self.choord_x = choord_x self.choord_y = choord_y - self.rect = self.image.get_rect().move(tile_width * pos_x - 10, tile_height * pos_y - 10) + self.im = 0 + self.rect = self.image.get_rect().move(tile_width * pos_x - 8, tile_height * pos_y - 8) + self.mask = pygame.mask.from_surface(self.image) + + def update(self): + global pac + global score + global pill + global killed_spirits + global red_eat + global blue_eat + global pink_eat + global orange_eat + if (self.im // 10) % 2 == 0: + self.image = load_image(pac) + self.im += 1 + else: + self.image = load_image('pacman2.jpg') + self.im += 1 + if pygame.sprite.collide_mask(self, blinky_red_spirit): + if pill: + global blinky_last_position + global min_way_red + global k_red + k_red = 0 + blinky_last_position = 'LEFT' + min_way_red = 'RIGHT' + blinky_red_spirit.choord_y = 14 + blinky_red_spirit.choord_x = 13 + blinky_red_spirit.rect.x = STEP * 14 - 10 + blinky_red_spirit.rect.y = STEP * 13 - 10 + if not red_eat: + score += (2 ** killed_spirits) * 100 + if killed_spirits == 4: + killed_spirits = 0 + else: + killed_spirits += 1 + red_eat = True + else: + self.kill() + terminate() + if pygame.sprite.collide_mask(self, pinky_pink_spirit): + if pill: + global pinky_last_position + global min_way_pink + global k_pink + k_pink = 0 + pinky_last_position = 'LEFT' + min_way_pink = 'RIGHT' + pinky_pink_spirit.choord_y = 14 + pinky_pink_spirit.choord_x = 13 + pinky_pink_spirit.rect.x = STEP * 14 - 10 + pinky_pink_spirit.rect.y = STEP * 13 - 10 + if not pink_eat: + score += (2 ** killed_spirits) * 100 + if killed_spirits == 4: + killed_spirits = 0 + else: + killed_spirits += 1 + pink_eat = True + else: + self.kill() + terminate() + if pygame.sprite.collide_mask(self, clyde_orange_spirit): + if pill: + global clyde_last_position + global min_way_orange + global k_orange + k_orange = 0 + clyde_last_position = 'LEFT' + min_way_orange = 'RIGHT' + clyde_orange_spirit.choord_y = 14 + clyde_orange_spirit.choord_x = 13 + clyde_orange_spirit.rect.x = STEP * 14 - 10 + clyde_orange_spirit.rect.y = STEP * 13 - 10 + if not orange_eat: + score += (2 ** killed_spirits) * 100 + if killed_spirits == 4: + killed_spirits = 0 + else: + killed_spirits += 1 + orange_eat = True + else: + self.kill() + terminate() + if pygame.sprite.collide_mask(self, inky_blue_spirit): + if pill: + global inky_last_position + global min_way_blue + global k_blue + k_blue = 0 + inky_last_position = 'LEFT' + min_way_blue = 'RIGHT' + inky_blue_spirit.choord_y = 14 + inky_blue_spirit.choord_x = 13 + inky_blue_spirit.rect.x = STEP * 14 - 10 + inky_blue_spirit.rect.y = STEP * 13 - 10 + if not blue_eat: + score += (2 ** killed_spirits) * 100 + if killed_spirits == 4: + killed_spirits = 0 + else: + killed_spirits += 1 + blue_eat = True + else: + self.kill() + terminate() +class Dot(pygame.sprite.Sprite): + def __init__(self, pos_x, pos_y): + super().__init__(dots_group, all_sprites) + self.image = dot_image + self.rect = self.image.get_rect().move(tile_width * pos_x, tile_height * pos_y) + self.mask = pygame.mask.from_surface(self.image) + + def update(self): + global score + global dots + if pygame.sprite.collide_mask(self, player): + dots += 1 + score += 10 + print(dots, score) + self.kill() + if dots == 244: + generate_level('map2.txt') + + +class Big_Dot(pygame.sprite.Sprite): + def __init__(self, pos_x, pos_y): + super().__init__(dots_group, all_sprites) + self.image = big_dot_image + self.rect = self.image.get_rect().move(tile_width * pos_x, tile_height * pos_y) + self.mask = pygame.mask.from_surface(self.image) + + def update(self): + global score + global pill + global dots + global killed_spirits + if pygame.sprite.collide_mask(self, player): + pygame.mixer.music.load('salo.mp3') + pygame.mixer.music.play() + pill = True + killed_spirits = 1 + dots += 1 + score += 50 + print(dots, score) + self.kill() + if dots == 244: + generate_level('map2.txt') + if pill: + global t + if t < 1500: + t += 1 + else: + t = 0 + pill = False + + +blinky_red_spirit = Spirits.Blinky(14, 13, 13, 14, blinky_image) +blinky_last_position = 'LEFT' +min_way_red = 'RIGHT' +red_terror = False +k_red = 0 +pinky_pink_spirit = Spirits.Pinky(14, 16, 16, 14, pinky_image) +pinky_last_position = 'DOWN' +min_way_pink = 'UP' +pink_terror = False +pinky_leave_home = False +k_pink = 0 +inky_blue_spirit = Spirits.Inky(11, 16, 16, 11, inky_image) +inky_last_position = 'LEFT' +min_way_blue = 'RIGHT' +inky_leave_home_1 = False +inky_leave_home_2 = False +blue_terror = False +k_blue = 0 +clyde_orange_spirit = Spirits.Clyde(16, 16, 16, 16, clyde_image) +clyde_last_position = 'RIGHT' +min_way_orange = 'LEFT' +clyde_leave_home_1 = True +clyde_leave_home_2 = True +orange_terror = False +k_orange = 0 start_screen() player, level_x, level_y = generate_level(load_level('map2.txt')) running = True +run_left = False +run_right = False +run_up = False +run_down = False +k = 0 +k_red = 0 while running: + if pill: + if not red_eat: + red_terror = True + blinky_red_spirit.image = load_image('dead_1.jpg') + else: + blinky_red_spirit.image = load_image('blinky_1.jpg') + red_terror = False + if not pink_eat: + pink_terror = True + pinky_pink_spirit.image = load_image('dead_1.jpg') + else: + pinky_pink_spirit.image = load_image('pinky_1.jpg') + pink_terror = False + if not blue_eat: + blue_terror = True + inky_blue_spirit.image = load_image('dead_1.jpg') + else: + inky_blue_spirit.image = load_image('inky_1.jpg') + blue_terror = False + if not orange_eat: + orange_terror = True + clyde_orange_spirit.image = load_image('dead_1.jpg') + else: + clyde_orange_spirit.image = load_image('clyde_1.jpg') + orange_terror = False + else: + red_terror = False + pink_terror = False + blue_terror = False + orange_terror = False + blinky_red_spirit.image = load_image('blinky_1.jpg') + pinky_pink_spirit.image = load_image('pinky_1.jpg') + clyde_orange_spirit.image = load_image('clyde_1.jpg') + inky_blue_spirit.image = load_image('inky_1.jpg') for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: - if player.choord_x == 16 and player.choord_y == 27 and event.key == pygame.K_RIGHT: - player.choord_y = 0 - player.rect.x -= STEP - if event.key == pygame.K_LEFT and karta[player.choord_x][player.choord_y - 1] == '.': - player.rect.x -= STEP - player.choord_y = player.choord_y - 1 - if event.key == pygame.K_RIGHT and karta[player.choord_x][player.choord_y + 1] == '.': - player.rect.x += STEP - player.choord_y = player.choord_y + 1 - if event.key == pygame.K_UP and karta[player.choord_x - 1][player.choord_y] == '.': - player.rect.y -= STEP - player.choord_x = player.choord_x - 1 - if event.key == pygame.K_DOWN and karta[player.choord_x + 1][player.choord_y] == '.': - player.rect.y += STEP - player.choord_x = player.choord_x + 1 + if event.key == pygame.K_LEFT and karta[player.choord_x][player.choord_y - 1] != '1' and not run_left: + if run_down: + player.rect.y -= k + elif run_up: + player.rect.y += k + elif run_right: + player.rect.x -= k + k = 0 + run_left = True + run_right = False + run_up = False + run_down = False + if event.key == pygame.K_RIGHT and karta[player.choord_x][player.choord_y + 1] != '1' and not run_right: + if run_down: + player.rect.y -= k + elif run_up: + player.rect.y += k + elif run_left: + player.rect.x += k + k = 0 + run_right = True + run_left = False + run_up = False + run_down = False + if event.key == pygame.K_UP and karta[player.choord_x - 1][player.choord_y] != '1' and not run_up: + if run_down: + player.rect.y -= k + elif run_left: + player.rect.x += k + elif run_right: + player.rect.x -= k + k = 0 + run_up = True + run_right = False + run_left = False + run_down = False + if event.key == pygame.K_DOWN and karta[player.choord_x + 1][player.choord_y] != '1' and not run_down: + if run_left: + player.rect.x += k + elif run_up: + player.rect.y += k + elif run_right: + player.rect.x -= k + k = 0 + run_down = True + run_right = False + run_up = False + run_left = False + if run_down and karta[player.choord_x + 1][player.choord_y] != '1': + player.rect.y += 1 + pac = 'pacman4.jpg' + k += 1 + if k == 24: + player.choord_x = player.choord_x + 1 + k = 0 + elif run_up and karta[player.choord_x - 1][player.choord_y] != '1': + player.rect.y -= 1 + pac = 'pacman3.jpg' + k += 1 + if k == 24: + player.choord_x = player.choord_x - 1 + k = 0 + elif run_left and karta[player.choord_x][player.choord_y - 1] != '1' and player.choord_y != 0: + player.rect.x -= 1 + pac = 'pacman5.jpg' + k += 1 + if k == 24: + player.choord_y = player.choord_y - 1 + k = 0 + elif run_right and player.choord_y != 27 and karta[player.choord_x][player.choord_y + 1] != '1': + player.rect.x += 1 + pac = 'pacman.jpg' + k += 1 + if k == 24: + player.choord_y = player.choord_y + 1 + k = 0 + elif player.choord_y == 0: + player.choord_y = 27 + player.rect.x += STEP * 27 + k = 0 + elif player.choord_y == 27: + player.choord_y = 0 + player.rect.x -= STEP * 27 + k = 0 + + # Движение Блинки (красный) + + blinky_red_spirit.get_a_mission(player.choord_x, player.choord_y, red_terror) + if min_way_red == 'UP': + blinky_last_position = 'DOWN' + blinky_red_spirit.rect.y -= 1 + k_red += 1 + if k_red == 24: + blinky_red_spirit.choord_x = blinky_red_spirit.choord_x - 1 + if karta[blinky_red_spirit.choord_x][blinky_red_spirit.choord_y] == '.': + possible_turns = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_red = blinky_red_spirit.folow(karta, blinky_last_position, + blinky_red_spirit.choord_x, blinky_red_spirit.choord_y, + blinky_red_spirit.mission[0], blinky_red_spirit.mission[1], + possible_turns) + k_red = 0 + elif min_way_red == 'DOWN': + blinky_last_position = 'UP' + blinky_red_spirit.rect.y += 1 + k_red += 1 + if k_red == 24: + blinky_red_spirit.choord_x = blinky_red_spirit.choord_x + 1 + if karta[blinky_red_spirit.choord_x][blinky_red_spirit.choord_y] == '.': + possible_turns = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_red = blinky_red_spirit.folow(karta, blinky_last_position, + blinky_red_spirit.choord_x, blinky_red_spirit.choord_y, + blinky_red_spirit.mission[0], blinky_red_spirit.mission[1], + possible_turns) + k_red = 0 + elif min_way_red == 'LEFT': + blinky_last_position = 'RIGHT' + blinky_red_spirit.rect.x -= 1 + k_red += 1 + if k_red == 24: + blinky_red_spirit.choord_y = blinky_red_spirit.choord_y - 1 + if karta[blinky_red_spirit.choord_x][blinky_red_spirit.choord_y] == '.': + possible_turns = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_red = blinky_red_spirit.folow(karta, blinky_last_position, + blinky_red_spirit.choord_x, blinky_red_spirit.choord_y, + blinky_red_spirit.mission[0], blinky_red_spirit.mission[1], + possible_turns) + k_red = 0 + elif min_way_red == 'RIGHT': + blinky_last_position = 'LEFT' + blinky_red_spirit.rect.x += 1 + k_red += 1 + if k_red == 24: + blinky_red_spirit.choord_y = blinky_red_spirit.choord_y + 1 + if karta[blinky_red_spirit.choord_x][blinky_red_spirit.choord_y] == '.': + possible_turns = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_red = blinky_red_spirit.folow(karta, blinky_last_position, + blinky_red_spirit.choord_x, blinky_red_spirit.choord_y, + blinky_red_spirit.mission[0], blinky_red_spirit.mission[1], + possible_turns) + k_red = 0 + + # Движение Пинки (розовый) + + if pinky_pink_spirit.choord_x == 13 and pinky_pink_spirit.choord_y == 14: + pinky_leave_home = True + + pinky_pink_spirit.get_a_mission(player.choord_x, player.choord_y, karta, pink_terror) + if min_way_pink == 'UP': + pinky_last_position = 'DOWN' + pinky_pink_spirit.rect.y -= 1 + k_pink += 1 + if k_pink == 24: + pinky_pink_spirit.choord_x = pinky_pink_spirit.choord_x - 1 + if karta[pinky_pink_spirit.choord_x][pinky_pink_spirit.choord_y] == '.': + possible_turns_pink = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_pink = pinky_pink_spirit.folow(karta, pinky_last_position, + pinky_pink_spirit.choord_x, pinky_pink_spirit.choord_y, + pinky_pink_spirit.mission[0], pinky_pink_spirit.mission[1], + possible_turns_pink, pinky_leave_home) + k_pink = 0 + elif min_way_pink == 'DOWN': + pinky_last_position = 'UP' + pinky_pink_spirit.rect.y += 1 + k_pink += 1 + if k_pink == 24: + pinky_pink_spirit.choord_x = pinky_pink_spirit.choord_x + 1 + if karta[pinky_pink_spirit.choord_x][pinky_pink_spirit.choord_y] == '.': + possible_turns_pink = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_pink = pinky_pink_spirit.folow(karta, pinky_last_position, + pinky_pink_spirit.choord_x, pinky_pink_spirit.choord_y, + pinky_pink_spirit.mission[0], pinky_pink_spirit.mission[1], + possible_turns_pink, pinky_leave_home) + k_pink = 0 + elif min_way_pink == 'LEFT': + pinky_last_position = 'RIGHT' + pinky_pink_spirit.rect.x -= 1 + k_pink += 1 + if k_pink == 24: + pinky_pink_spirit.choord_y = pinky_pink_spirit.choord_y - 1 + if karta[pinky_pink_spirit.choord_x][pinky_pink_spirit.choord_y] == '.': + possible_turns_pink = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_pink = pinky_pink_spirit.folow(karta, pinky_last_position, + pinky_pink_spirit.choord_x, pinky_pink_spirit.choord_y, + pinky_pink_spirit.mission[0], pinky_pink_spirit.mission[1], + possible_turns_pink, pinky_leave_home) + k_pink = 0 + elif min_way_pink == 'RIGHT': + pinky_last_position = 'LEFT' + pinky_pink_spirit.rect.x += 1 + k_pink += 1 + if k_pink == 24: + pinky_pink_spirit.choord_y = pinky_pink_spirit.choord_y + 1 + if karta[pinky_pink_spirit.choord_x][pinky_pink_spirit.choord_y] == '.': + possible_turns_pink = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_pink = pinky_pink_spirit.folow(karta, pinky_last_position, + pinky_pink_spirit.choord_x, pinky_pink_spirit.choord_y, + pinky_pink_spirit.mission[0], pinky_pink_spirit.mission[1], + possible_turns_pink, pinky_leave_home) + k_pink = 0 + + # Движение Клайда (Оранжевый) + if clyde_orange_spirit.choord_x == 16 and clyde_orange_spirit.choord_y == 14: + clyde_leave_home_1 = True + if clyde_orange_spirit.choord_x == 13 and clyde_orange_spirit.choord_y == 14: + clyde_leave_home_2 = True + + clyde_orange_spirit.get_a_mission(player.choord_x, player.choord_y, + clyde_orange_spirit.choord_x, clyde_orange_spirit.choord_y, orange_terror) + if min_way_orange == 'UP': + clyde_last_position = 'DOWN' + clyde_orange_spirit.rect.y -= 1 + k_orange += 1 + if k_orange == 24: + clyde_orange_spirit.choord_x = clyde_orange_spirit.choord_x - 1 + if karta[clyde_orange_spirit.choord_x][clyde_orange_spirit.choord_y] == '.': + possible_turns_orange = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_orange = clyde_orange_spirit.folow(karta, clyde_last_position, + clyde_orange_spirit.choord_x, clyde_orange_spirit.choord_y, + clyde_orange_spirit.mission[0], + clyde_orange_spirit.mission[1], + possible_turns_orange, clyde_leave_home_1, + clyde_leave_home_2) + k_orange = 0 + elif min_way_orange == 'DOWN': + clyde_last_position = 'UP' + clyde_orange_spirit.rect.y += 1 + k_orange += 1 + if k_orange == 24: + clyde_orange_spirit.choord_x = clyde_orange_spirit.choord_x + 1 + if karta[clyde_orange_spirit.choord_x][clyde_orange_spirit.choord_y] == '.': + possible_turns_orange = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_orange = clyde_orange_spirit.folow(karta, clyde_last_position, + clyde_orange_spirit.choord_x, clyde_orange_spirit.choord_y, + clyde_orange_spirit.mission[0], + clyde_orange_spirit.mission[1], + possible_turns_orange, clyde_leave_home_1, + clyde_leave_home_2) + k_orange = 0 + elif min_way_orange == 'LEFT': + clyde_last_position = 'RIGHT' + clyde_orange_spirit.rect.x -= 1 + k_orange += 1 + if k_orange == 24: + clyde_orange_spirit.choord_y = clyde_orange_spirit.choord_y - 1 + if karta[clyde_orange_spirit.choord_x][clyde_orange_spirit.choord_y] == '.': + possible_turns_orange = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_orange = clyde_orange_spirit.folow(karta, clyde_last_position, + clyde_orange_spirit.choord_x, clyde_orange_spirit.choord_y, + clyde_orange_spirit.mission[0], + clyde_orange_spirit.mission[1], + possible_turns_orange, clyde_leave_home_1, + clyde_leave_home_2) + k_orange = 0 + elif min_way_orange == 'RIGHT': + clyde_last_position = 'LEFT' + clyde_orange_spirit.rect.x += 1 + k_orange += 1 + if k_orange == 24: + clyde_orange_spirit.choord_y = clyde_orange_spirit.choord_y + 1 + if karta[clyde_orange_spirit.choord_x][clyde_orange_spirit.choord_y] == '.': + possible_turns_orange = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_orange = clyde_orange_spirit.folow(karta, clyde_last_position, + clyde_orange_spirit.choord_x, clyde_orange_spirit.choord_y, + clyde_orange_spirit.mission[0], + clyde_orange_spirit.mission[1], + possible_turns_orange, clyde_leave_home_1, + clyde_leave_home_2) + k_orange = 0 + + # Движение Инки (синий) + + inky_blue_spirit.get_a_mission(player.choord_x, player.choord_y, + blinky_red_spirit.choord_x, blinky_red_spirit.choord_y, blue_terror) + if min_way_blue == 'UP': + inky_last_position = 'DOWN' + inky_blue_spirit.rect.y -= 1 + k_blue += 1 + if k_blue == 24: + inky_blue_spirit.choord_x = inky_blue_spirit.choord_x - 1 + if karta[inky_blue_spirit.choord_x][inky_blue_spirit.choord_y] == '.': + possible_turns_blue = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_blue = inky_blue_spirit.folow(karta, inky_last_position, + inky_blue_spirit.choord_x, inky_blue_spirit.choord_y, + inky_blue_spirit.mission[0], inky_blue_spirit.mission[1], + possible_turns_blue, inky_leave_home_1, inky_leave_home_2) + k_blue = 0 + elif min_way_blue == 'DOWN': + inky_last_position = 'UP' + inky_blue_spirit.rect.y += 1 + k_blue += 1 + if k_blue == 24: + inky_blue_spirit.choord_x = inky_blue_spirit.choord_x + 1 + if karta[inky_blue_spirit.choord_x][inky_blue_spirit.choord_y] == '.': + possible_turns_blue = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_blue = inky_blue_spirit.folow(karta, inky_last_position, + inky_blue_spirit.choord_x, inky_blue_spirit.choord_y, + inky_blue_spirit.mission[0], inky_blue_spirit.mission[1], + possible_turns_blue, inky_leave_home_1, inky_leave_home_2) + k_blue = 0 + elif min_way_blue == 'LEFT': + inky_last_position = 'RIGHT' + inky_blue_spirit.rect.x -= 1 + k_blue += 1 + if k_blue == 24: + inky_blue_spirit.choord_y = inky_blue_spirit.choord_y - 1 + if karta[inky_blue_spirit.choord_x][inky_blue_spirit.choord_y] == '.': + possible_turns_blue = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_blue = inky_blue_spirit.folow(karta, inky_last_position, + inky_blue_spirit.choord_x, inky_blue_spirit.choord_y, + inky_blue_spirit.mission[0], inky_blue_spirit.mission[1], + possible_turns_blue, inky_leave_home_1, inky_leave_home_2) + k_blue = 0 + elif min_way_blue == 'RIGHT': + inky_last_position = 'LEFT' + inky_blue_spirit.rect.x += 1 + k_blue += 1 + if k_blue == 24: + inky_blue_spirit.choord_y = inky_blue_spirit.choord_y + 1 + if karta[inky_blue_spirit.choord_x][inky_blue_spirit.choord_y] == '.': + possible_turns_blue = ['UP', 'DOWN', 'LEFT', 'RIGHT'] + min_way_blue = inky_blue_spirit.folow(karta, inky_last_position, + inky_blue_spirit.choord_x, inky_blue_spirit.choord_y, + inky_blue_spirit.mission[0], inky_blue_spirit.mission[1], + possible_turns_blue, inky_leave_home_1, inky_leave_home_2) + k_blue = 0 screen.fill(pygame.Color(0, 0, 0)) tiles_group.draw(screen) + dots_group.draw(screen) player_group.draw(screen) + Spirits.spirits_group.draw(screen) + all_sprites.update() pygame.display.flip() clock.tick(FPS) terminate() \ No newline at end of file diff --git a/Spirits.py b/Spirits.py new file mode 100644 index 0000000..8de2fd6 --- /dev/null +++ b/Spirits.py @@ -0,0 +1,387 @@ +import os +import sys +import pygame +from random import randint + + +pygame.init() +all_sprites = pygame.sprite.Group() +spirits_group = pygame.sprite.Group() +tile_width = tile_height = 24 +STEP = 24 + + +class Blinky(pygame.sprite.Sprite): # TODO Блинки - Красный призрак TODO + def __init__(self, pos_x, pos_y, choord_x, choord_y, filename): + super().__init__(spirits_group, all_sprites) + self.mission = ('', '') + self.image = filename + self.choord_x = choord_x + self.choord_y = choord_y + self.pos_x = pos_x + self.pos_y = pos_y + self.rect = self.image.get_rect().move(tile_width * self.pos_x - 10, tile_height * self.pos_y - 10) + + def get_a_mission(self, choord_x, choord_y, red_terror): + if red_terror: + self.mission = (0, 25) + else: + self.mission = (choord_x, choord_y) + + def folow(self, karta, blinky_last_position, x, y, m_x, m_y, possible_turns): + x = int(x) + y = int(y) + for i in range(len(possible_turns)): + if possible_turns[i] == blinky_last_position: + del possible_turns[i] + break + if karta[x + 1][y] == '1' or karta[x + 1][y] == 'x' or karta[x + 1][y] == 'S': + for i in range(len(possible_turns)): + if possible_turns[i] == 'DOWN': + del possible_turns[i] + break + if karta[x - 1][y] == '1' or karta[x - 1][y] == 'x' or karta[x - 1][y] == 'S': + for i in range(len(possible_turns)): + if possible_turns[i] == 'UP': + del possible_turns[i] + break + if karta[x][y + 1] == '1' or karta[x][y + 1] == 'x' or karta[x][y + 1] == 'S': + for i in range(len(possible_turns)): + if possible_turns[i] == 'RIGHT': + del possible_turns[i] + break + if karta[x][y - 1] == '1' or karta[x][y - 1] == 'x' or karta[x][y - 1] == 'S': + for i in range(len(possible_turns)): + if possible_turns[i] == 'LEFT': + del possible_turns[i] + break + min_l = 999999999 + min_way = '' + if len(possible_turns) < 2: + min_way = possible_turns[0] + return min_way + else: + possible_turns_coords = list() + for turn in possible_turns: + if turn == 'UP': + sp_x, sp_y = x - 1, y + possible_turns_coords.append([sp_x, sp_y, 'UP']) + if turn == 'DOWN': + sp_x, sp_y = x + 1, y + possible_turns_coords.append([sp_x, sp_y, 'DOWN']) + if turn == 'LEFT': + sp_x, sp_y = x, y - 1 + possible_turns_coords.append([sp_x, sp_y, 'LEFT']) + if turn == 'RIGHT': + sp_x, sp_y = x, y + 1 + possible_turns_coords.append([sp_x, sp_y, 'RIGHT']) + for coords in possible_turns_coords: + m_y = int(m_y) + m_x = int(m_x) + coords[0] = int(coords[0]) + coords[1] = int(coords[1]) + l = (((m_x - coords[0]) ** 2) + (m_y - coords[1]) ** 2) ** 0.5 + if l < 0: + l += 2 * l + coords.append(l) + if l < min_l: + min_l = l + min_way = coords[2] + return min_way + + +class Pinky(pygame.sprite.Sprite): # TODO Пинки - Розовый призрак TODO + def __init__(self, pos_x, pos_y, choord_x, choord_y, filename): + super().__init__(spirits_group, all_sprites) + self.mission = ('', '') + self.image = filename + self.choord_x = choord_x + self.choord_y = choord_y + self.rect = self.image.get_rect().move(tile_width * pos_x - 10, tile_height * pos_y - 10) + + def get_a_mission(self, choord_x, choord_y, karta, pink_terror): + if pink_terror: + self.mission = (0, 2) + else: + min_m_x = int(choord_x) - 4 + if min_m_x < 3: + min_m_x = 3 + max_m_x = int(choord_x) + 4 + if max_m_x > 31: + max_m_x = 31 + min_m_y = int(choord_y) - 4 + if min_m_y < 1: + min_m_y = 1 + max_m_y = int(choord_y) + 4 + if max_m_y > 26: + max_m_y = 26 + m_x = randint(min_m_x, max_m_x) + m_y = randint(min_m_y, max_m_y) + while karta[m_x][m_y] == '1': + m_x = randint(min_m_x, max_m_x) + m_y = randint(min_m_y, max_m_y) + self.mission = (m_x, m_y) + + def folow(self, karta, pinky_last_position, x, y, m_x, m_y, possible_turns, pinky_leave_home): + x = int(x) + y = int(y) + for i in range(len(possible_turns)): + if possible_turns[i] == pinky_last_position: + del possible_turns[i] + break + if karta[x + 1][y] == '1' or karta[x + 1][y] == 'x' or karta[x + 1][y] == 'B' or karta[x + 1][y] == 'O': + for i in range(len(possible_turns)): + if possible_turns[i] == 'DOWN': + del possible_turns[i] + break + if karta[x - 1][y] == '1' or karta[x - 1][y] == 'x' or karta[x - 1][y] == 'B' or karta[x - 1][y] == 'O': + for i in range(len(possible_turns)): + if possible_turns[i] == 'UP': + del possible_turns[i] + break + if karta[x][y + 1] == '1' or karta[x][y + 1] == 'x' or karta[x][y + 1] == 'B' or karta[x][y + 1] == 'O': + for i in range(len(possible_turns)): + if possible_turns[i] == 'RIGHT': + del possible_turns[i] + break + if karta[x][y - 1] == '1' or karta[x][y - 1] == 'x' or karta[x][y - 1] == 'B' or karta[x][y - 1] == 'O': + for i in range(len(possible_turns)): + if possible_turns[i] == 'LEFT': + del possible_turns[i] + break + if pinky_leave_home: + if karta[x + 1][y] == 'S': + for i in range(len(possible_turns)): + if possible_turns[i] == 'DOWN': + del possible_turns[i] + break + min_l = 999999999 + min_way = '' + if len(possible_turns) < 2: + min_way = possible_turns[0] + return min_way + else: + possible_turns_coords = list() + for turn in possible_turns: + if turn == 'UP': + sp_x, sp_y = x - 1, y + possible_turns_coords.append([sp_x, sp_y, 'UP']) + if turn == 'DOWN': + sp_x, sp_y = x + 1, y + possible_turns_coords.append([sp_x, sp_y, 'DOWN']) + if turn == 'LEFT': + sp_x, sp_y = x, y - 1 + possible_turns_coords.append([sp_x, sp_y, 'LEFT']) + if turn == 'RIGHT': + sp_x, sp_y = x, y + 1 + possible_turns_coords.append([sp_x, sp_y, 'RIGHT']) + for coords in possible_turns_coords: + m_y = int(m_y) + m_x = int(m_x) + coords[0] = int(coords[0]) + coords[1] = int(coords[1]) + l = (((m_x - coords[0]) ** 2) + (m_y - coords[1]) ** 2) ** 0.5 + if l < 0: + l += 2 * l + coords.append(l) + if l < min_l: + min_l = l + min_way = coords[2] + return min_way + + +class Inky(pygame.sprite.Sprite): # TODO Инки - Голубой призрак TODO + def __init__(self, pos_x, pos_y, choord_x, choord_y, filename): + super().__init__(spirits_group, all_sprites) + self.mission = ('', '') + self.image = filename + self.choord_x = choord_x + self.choord_y = choord_y + self.rect = self.image.get_rect().move(tile_width * pos_x - 10, tile_height * pos_y - 10) + + def get_a_mission(self, choord_x, choord_y, blinky_red_spirit_choord_x, blinky_red_spirit_choord_y, blue_terror): + if blue_terror: + self.mission = (35, 27) + else: + m_x = 2 * int(choord_x) - int(blinky_red_spirit_choord_x) + m_y = 2 * int(choord_y) - int(blinky_red_spirit_choord_y) + self.mission = (m_x, m_y) + + def folow(self, karta, inky_last_position, x, y, m_x, m_y, possible_turns, inky_leave_home_1, inky_leave_home_2): + x = int(x) + y = int(y) + for i in range(len(possible_turns)): + if possible_turns[i] == inky_last_position: + del possible_turns[i] + break + if karta[x + 1][y] == '1' or karta[x + 1][y] == 'x' or karta[x + 1][y] == 'O': + for i in range(len(possible_turns)): + if possible_turns[i] == 'DOWN': + del possible_turns[i] + break + if karta[x - 1][y] == '1' or karta[x - 1][y] == 'x' or karta[x - 1][y] == 'O': + for i in range(len(possible_turns)): + if possible_turns[i] == 'UP': + del possible_turns[i] + break + if karta[x][y + 1] == '1' or karta[x][y + 1] == 'x' or karta[x][y + 1] == 'O': + for i in range(len(possible_turns)): + if possible_turns[i] == 'RIGHT': + del possible_turns[i] + break + if karta[x][y - 1] == '1' or karta[x][y - 1] == 'x' or karta[x][y - 1] == 'O': + for i in range(len(possible_turns)): + if possible_turns[i] == 'LEFT': + del possible_turns[i] + break + if inky_leave_home_1: + if karta[x][y - 1] == 'B': + for i in range(len(possible_turns)): + if possible_turns[i] == 'RIGHT': + del possible_turns[i] + break + if inky_leave_home_2: + if karta[x + 1][y] == 'S': + for i in range(len(possible_turns)): + if possible_turns[i] == 'DOWN': + del possible_turns[i] + break + min_l = 999999999 + min_way = '' + if len(possible_turns) < 2: + min_way = possible_turns[0] + return min_way + else: + possible_turns_coords = list() + for turn in possible_turns: + if turn == 'UP': + sp_x, sp_y = x - 1, y + possible_turns_coords.append([sp_x, sp_y, 'UP']) + if turn == 'DOWN': + sp_x, sp_y = x + 1, y + possible_turns_coords.append([sp_x, sp_y, 'DOWN']) + if turn == 'LEFT': + sp_x, sp_y = x, y - 1 + possible_turns_coords.append([sp_x, sp_y, 'LEFT']) + if turn == 'RIGHT': + sp_x, sp_y = x, y + 1 + possible_turns_coords.append([sp_x, sp_y, 'RIGHT']) + for coords in possible_turns_coords: + m_y = int(m_y) + m_x = int(m_x) + coords[0] = int(coords[0]) + coords[1] = int(coords[1]) + l = (((m_x - coords[0]) ** 2) + (m_y - coords[1]) ** 2) ** 0.5 + if l < 0: + l += 2 * l + coords.append(l) + if l < min_l: + min_l = l + min_way = coords[2] + return min_way + + +class Clyde(pygame.sprite.Sprite): # TODO Клайд - Оранжевый призрак TODO + def __init__(self, pos_x, pos_y, choord_x, choord_y, filename): + super().__init__(spirits_group, all_sprites) + self.mission = ('', '') + self.image = filename + self.choord_x = choord_x + self.choord_y = choord_y + self.rect = self.image.get_rect().move(tile_width * pos_x - 10, tile_height * pos_y - 10) + + def get_a_mission(self, choord_x, choord_y, clyde_choord_x, clyde_choord_y, orange_terror): + if orange_terror: + self.mission = (30, 0) + else: + min_m_x = int(choord_x) - 8 + if min_m_x < 3: + min_m_x = 3 + max_m_x = int(choord_x) + 8 + if max_m_x > 31: + max_m_x = 31 + min_m_y = int(choord_y) - 8 + if min_m_y < 1: + min_m_y = 1 + max_m_y = int(choord_y) + 8 + if max_m_y > 26: + max_m_y = 26 + clyde_choord_x = int(clyde_choord_x) + clyde_choord_y = int(clyde_choord_y) + if clyde_choord_x > min_m_x and clyde_choord_x < max_m_x and clyde_choord_y > min_m_y and clyde_choord_y < max_m_y: + self.mission = (28, 6) + else: + self.mission = (choord_x, choord_y) + + def folow(self, karta, blinky_last_position, x, y, m_x, m_y, possible_turns, clyde_leave_home_1, clyde_leave_home_2): + x = int(x) + y = int(y) + for i in range(len(possible_turns)): + if possible_turns[i] == blinky_last_position: + del possible_turns[i] + break + if karta[x + 1][y] == '1' or karta[x + 1][y] == 'x' or karta[x + 1][y] == 'B': + for i in range(len(possible_turns)): + if possible_turns[i] == 'DOWN': + del possible_turns[i] + break + if karta[x - 1][y] == '1' or karta[x - 1][y] == 'x' or karta[x - 1][y] == 'B': + for i in range(len(possible_turns)): + if possible_turns[i] == 'UP': + del possible_turns[i] + break + if karta[x][y + 1] == '1' or karta[x][y + 1] == 'x' or karta[x][y + 1] == 'B': + for i in range(len(possible_turns)): + if possible_turns[i] == 'RIGHT': + del possible_turns[i] + break + if karta[x][y - 1] == '1' or karta[x][y - 1] == 'x' or karta[x][y - 1] == 'B': + for i in range(len(possible_turns)): + if possible_turns[i] == 'LEFT': + del possible_turns[i] + break + if clyde_leave_home_1: + if karta[x][y + 1] == 'O': + for i in range(len(possible_turns)): + if possible_turns[i] == 'RIGHT': + del possible_turns[i] + break + if clyde_leave_home_2: + if karta[x + 1][y] == 'S': + for i in range(len(possible_turns)): + if possible_turns[i] == 'DOWN': + del possible_turns[i] + break + min_l = 999999999 + min_way = '' + if len(possible_turns) < 2: + min_way = possible_turns[0] + return min_way + else: + possible_turns_coords = list() + for turn in possible_turns: + if turn == 'UP': + sp_x, sp_y = x - 1, y + possible_turns_coords.append([sp_x, sp_y, 'UP']) + if turn == 'DOWN': + sp_x, sp_y = x + 1, y + possible_turns_coords.append([sp_x, sp_y, 'DOWN']) + if turn == 'LEFT': + sp_x, sp_y = x, y - 1 + possible_turns_coords.append([sp_x, sp_y, 'LEFT']) + if turn == 'RIGHT': + sp_x, sp_y = x, y + 1 + possible_turns_coords.append([sp_x, sp_y, 'RIGHT']) + for coords in possible_turns_coords: + m_y = int(m_y) + m_x = int(m_x) + coords[0] = int(coords[0]) + coords[1] = int(coords[1]) + l = (((m_x - coords[0]) ** 2) + (m_y - coords[1]) ** 2) ** 0.5 + if l < 0: + l += 2 * l + coords.append(l) + if l < min_l: + min_l = l + min_way = coords[2] + return min_way \ No newline at end of file diff --git a/data.zip b/data.zip new file mode 100644 index 0000000..8903cfb Binary files /dev/null and b/data.zip differ diff --git a/data/big_dot.jpg b/data/big_dot.jpg new file mode 100644 index 0000000..04c612c Binary files /dev/null and b/data/big_dot.jpg differ diff --git a/data/black.jpg b/data/black.jpg new file mode 100644 index 0000000..ca76341 Binary files /dev/null and b/data/black.jpg differ diff --git a/data/blinky_1.jpg b/data/blinky_1.jpg new file mode 100644 index 0000000..ffe039b Binary files /dev/null and b/data/blinky_1.jpg differ diff --git a/data/dot.jpg b/data/dot.jpg new file mode 100644 index 0000000..f04515a Binary files /dev/null and b/data/dot.jpg differ diff --git a/data/fon.png b/data/fon.png new file mode 100644 index 0000000..8c7e417 Binary files /dev/null and b/data/fon.png differ diff --git a/data/hor.jpg b/data/hor.jpg new file mode 100644 index 0000000..d75751e Binary files /dev/null and b/data/hor.jpg differ diff --git a/data/hor2.jpg b/data/hor2.jpg new file mode 100644 index 0000000..392a27e Binary files /dev/null and b/data/hor2.jpg differ diff --git a/data/left_down.jpg b/data/left_down.jpg new file mode 100644 index 0000000..ad09134 Binary files /dev/null and b/data/left_down.jpg differ diff --git a/data/left_up.jpg b/data/left_up.jpg new file mode 100644 index 0000000..e0b9aa9 Binary files /dev/null and b/data/left_up.jpg differ diff --git a/data/map2.txt b/data/map2.txt new file mode 100644 index 0000000..e25e767 --- /dev/null +++ b/data/map2.txt @@ -0,0 +1,34 @@ +############################ +############################ +1____________21____________2 +.dddddddddddd.!dddddddddddd! +.d1__2d1___2d.!d1___2d1__2d! +.D.##!d.###!d.!d.###!d.##!D! +.d3--4d3---4d34d3---4d3--4d! +.dddddddddddddddddddddddddd! +.d1__2d12d1______2d12d1__2d! +.d3--4d.!d3--21--4d.!d3--4d! +.dddddd.!dddd.!dddd.!dddddd! +3____2d.3__2#.!#1__4!d1____4 +#####.d.1--4#34#3--2!d!##### +#####.d.!##########.!d!##### +#####.d.!#1______2#.!d!##### +-----4d.!#.######!#.!d3----- +######d.!#.######!#.!d###### +_____2d.!#.######!#.!d1_____ +#####.d.!#3------4#.!d!##### +#####.d.!##########.!d!##### +#####.d.!#1______2#.!d!##### +1----4d34#3--21--4#34d3----2 +.dddddddddddd.!dddddddddddd! +.d1__2d1___2d.!d1___2d1__2d! +.d3-2!d3---4d34d3---4d.1-4d! +.Ddd.!ddddddd#@ddddddd.!ddD! +3_2d.!d12d1______2d12d.!d1_4 +1-4d34d.!d3--21--4d.!d34d3-2 +.dddddd.!dddd.!dddd.!dddddd! +.d1____43__2d.!d1__43____2d! +.d3--------4d34d3--------4d! +.dddddddddddddddddddddddddd! +3--------------------------4 +############################ \ No newline at end of file diff --git a/data/pacman.jpg b/data/pacman.jpg new file mode 100644 index 0000000..4781183 Binary files /dev/null and b/data/pacman.jpg differ diff --git a/data/pacman2.jpg b/data/pacman2.jpg new file mode 100644 index 0000000..13835bb Binary files /dev/null and b/data/pacman2.jpg differ diff --git a/data/pacman3.jpg b/data/pacman3.jpg new file mode 100644 index 0000000..05a63e7 Binary files /dev/null and b/data/pacman3.jpg differ diff --git a/data/pacman4.jpg b/data/pacman4.jpg new file mode 100644 index 0000000..9526640 Binary files /dev/null and b/data/pacman4.jpg differ diff --git a/data/pacman5.jpg b/data/pacman5.jpg new file mode 100644 index 0000000..5693aa6 Binary files /dev/null and b/data/pacman5.jpg differ diff --git a/data/right_down.jpg b/data/right_down.jpg new file mode 100644 index 0000000..8e006c9 Binary files /dev/null and b/data/right_down.jpg differ diff --git a/data/right_up.jpg b/data/right_up.jpg new file mode 100644 index 0000000..7164fbc Binary files /dev/null and b/data/right_up.jpg differ diff --git a/data/vert.jpg b/data/vert.jpg new file mode 100644 index 0000000..919d1c5 Binary files /dev/null and b/data/vert.jpg differ diff --git a/data/vert2.jpg b/data/vert2.jpg new file mode 100644 index 0000000..4e34336 Binary files /dev/null and b/data/vert2.jpg differ diff --git a/salo.mp3 b/salo.mp3 new file mode 100644 index 0000000..45e8948 Binary files /dev/null and b/salo.mp3 differ