Игра Пакман на 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()

Объяснение кода

  1. Инициализация Pygame и настройка экрана:

    • Устанавливаются размеры экрана, цвета и шрифты.
    • Создается окно игры с заданными размерами.
  2. Создание карты:

    • Карта представлена как список строк, где W — стена, . — таблетка, а 0 — пустая клетка.
    • Функция draw_map() отвечает за отрисовку карты на экране.
  3. Класс Pacman:

    • Управляет положением Пакмана, его движением и отрисовкой.
    • Метод move() обрабатывает направление движения с учетом возможных препятствий.
    • Метод can_move() проверяет, можно ли двигаться в заданном направлении.
  4. Класс Ghost:

    • Представляет привидение с его позицией, цветом и направлением движения.
    • Метод move() отвечает за случайное движение привидения.
    • Аналогично Пакману, метод can_move() проверяет возможность движения.
  5. Инициализация объектов:

    • Создается объект Пакмана и список привидений с различными цветами.
  6. Основной цикл игры:

    • Обработка событий (нажатие клавиш для движения Пакмана).
    • Перемещение Пакмана и привидений.
    • Сбор таблеток и обновление счета.
    • Проверка столкновений между Пакманом и привидениями, уменьшение жизней.
    • Рендеринг всех компонентов на экране.
  7. Завершение игры:

    • Игра завершается, когда у игрока заканчиваются жизни или при закрытии окна.

Дополнительные улучшения

Этот пример является базовой версией игры "Пакман". Для полноценной игры можно добавить следующие улучшения:

  • Больше уровней и сложность привидений:
    • Реализовать различные алгоритмы движения привидений (например, следование за Пакманом).
  • Эффекты смерти и возрождения:
    • Анимации при столкновении с привидением.
  • Фрукты и бонусы:
    • Добавить специальные объекты для увеличения счета или временного обезвреживания привидений.
  • Звуковые эффекты и музыка:
    • Добавить аудио для более насыщенного игрового процесса.
  • Сохранение и загрузка рекордов:
    • Сохранять лучший счет игрока.

Запуск игры

  1. Убедитесь, что Python и Pygame установлены.

  2. Сохраните приведенный код в файл, например, pacman.py.

  3. Запустите игру командой:

    python pacman.py

Наслаждайтесь игрой!

Share this Q&A