Создание игры «Змейка» с использованием Pygame: Пошаговое руководство

498c0736854c38d375646631013afae1

Игра «Змейка» является классической и популярной аркадной игрой. В этом руководстве мы создадим простую версию игры «Змейка» с использованием библиотеки Pygame на языке Python. Ниже приведены пошаговые инструкции для создания игры.

Шаг 1: Инициализация Pygame и установка окна игры

import pygame
import random
import json

# Инициализация Pygame
pygame.init()

# Установка размеров окна
width = 800
height = 600
cell_size = 20

# Цвета
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)

# Создание окна
game_display = pygame.display.set_mode((width, height))
pygame.display.set_caption('Змейка')

# Часы для управления обновлением экрана
clock = pygame.time.Clock()

В этом шаге мы подключаем библиотеку Pygame, инициализируем окно игры и устанавливаем его размер. Также определяем цвета, которые будут использоваться в игре.

Шаг 2: Функции для отображения текста и генерации яблок

# Функция для вывода текста на экран
def draw_text(text, font, color, surface, x, y):
    text_obj = font.render(text, True, color)
    text_rect = text_obj.get_rect()
    text_rect.topleft = (x, y)
    surface.blit(text_obj, text_rect)

# Генерация новых координат для яблока
def generate_new_apple():
    return [random.randrange(1, (width//cell_size)) * cell_size,
            random.randrange(1, (height//cell_size)) * cell_size]

Этот шаг включает определение функций для отображения текста на экране и генерации новых координат для яблока.

Шаг 3: Загрузка и сохранение таблицы рекордов

# Загрузка таблицы рекордов
def load_high_scores():
    try:
        with open("high_scores.json", "r") as file:
            high_scores = json.load(file)
    except FileNotFoundError:
        high_scores = {"scores": []}
    return high_scores

# Сохранение таблицы рекордов
def save_high_scores(high_scores):
    with open("high_scores.json", "w") as file:
        json.dump(high_scores, file)

В этом шаге мы создаем функции для загрузки и сохранения таблицы рекордов в формате JSON.

Шаг 4: Отображение таблицы рекордов

# Отображение таблицы рекордов
def display_high_scores(high_scores):
    font = pygame.font.Font(None, 36)
    draw_text("High Scores:", font, white, game_display, 10, 40)
    for i, score in enumerate(high_scores["scores"]):
        draw_text(str(i+1) + ". " + str(score), font, white, game_display, 10, 70 + i * 30)

Этот шаг включает функцию для отображения таблицы рекордов на экране.

Шаг 5: Основной цикл игры

# Основная функция игры
def game_loop():
    # Начальные координаты змейки
    snake = [[width // 2, height // 2]]
    snake_direction = 'RIGHT'

    # Начальные координаты яблока
    apple_pos = generate_new_apple()

    # Начальный счет
    score = 0

    # Загрузка рекордов
    high_scores = load_high_scores()

    # Основной цикл игры
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                save_high_scores(high_scores)
                pygame.quit()
                quit()

            # Управление змейкой
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and snake_direction != 'RIGHT':
                    snake_direction = 'LEFT'
                elif event.key == pygame.K_RIGHT and snake_direction != 'LEFT':
                    snake_direction = 'RIGHT'
                elif event.key == pygame.K_UP and snake_direction != 'DOWN':
                    snake_direction = 'UP'
                elif event.key == pygame.K_DOWN and snake_direction != 'UP':
                    snake_direction = 'DOWN'

В этом шаге мы создаем основной цикл игры, который обрабатывает управление змейкой и другие события.

Шаг 6: Перемещение змейки и проверка столкновений

        # Перемещение змейки
        if snake_direction == 'UP':
            snake.insert(0, [snake[0][0], snake[0][1] - cell_size])
        elif snake_direction == 'DOWN':
            snake.insert(0, [snake[0][0], snake[0][1] + cell_size])
        elif snake_direction == 'LEFT':
            snake.insert(0, [snake[0][0] - cell_size, snake[0][1]])
        elif snake_direction == 'RIGHT':
            snake.insert(0, [snake[0][0] + cell_size, snake[0][1]])

        # Если змейка коснулась границ экрана
        if not (0 <= snake[0][0] < width and 0 <= snake[0][1] < height):
            if score > 0:
                high_scores["scores"].append(score)
                high_scores["scores"].sort(reverse=True)
                if len(high_scores["scores"]) > 5:
                    high_scores["scores"].pop()
                save_high_scores(high_scores)
            return

        # Если змейка съела яблоко
        if snake[0] == apple_pos:
            apple_pos = generate_new_apple()
            score += 1

        else:
            # Удаление последнего сегмента змейки, если не съела яблоко
            snake.pop()

В этом шаге реализуется перемещение змейки, обработка столкновений и проверка съеденного яблока.

Шаг 7: Отображение игровых объектов

        # Рисуем фон
        game_display.fill(black)

        # Рисуем змейку
        for segment in snake:
            pygame.draw.rect(game_display, white, [segment[0], segment[1], cell_size, cell_size])

        # Рисуем яблоко
        pygame.draw.rect(game_display, red, [apple_pos[0], apple_pos[1], cell_size, cell_size])

        # Отображаем счет
        font = pygame.font.Font(None, 36)
        draw_text("Score: {}".format(score), font, white, game_display, 10, 10)

        # Отображаем таблицу рекордов
        display_high_scores(high_scores)

        # Обновляем экран
        pygame.display.update()

        # Ограничиваем частоту кадров
        clock.tick(10)

# Запускаем игру
game_loop()

В этом шаге мы отображаем игровые объекты, такие как змейка, яблоко и счет, а также обновляем экран и ограничиваем частоту кадров.

Теперь у вас есть простая версия игры «Змейка», созданная с использованием библиотеки Pygame на языке Python. Вы можете доработать ее, добавив новые функции и улучшения.

© Habrahabr.ru