Игра Пакман на Python
Created on: September 28, 2024
Answered using OpenAI 01 Mini by OpenAI01
Question
Напиши игру Пакман на Python с Pygame. Должны быть реализованы все основные механики.
Thought
Реализация игры
Я пишу игру Pac-Man на Python с использованием Pygame, включая такие механики, как движение, привидения, ягодки, счет и жизни.
Answer
Конечно! Ниже приведен пример реализации игры "Пакман" на Python с использованием библиотеки Pygame. Эта версия включает основные механики игры: движение Пакмана, сбор таблеток, движение привидений, столкновения и счет.
Требования:
- Python 3.x
- Pygame (
pip install pygame
)
Структура проекта
Для простоты все компоненты будут находиться в одном файле. В более крупном проекте рекомендуется разделить код на модули.
Полный код игры
import pygame import sys import random # Инициализация Pygame pygame.init() # Размеры экрана WIDTH, HEIGHT = 640, 480 CELL_SIZE = 20 ROWS, COLS = HEIGHT // CELL_SIZE, WIDTH // CELL_SIZE # Цвета BLACK = (0, 0, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) PINK = (255, 105, 180) CYAN = (0, 255, 255) ORANGE = (255, 165, 0) # Настройка экрана screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Пакман") # Часы для контроля FPS clock = pygame.time.Clock() FPS = 60 # Шрифты font = pygame.font.SysFont('Arial', 24) # Создание карты # W - стена, . - таблетка, 0 - пусто MAP = [ "WWWWWWWWWWWWWWWWWWWW", "W..................W", "W.WWW.WWWWW.WWW.WWW.W", "W.WWW.WWWWW.WWW.WWW.W", "W..................W", "W.WWW.WW.WW.WW.WWW.W", "W..................W", "W.WWW.WW.WW.WW.WWW.W", "W.WWW.WW.WW.WW.WWW.W", "W..................W", "WWWWWWWWWWWWWWWWWWWW" ] # Преобразование карты в двумерный список game_map = [list(row) for row in MAP] # Функция рисования карты def draw_map(): for y, row in enumerate(game_map): for x, cell in enumerate(row): rect = pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE) if cell == 'W': pygame.draw.rect(screen, BLUE, rect) elif cell == '.': pygame.draw.circle(screen, WHITE, rect.center, 3) # Класс Пакмана class Pacman: def __init__(self, x, y): self.x = x self.y = y self.direction = None self.next_direction = None self.radius = CELL_SIZE // 2 - 2 def move(self): if self.next_direction: if self.can_move(self.next_direction): self.direction = self.next_direction self.next_direction = None if self.direction and self.can_move(self.direction): dx, dy = self.get_delta(self.direction) self.x += dx self.y += dy def can_move(self, direction): dx, dy = self.get_delta(direction) new_x = self.x + dx new_y = self.y + dy grid_x = new_x // CELL_SIZE grid_y = new_y // CELL_SIZE if 0 <= grid_x < COLS and 0 <= grid_y < ROWS: return game_map[grid_y][grid_x] != 'W' return False def get_delta(self, direction): if direction == 'UP': return (0, -1) elif direction == 'DOWN': return (0, 1) elif direction == 'LEFT': return (-1, 0) elif direction == 'RIGHT': return (1, 0) return (0, 0) def draw(self): center = (self.x + CELL_SIZE // 2, self.y + CELL_SIZE // 2) pygame.draw.circle(screen, YELLOW, center, self.radius) # Класс Привидение class Ghost: def __init__(self, x, y, color): self.x = x self.y = y self.color = color self.direction = random.choice(['UP', 'DOWN', 'LEFT', 'RIGHT']) self.speed = 1 def move(self): if self.can_move(self.direction): dx, dy = self.get_delta(self.direction) self.x += dx * self.speed self.y += dy * self.speed else: self.direction = random.choice(['UP', 'DOWN', 'LEFT', 'RIGHT']) def can_move(self, direction): dx, dy = self.get_delta(direction) new_x = self.x + dx new_y = self.y + dy grid_x = new_x // CELL_SIZE grid_y = new_y // CELL_SIZE if 0 <= grid_x < COLS and 0 <= grid_y < ROWS: return game_map[grid_y][grid_x] != 'W' return False def get_delta(self, direction): if direction == 'UP': return (0, -1) elif direction == 'DOWN': return (0, 1) elif direction == 'LEFT': return (-1, 0) elif direction == 'RIGHT': return (1, 0) return (0, 0) def draw(self): center = (self.x + CELL_SIZE // 2, self.y + CELL_SIZE // 2) pygame.draw.circle(screen, self.color, center, self.radius) # Инициализация Пакмана и привидений pacman = Pacman(CELL_SIZE, CELL_SIZE) ghosts = [ Ghost(5 * CELL_SIZE, 5 * CELL_SIZE, RED), Ghost(7 * CELL_SIZE, 5 * CELL_SIZE, PINK), Ghost(5 * CELL_SIZE, 7 * CELL_SIZE, CYAN), Ghost(7 * CELL_SIZE, 7 * CELL_SIZE, ORANGE) ] # Счет и жизни score = 0 lives = 3 # Основной цикл игры running = True while running: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: pacman.next_direction = 'UP' elif event.key == pygame.K_DOWN: pacman.next_direction = 'DOWN' elif event.key == pygame.K_LEFT: pacman.next_direction = 'LEFT' elif event.key == pygame.K_RIGHT: pacman.next_direction = 'RIGHT' # Перемещение Пакмана pacman.move() # Сбор таблеток pac_grid_x = pacman.x // CELL_SIZE pac_grid_y = pacman.y // CELL_SIZE if game_map[pac_grid_y][pac_grid_x] == '.': score += 10 game_map[pac_grid_y][pac_grid_x] = '0' # Перемещение привидений for ghost in ghosts: ghost.move() # Проверка столкновений с привидениями for ghost in ghosts: if abs(pacman.x - ghost.x) < CELL_SIZE // 2 and abs(pacman.y - ghost.y) < CELL_SIZE // 2: lives -= 1 # Сброс позиции Пакмана pacman.x, pacman.y = CELL_SIZE, CELL_SIZE if lives == 0: running = False # Рендеринг screen.fill(BLACK) draw_map() pacman.draw() for ghost in ghosts: ghost.draw() # Отображение счета и жизней score_text = font.render(f"Счет: {score}", True, WHITE) lives_text = font.render(f"Жизни: {lives}", True, WHITE) screen.blit(score_text, (10, HEIGHT - 30)) screen.blit(lives_text, (WIDTH - 120, HEIGHT - 30)) pygame.display.flip() # Завершение Pygame pygame.quit() sys.exit()
Объяснение кода
-
Инициализация Pygame и настройка экрана:
- Устанавливаются размеры экрана, цвета и шрифты.
- Создается окно игры с заданными размерами.
-
Создание карты:
- Карта представлена как список строк, где
W
— стена,.
— таблетка, а0
— пустая клетка. - Функция
draw_map()
отвечает за отрисовку карты на экране.
- Карта представлена как список строк, где
-
Класс
Pacman
:- Управляет положением Пакмана, его движением и отрисовкой.
- Метод
move()
обрабатывает направление движения с учетом возможных препятствий. - Метод
can_move()
проверяет, можно ли двигаться в заданном направлении.
-
Класс
Ghost
:- Представляет привидение с его позицией, цветом и направлением движения.
- Метод
move()
отвечает за случайное движение привидения. - Аналогично Пакману, метод
can_move()
проверяет возможность движения.
-
Инициализация объектов:
- Создается объект Пакмана и список привидений с различными цветами.
-
Основной цикл игры:
- Обработка событий (нажатие клавиш для движения Пакмана).
- Перемещение Пакмана и привидений.
- Сбор таблеток и обновление счета.
- Проверка столкновений между Пакманом и привидениями, уменьшение жизней.
- Рендеринг всех компонентов на экране.
-
Завершение игры:
- Игра завершается, когда у игрока заканчиваются жизни или при закрытии окна.
Дополнительные улучшения
Этот пример является базовой версией игры "Пакман". Для полноценной игры можно добавить следующие улучшения:
- Больше уровней и сложность привидений:
- Реализовать различные алгоритмы движения привидений (например, следование за Пакманом).
- Эффекты смерти и возрождения:
- Анимации при столкновении с привидением.
- Фрукты и бонусы:
- Добавить специальные объекты для увеличения счета или временного обезвреживания привидений.
- Звуковые эффекты и музыка:
- Добавить аудио для более насыщенного игрового процесса.
- Сохранение и загрузка рекордов:
- Сохранять лучший счет игрока.
Запуск игры
-
Убедитесь, что Python и Pygame установлены.
-
Сохраните приведенный код в файл, например,
pacman.py
. -
Запустите игру командой:
python pacman.py
Наслаждайтесь игрой!