Создаем классическую игру “Змейка” на Python: пошаговое руководство
Наверняка, многие из вас помнят, как в детстве играли в “Змейку” на старых мобильных телефонах. Эта простая, но захватывающая игра покорила сердца миллионов. Сегодня мы с вами попробуем создать эту игру с нуля, используя язык программирования Python. Не переживайте, если вы новичок — мы будем идти шаг за шагом, и в конце вы сможете похвастаться своей собственной игрой “Змейка”.
Почему стоит создать игру на Python?
Python — это один из самых популярных языков программирования в мире. Он прост в изучении и прекрасно подходит для создания игр. С помощью Python вы можете быстро реализовать свои идеи, а также использовать множество библиотек, которые значительно упростят процесс разработки. Кроме того, создание игры “Змейка” — это отличный способ улучшить свои навыки программирования и понять основы разработки игр.
Что нам потребуется?
Перед тем как начать, давайте убедимся, что у нас есть все необходимое. Вот список того, что нам нужно:
- Python: Убедитесь, что у вас установлена последняя версия Python. Вы можете скачать его с официального сайта.
- Pygame: Это библиотека для создания игр на Python. Установить ее можно с помощью команды
pip install pygame. - Текстовый редактор: Вы можете использовать любой текстовый редактор, который вам нравится, будь то VS Code, PyCharm или даже простой Notepad.
Начинаем с основ: установка Pygame
Теперь, когда у нас есть все необходимое, давайте установим библиотеку Pygame. Это делается очень просто. Откройте командную строку или терминал и введите следующую команду:
pip install pygame
После установки Pygame мы готовы начать разработку нашей игры. Давайте создадим файл, в котором будет храниться наш код. Назовем его snake_game.py.
Создание окна игры
Первый шаг в создании игры — это создание окна, в котором будет происходить действие. В Pygame это делается с помощью нескольких простых строк кода. Давайте добавим следующий код в наш файл:
import pygame
import time
import random
# Инициализация Pygame
pygame.init()
# Определяем цвета
black = (0, 0, 0)
white = (255, 255, 255)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
# Устанавливаем размеры окна
width = 600
height = 400
window = pygame.display.set_mode((width, height))
pygame.display.set_caption('Игра Змейка на Python')
В этом коде мы инициализируем Pygame, определяем цвета и создаем окно размером 600 на 400 пикселей. Теперь давайте добавим основной цикл игры, который будет следить за событиями в игре.
Основной цикл игры
Основной цикл игры — это сердце любой игры. Он отвечает за обработку событий, обновление состояния игры и отрисовку элементов на экране. Давайте добавим основной цикл в наш код:
game_over = False
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
window.fill(blue)
pygame.display.update()
pygame.quit()
quit()
Теперь, если вы запустите игру, вы увидите синее окно, которое можно закрыть. Это уже что-то, не правда ли? Теперь давайте добавим змейку и логику ее движения.
Создание змейки
Змейка будет представлять собой список координат, где каждая координата будет соответствовать части тела змейки. Мы начнем с того, что создадим змейку и добавим ее на экран:
snake_block = 10
snake_speed = 15
snake_list = []
length_of_snake = 1
x1 = width / 2
y1 = height / 2
x1_change = 0
y1_change = 0
clock = pygame.time.Clock()
while not game_over:
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
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
window.fill(blue)
pygame.draw.rect(window, green, [x1, y1, snake_block, snake_block])
pygame.display.update()
clock.tick(snake_speed)
pygame.quit()
quit()
Теперь, если вы запустите игру, вы сможете управлять змейкой с помощью стрелок на клавиатуре. Она будет двигаться по экрану, оставляя за собой след. Но пока это просто зеленый квадрат. Давайте сделаем ее более интересной, добавив возможность роста и еду для змейки.
Добавление еды для змейки
Чтобы сделать игру более увлекательной, нам нужно добавить еду, которую будет собирать змейка. Когда змейка съедает еду, она должна расти. Давайте создадим функцию для генерации еды и добавим логику для ее поедания:
foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
while not game_over:
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
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
window.fill(blue)
pygame.draw.rect(window, green, [x1, y1, snake_block, snake_block])
pygame.draw.rect(window, white, [foodx, foody, snake_block, snake_block])
pygame.display.update()
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
clock.tick(snake_speed)
pygame.quit()
quit()
Теперь, когда вы запустите игру, вы увидите белый квадрат, который будет представлять еду. Когда ваша змейка соприкасается с едой, она будет расти. Но нам нужно сделать так, чтобы змейка не могла выходить за границы экрана и не сталкивалась сама с собой.
Добавление границ и логики столкновений
Чтобы сделать игру более сложной, давайте добавим границы для змейки и логику столкновений. Если змейка выходит за границы экрана или сталкивается сама с собой, игра должна заканчиваться. Давайте добавим эту логику:
if x1 >= width or x1 = height or y1 length_of_snake:
del snake_list[0]
for x in snake_list[:-1]:
if x == snake_head:
game_over = True
for segment in snake_list:
pygame.draw.rect(window, green, [segment[0], segment[1], snake_block, snake_block])
Теперь, если вы запустите игру, вы заметите, что если змейка выходит за границы или сталкивается сама с собой, игра заканчивается. Но нам еще не хватает экрана с результатами. Давайте добавим его, чтобы игрок мог видеть свой счет.
Добавление экрана с результатами
Теперь, когда игра закончена, мы хотим, чтобы игрок видел свой результат. Для этого создадим функцию, которая будет отображать сообщение на экране. Давайте добавим следующую функцию:
def message(msg, color):
font_style = pygame.font.SysFont("bahnschrift", 25)
mesg = font_style.render(msg, True, color)
window.blit(mesg, [width / 6, height / 3])
Теперь, когда игра заканчивается, мы можем вызывать эту функцию, чтобы показать сообщение о том, что игра окончена:
message("Игра окончена! Нажмите Q для выхода или C для новой игры", red)
pygame.display.update()
while game_over:
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:
# Здесь можно добавить логику для перезапуска игры
pass
Теперь, когда игра закончится, игрок увидит сообщение и сможет выйти или перезапустить игру. Давайте добавим логику для перезапуска игры.
Перезапуск игры
Чтобы реализовать перезапуск игры, нам нужно будет вынести большую часть нашего кода в отдельную функцию. Давайте создадим функцию game_loop(), которая будет содержать всю логику игры:
def game_loop():
game_over = False
game_close = False
x1 = width / 2
y1 = height / 2
x1_change = 0
y1_change = 0
snake_list = []
length_of_snake = 1
foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
while not game_over:
while game_close == True:
window.fill(blue)
message("Игра окончена! Нажмите Q для выхода или C для новой игры", red)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_c:
game_loop()
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
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
if x1 >= width or x1 = height or y1 length_of_snake:
del snake_list[0]
for x in snake_list[:-1]:
if x == snake_head:
game_close = True
for segment in snake_list:
pygame.draw.rect(window, green, [segment[0], segment[1], snake_block, snake_block])
clock.tick(snake_speed)
pygame.quit()
quit()
Теперь мы можем запустить игру, и у нас будет возможность перезапустить ее после окончания. Это делает игру более интерактивной и увлекательной.
Итоги и дальнейшие улучшения
Поздравляю! Вы только что создали свою собственную игру “Змейка” на Python. Мы прошли через все основные этапы разработки: от создания окна до добавления еды и логики столкновений. Но это только начало. Вы можете улучшить свою игру, добавив различные уровни сложности, таймер, а также различные виды еды с разными эффектами.
Также вы можете поэкспериментировать с графикой и звуками, чтобы сделать игру более привлекательной. Используйте свои творческие способности и не бойтесь пробовать что-то новое!
Надеюсь, это руководство было вам полезно, и теперь вы можете гордиться тем, что создали свою собственную игру. Удачи в дальнейших разработках!