Игра "Змейка" — классическая аркадная игра, в которой игрок управляет змейкой, которая растет, поедая еду, и избегает столкновений с самим собой и стенами. В этом руководстве мы шаг за шагом создадим такую игру с помощью языка программирования Python и библиотеки pygame.
Шаг 1: Установка Python
Прежде чем начать, убедитесь, что на вашем компьютере установлен Python. Если его нет, скачайте и установите Python с официального сайта: https://www.python.org/downloads/.
Важное замечание: Во время установки убедитесь, что выбрали опцию Add Python to PATH, чтобы иметь возможность запускать Python из командной строки.
После установки откройте командную строку или терминал и выполните команду:
python --version
Если вы увидите версию Python, значит установка прошла успешно.
Шаг 2: Установка IDE для Python
Для написания кода и запуска игры вам потребуется IDE (интегрированная среда разработки). Рекомендуем использовать PyCharm или Visual Studio Code (VS Code).
Установка PyCharm:
- Скачайте Community Edition (бесплатную версию).
- Установите PyCharm, следуя инструкциям на экране.
Установка Visual Studio Code (VS Code):
- Скачайте версию для вашей операционной системы и установите её.
- После установки откройте VS Code и установите расширение для Python. Для этого перейдите в меню Extensions (слева) и найдите расширение Python, после чего нажмите Install.
Шаг 3: Установка библиотеки Pygame
Теперь установим библиотеку pygame, которая позволит нам работать с графикой и вводом с клавиатуры. Откройте терминал или командную строку в вашей IDE и выполните команду:
pip install pygame
Если установка прошла успешно, вы готовы к следующему шагу.
Шаг 4: Написание кода игры
Теперь, когда у вас есть всё необходимое, создадим саму игру. Откройте вашу IDE (PyCharm или VS Code) и создайте новый Python файл (например, 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)
# Размеры игрового окна
dis_width = 600
dis_height = 400
# Создаем игровое окно
dis = pygame.display.set_mode((dis_width, dis_height))
# Название окна
pygame.display.set_caption('Змейка на Python')
# Создаем таймер для управления частотой обновления экрана
clock = pygame.time.Clock()
# Размер блока змейки
snake_block = 10
# Скорость змейки (чем больше значение, тем быстрее)
snake_speed = 15
Шаг 5: Функции для отображения игры
Теперь добавим несколько функций для рисования змейки, вывода сообщений и отображения счета:
# Функция для рисования змейки
def our_snake(snake_block, snake_list):
for x in snake_list:
pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
# Функция для отображения текста
font_style = pygame.font.SysFont("bahnschrift", 25)
def message(msg, color):
mesg = font_style.render(msg, True, color)
dis.blit(mesg, [dis_width / 6, dis_height / 3])
# Функция для отображения счета
score_font = pygame.font.SysFont("comicsansms", 35)
def your_score(score):
value = score_font.render("Ваш счет: " + str(score), True, yellow)
dis.blit(value, [0, 0])
Шаг 6: Основной игровой цикл
Теперь пишем основной игровой цикл, где будет происходить вся логика игры:
def gameLoop():
game_over = False # Флаг, который определяет, закончена ли игра
game_close = False # Флаг, который определяет, проиграл ли игрок
# Начальные координаты змейки (в центре экрана)
x1 = dis_width / 2
y1 = dis_height / 2
# Изменения координат змейки по осям (скорость движения)
x1_change = 0
y1_change = 0
# Список, в котором будет храниться информация о теле змейки
snake_List = []
Length_of_snake = 1 # Длина змейки (в начале она состоит только из головы)
# Начальная позиция еды (случайным образом на экране)
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
# Основной игровой цикл
while not game_over:
# Цикл для ситуации, когда игрок проиграл
while game_close:
dis.fill(blue) # Заполняем экран синим цветом (фон)
message("Вы проиграли! Нажмите C для продолжения или Q для выхода", red) # Выводим сообщение о проигрыше
your_score(Length_of_snake - 1) # Отображаем текущий счет
pygame.display.update() # Обновляем экран
# Обработка событий после проигрыша
for event in pygame.event.get():
if event.type == pygame.QUIT: # Если пользователь закрывает окно
game_over = True # Завершаем игру
game_close = False # Выходим из цикла для проигравших
if event.type == pygame.KEYDOWN: # Если была нажата клавиша
if event.key == pygame.K_q: # Если нажали 'Q', выходим из игры
game_over = True
game_close = False
if event.key == pygame.K_c: # Если нажали 'C', начинаем новую игру
gameLoop()
# Обработка всех событий в игре
for event in pygame.event.get():
if event.type == pygame.QUIT: # Если пользователь закрывает окно
game_over = True # Завершаем игру
if event.type == pygame.KEYDOWN: # Если нажата клавиша
if event.key == pygame.K_LEFT: # Если нажата стрелка влево
x1_change = -snake_block # Изменяем координаты змейки по оси X (влево)
y1_change = 0 # По оси Y не изменяется
elif event.key == pygame.K_RIGHT: # Если нажата стрелка вправо
x1_change = snake_block # Изменяем координаты змейки по оси X (вправо)
y1_change = 0 # По оси Y не изменяется
elif event.key == pygame.K_UP: # Если нажата стрелка вверх
y1_change = -snake_block # Изменяем координаты змейки по оси Y (вверх)
x1_change = 0 # По оси X не изменяется
elif event.key == pygame.K_DOWN: # Если нажата стрелка вниз
y1_change = snake_block # Изменяем координаты змейки по оси Y (вниз)
x1_change = 0 # По оси X не изменяется
# Проверяем, не столкнулась ли змейка с границами экрана
if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
game_close = True # Если змейка выходит за пределы экрана, проигрыш
# Обновляем координаты головы змейки
x1 += x1_change
y1 += y1_change
# Заполняем экран фоном
dis.fill(blue)
# Рисуем еду на экране
pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
# Создаем новую голову змейки
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]
# Проверяем, не съела ли змейка сама себя (если голова соприкасается с телом)
for x in snake_List[:-1]:
if x == snake_Head: # Если хотя бы один элемент совпадает с головой
game_close = True # Если да, то проигрыш
# Рисуем змейку на экране
our_snake(snake_block, snake_List)
# Отображаем текущий счет
your_score(Length_of_snake - 1)
# Обновляем экран
pygame.display.update()
# Если змейка съела еду, генерируем новую еду и увеличиваем длину змейки
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0 # Генерация новой еды по оси X
foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0 # Генерация новой еды по оси Y
Length_of_snake += 1 # Увеличиваем длину змейки
# Контролируем скорость игры (сколько кадров в секунду)
clock.tick(snake_speed)
# Закрываем игру
pygame.quit()
quit()
# Запуск основной игры
gameLoop()
Объяснение:
- Инициализация переменных:
Устанавливаем флаги game_over и game_close, чтобы отслеживать завершение игры.
Устанавливаем начальные координаты змейки и её скорость (изменение координат по осям).
Создаем пустой список для тела змейки и переменную для хранения её длины.
Генерируем случайные координаты для еды. - Цикл игры:
Внутренний цикл while game_close выполняется, если игрок проиграл, и предлагает ему продолжить или выйти.
Основной цикл игры (while not game_over) обрабатывает все игровые события и обновляет положение змейки на экране.
В цикле обрабатываются события клавиш (стрелки для движения).
Проверяется, не столкнулась ли змейка с границами экрана или с собственным телом.
Если змейка съедает еду, она растет, и генерируются новые координаты для еды.
Рисуется змейка и еда, обновляется счет и отображается на экране. - Конец игры:
Если змейка выходит за пределы экрана или сталкивается с собой, игра заканчивается.
После проигрыша появляется сообщение и игрок может выбрать продолжить игру или выйти.
Таким образом, основной игровой цикл управляет всеми аспектами игры, от обработки ввода пользователя до обновления экрана и логики столкновений.
Шаг 7: Запуск игры
После того как вы написали весь код, пришло время запустить игру.
Запуск игры в PyCharm:
- Откройте PyCharm и создайте новый проект.
- В проекте создайте новый файл Python (например, snake_game.py).
- Вставьте код игры в файл.
- Для запуска игры нажмите зелёную кнопку Run в верхнем правом углу или используйте горячие клавиши Shift + F10.
- Игра откроется в отдельном окне, и вы сможете управлять змейкой с помощью стрелок на клавиатуре.
Запуск игры в Visual Studio Code:
- Откройте VS Code и создайте новый файл с расширением .py (например, snake_game.py).
- Вставьте код игры в этот файл.
- Чтобы запустить игру, откройте встроенный терминал (меню View → Terminal) и выполните команду:
python snake_game.py - Игра откроется в отдельном окне.
Шаг 8: Управление и цели игры
- Управление змейкой осуществляется с помощью стрелок на клавиатуре.
- Задача игрока — поедать еду (зелёные квадратики) и избегать столкновений с границами экрана и своим телом.
- Когда вы проигрываете, на экране появится сообщение с предложением нажать C для продолжения игры или Q для выхода.
Заключение
Теперь вы знаете, как создать свою собственную игру "Змейка" на Python! В статье мы подробно разобрали все шаги — от установки Python и IDE до написания кода и запуска игры. Вы можете продолжить улучшать игру, добавив новые функции, например, уровни сложности или более сложные бонусы. Удачи в программировании! И до встречи в новых уроках по программированию на языке Python для новичков.