Как сделать игру «Змейка» на Python с нуля

Введение в создание игры «Змейка» на Python

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

Что такое Pygame?

Pygame — это библиотека для Python, которая позволяет разработчикам создавать игры и мультимедийные приложения. Она предоставляет удобные функции для работы с графикой, звуком и вводом от пользователя. Если вы новичок в программировании, Pygame — отличный выбор для начала.

Установка Pygame

Перед тем как начать, необходимо установить библиотеку Pygame. Это можно сделать с помощью pip. Откройте терминал и выполните следующую команду:

pip install pygame

После установки вы готовы к созданию своей игры!

Создание основного окна игры

Первым шагом будет создание основного окна игры. Давайте создадим файл snake_game.py и добавим в него следующий код:

import pygame
import time
import random

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

# Определение цветов
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

# Установка размеров окна
width = 600
height = 400
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('Змейка на Python')

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

    screen.fill(blue)
    pygame.display.update()

pygame.quit()
quit()

Этот код создаёт простое окно с синим фоном. Теперь вы можете запустить файл и увидеть его в действии!

Добавление змейки

Теперь давайте добавим змейку. Мы будем представлять змейку как список координат, где каждая координата будет представлять часть тела змейки.

snake_block = 10
snake_speed = 15

clock = pygame.time.Clock()

def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(screen, black, [x[0], x[1], snake_block, snake_block])

# Основной цикл игры
while not game_over:
    # Логика управления
    # ...

    # Отрисовка змейки
    our_snake(snake_block, snake_list)
    pygame.display.update()

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

Управление змейкой

Для управления змейкой мы будем использовать клавиши стрелок. Давайте добавим обработку событий для управления движением:

x1_change = 0
y1_change = 0

for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            x1_change = -snake_block
            y1_change = 0
        elif event.key == pygame.K_RIGHT:
            x1_change = snake_block
            y1_change = 0
        elif event.key == pygame.K_UP:
            y1_change = -snake_block
            x1_change = 0
        elif event.key == pygame.K_DOWN:
            y1_change = snake_block
            x1_change = 0

x1 += x1_change
y1 += y1_change

Теперь змейка будет двигаться в зависимости от нажатых клавиш. Не забудьте добавить начальные координаты x1 и y1 перед основным циклом.

Добавление еды для змейки

Чтобы сделать игру интереснее, добавим еду, которую змейка будет собирать. Мы будем генерировать случайные координаты для еды и рисовать её на экране:

foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0

pygame.draw.rect(screen, green, [foodx, foody, snake_block, snake_block])

Теперь, когда еда нарисована, нам нужно добавить логику для увеличения длины змейки, когда она её съедает.

Увеличение длины змейки

Когда змейка съедает еду, мы добавим новую часть к её телу. Для этого мы будем использовать список, который будет хранить координаты частей тела змейки:

snake_list = []
length_of_snake = 1

if x1 == foodx and y1 == foody:
    foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
    length_of_snake += 1

snake_head = []
snake_head.append(x1)
snake_head.append(y1)
snake_list.append(snake_head)

if len(snake_list) > length_of_snake:
    del snake_list[0]

Теперь, когда змейка съедает еду, её длина увеличивается, и она становится длиннее.

Завершение игры

Чтобы сделать игру более интересной, добавим условие окончания игры, если змейка врезается в себя или в стену:

if x1 >= width or x1 < 0 or y1 >= height or y1 < 0:
    game_over = True

for x in snake_list[:-1]:
    if x == snake_head:
        game_over = True

Теперь, если змейка врезается в стену или в себя, игра заканчивается.

Добавление счёта

Чтобы игрок мог видеть свой прогресс, добавим счёт. Мы будем отображать его на экране:

font_style = pygame.font.SysFont("bahnschrift", 25)
score = 0

def your_score(score):
    value = font_style.render("Счёт: " + str(score), True, white)
    screen.blit(value, [0, 0])

your_score(score)

Теперь счёт будет отображаться в верхнем левом углу экрана.

Завершение игры и перезапуск

Добавим возможность перезапуска игры после её завершения:

while game_over:
    screen.fill(blue)
    message = font_style.render("Игра окончена! Нажмите C для перезапуска или Q для выхода", True, red)
    screen.blit(message, [width / 6, height / 3])
    pygame.display.update()

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                game_over = False
            if event.key == pygame.K_c:
                game_loop()  # Функция, которая запускает игру заново

Теперь игрок может перезапустить игру, нажав клавишу C.

Заключение

Поздравляем! Вы только что создали свою собственную игру «Змейка» на Python с использованием Pygame. Это отличный проект для начинающих, который поможет вам освоить основы программирования и разработки игр.

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

Примечание

Если у вас возникли вопросы или вы хотите поделиться своими достижениями, не стесняйтесь оставлять комментарии!