Python — один из самых простых и удобных языков программирования, который отлично подходит для начинающих, в том числе для детей. Благодаря понятному синтаксису и огромному количеству доступных библиотек, он широко используется в разработке игр, анализе данных, веб-программировании и даже в сфере искусственного интеллекта.
Если ваш ребенок интересуется программированием, создание собственной игры — отличный способ изучить основы кода и логики. В этой статье мы разберем, как написать классическую игру «Змейка» на Python с использованием библиотеки Pygame. Такой проект поможет ребенку не только познакомиться с основами программирования, но и применить знания на практике.
А если вашему ребенку нравится идея разрабатывать игры, но пока не хватает навыков, в Школе программирования «Пиксель» он сможет освоить Python, Scratch, Roblox Studio и другие платформы для создания собственных игровых проектов.
«Питон» для детей: установка модуля для создания игры
Чтобы создать игру, нам понадобится библиотека Pygame. Она не входит в стандартную библиотеку Python, поэтому ее необходимо установить. Откройте терминал и введите команду:
pip install pygame
После установки библиотеки импортируем ее в программу:
import pygame
Активируем Pygame с помощью команды:
pygame.init()
Создание игрового окна
Теперь создадим окно для игры с размерами 540x480 пикселей. Оно будет использоваться для отображения игрового поля:
screen = pygame.display.set_mode((540, 480))
pygame.display.set_caption("Snake Pixel Game")
Чтобы управлять частотой кадров, создадим объект clock:
clock = pygame.time.Clock()
(Изображение: пустое игровое окно "Змейки".)
Загрузим картинку заднего фона (файл background.jpg должен находиться в той же папке, что и код):
BG = pygame.image.load("background.jpg")
Обучение Python для детей: создание 2D-игры
С помощью команды blit мы можем отобразить изображение, которое было загружено ранее. Это изображение нужно разместить в левом верхнем углу экрана, чтобы оно стало видимым для игрока.
Для этого указываем координаты (0, 0) при вызове функции blit. Далее необходимо использовать цикл for, который будет обрабатывать все события, происходящие в игре. Это может включать в себя нажатия клавиш, движение мыши или закрытие окна.
Важно, чтобы программа реагировала на каждое из этих событий. Например, если пользователь нажимает на крестик в углу окна (что означает желание закрыть программу), мы должны завершить работу приложения с помощью команды exit. После обработки всех событий необходимо обновить видимую область экрана с помощью команды flip.
Это позволит отобразить все изменения, которые произошли с момента последнего обновления. Также важно установить скорость обновления экрана с помощью объекта clock, который будет управлять частотой кадров (FPS). Это обеспечит плавность анимации и стабильную работу игры, позволяя избежать резких скачков в отображении графики.
import pygame
#активирует модули в pygame
pygame.init()
screen_x = 540
screen_y = 480
fps = 5
#display — module to control the display window and screen
#set_mode — Initializes a window or screen for display
screen = pygame.display.set_mode((screen_x, screen_y))
#pygame.time — pygame module for monitoring time
#clock() — create an object to help track time
clock = pygame.time.Clock()
bg = pygame.image.load("bg.jpg").convert()
pygame.display.set_caption("Snake Pixel Game")
game = True
while game:
#blit — draw one image onto another
screen.blit(bg, (0,0))
for e in pygame.event.get():
if e.type == pygame.QUIT:
exit()
#flip — Update the full display Surface to the screen
pygame.display.flip()
clock.tick(fps)
Добавление змеи и управление ею в игре на Python
Теперь нужно добавить змею и реализовать её управление ею для создания Python игры для детей. Сначала зададим размеры и координаты её появления. Лучше разбить игровое поле на ячейки, равные размеру змеи, чтобы еда и змея могли точно пересекаться. Змея появится в центральной ячейке дисплея.
Управление змеёй
Для управления создадим переменные dx и dy, которые будут отвечать за направление движения. Важно учитывать, что в Pygame ось Y направлена вниз. По умолчанию змея начнёт движение вверх.
Управление реализуется следующим образом:
- Если нажата стрелка влево (←), змейка двигается влево (dx = -размер_шага, dy = 0).
- Если нажата стрелка вправо (→), змейка двигается вправо (dx = размер_шага, dy = 0).
- Если нажата стрелка вверх (↑), змейка двигается вверх (dx = 0, dy = -размер_шага).
- Если нажата стрелка вниз (↓), змейка двигается вниз (dx = 0, dy = размер_шага).
Таким образом, змея будет двигаться в нужном направлении в зависимости от нажатой клавиши.
import pygame
import time
# активирует модули в pygame
pygame.init()
screen_x = 540
screen_y = 480
fps = 5
# display — module to control the display window and screen
# set_mode — Initializes a window or screen for display
screen = pygame.display.set_mode((screen_x, screen_y))
# pygame.time — pygame module for monitoring time
# clock() — create an object to help track time
clock = pygame.time.Clock()
bg = pygame.image.load("bg.jpg").convert()
pygame.display.set_caption("Snake Pixel Game")
SNAKE_SIZE = 15
cells_x = int(screen_x / SNAKE_SIZE)
cells_y = int(screen_y / SNAKE_SIZE)
x = int(cells_x/ 2) * SNAKE_SIZE
y = int(cells_y/ 2) * SNAKE_SIZE
dx = 0
dy = -1
game = True
while game:
# blit — draw one image onto another
screen.blit(bg, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
dx = -1
dy = 0
elif event.key == pygame.K_RIGHT:
dx = 1
dy = 0
elif event.key == pygame.K_UP:
dx = 0
dy = -1
elif event.key == pygame.K_DOWN:
dx = 0
dy = 1
x += dx * SNAKE_SIZE
y += dy * SNAKE_SIZE
# рисуем первый квадратик
pygame.draw.rect(screen, pygame.Color("black"), [x, y, SNAKE_SIZE, SNAKE_SIZE])
# flip — Update the full display Surface to the screen
pygame.display.flip()
clock.tick(fps)
pygame.quit()
Язык программирования Python 8 класс: код передвижения
Теперь напишем код для перемещения змеи. Для этого будем изменять её координаты, добавляя к текущим значениям направление движения. Размер шага должен соответствовать размеру змеи.
Для отрисовки змеи используем pygame.draw.rect, передавая в неё параметры: экран, цвет, координаты и размеры змеи. Однако сейчас змея может выходить за границы экрана. Чтобы исправить это, добавим условие завершения игры при столкновении змеи с границами поля.
Если x выходит за границы ширины экрана или становится меньше нуля, или y выходит за границы высоты дисплея, игра должна завершаться. Для этого вызовем функцию GameOver, которую создадим позже.
Функция GameOver будет выводить сообщение о завершении игры и задержку в 2 секунды перед выходом из программы. Если в коде возникнет ошибка из-за отсутствия модуля time, добавим его командой import time.
Настроим шрифт для вывода текста. Создадим переменную font, выбрав стандартный шрифт размером 50. Затем создадим текст «Игра окончена!» и выведем его на экран с помощью blit, указывая координаты размещения
def game_over():
font = pygame.font.SysFont(None, 50)
text = font.render("You lost", True, pygame.Color("red"))
screen.blit(text, [screen_x / 2, screen_y / 2])
while game:
# blit — draw one image onto another
screen.blit(bg, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
dx = -1
dy = 0
elif event.key == pygame.K_RIGHT:
dx = 1
dy = 0
elif event.key == pygame.K_UP:
dx = 0
dy = -1
elif event.key == pygame.K_DOWN:
dx = 0
dy = 1
if x >= screen_x or x < 0 or y >= screen_y or y < 0:
game_over()
pygame.display.flip()
time.sleep(2)
game = False
x += dx * SNAKE_SIZE
y += dy * SNAKE_SIZE
# рисуем первый квадратик
pygame.draw.rect(screen, pygame.Color("black"), [x, y, SNAKE_SIZE, SNAKE_SIZE])
# flip — Update the full display Surface to the screen
pygame.display.flip()
clock.tick(fps)
pygame.quit()
Добавление еды для змеи
Еда будет появляться в случайных местах. Для этого используем модуль random. Игровое поле разбиваем на ячейки размером 20 пикселей (если змея имеет тот же размер). Генерируем случайные координаты, умножая их на размер ячейки.
Еду будем рисовать круглой и красной с помощью pygame.draw.circle, указывая экран, цвет (красный), координаты центра и радиус 10 пикселей, чтобы диаметр совпадал с размером змеи.
dx = 0
dy = -1
SNAKE_SIZE = 15
food_d = SNAKE_SIZE
cells_x = int(screen_x / SNAKE_SIZE)
cells_y = int(screen_y / SNAKE_SIZE)
x = int(cells_x/ 2) * SNAKE_SIZE
y = int(cells_y/ 2) * SNAKE_SIZE
x_f = random.randrange(1, cells_x) * food_d
y_f = random.randrange(1,cells_y) * food_d
snake_length = 1
score = 0
while game:
# blit — draw one image onto another
screen.blit(bg, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
dx = -1
dy = 0
elif event.key == pygame.K_RIGHT:
dx = 1
dy = 0
elif event.key == pygame.K_UP:
dx = 0
dy = -1
elif event.key == pygame.K_DOWN:
dx = 0
dy = 1
if x >= screen_x or x < 0 or y >= screen_y or y < 0:
game_over()
pygame.display.flip()
time.sleep(2)
game = False
x += dx * SNAKE_SIZE
y += dy * SNAKE_SIZE
# рисуем первый квадратик
pygame.draw.rect(screen, pygame.Color("black"), [x, y, SNAKE_SIZE, SNAKE_SIZE])
pygame.draw.circle(screen, pygame.Color("red"), [x_f + food_d/2, y_f + food_d/2], food_d / 2)
if x == x_f and y == y_f:
score += SNAKE_SIZE
x_f = random.randrange(1, cells_x) * food_d
y_f = random.randrange(1,cells_y) * food_d
snake_length += 1
# flip — Update the full display Surface to the screen
pygame.display.flip()
clock.tick(fps)
pygame.quit()
Добавление счётчика очков
Добавим переменные snake_length (начальная длина змеи — 1) и score (начальное значение — 0). Когда змея съест еду, счёт увеличивается на 10, а длина змеи — на 1. После этого еда перемещается в новое случайное место.
score = 0
def show_score():
score_font = pygame.font.SysFont(None, 15)
score_surface = score_font.render('Score : ' + str(score), True, pygame.Color("white"))
screen.blit(score_surface, [5, 15])
while game:
# blit — draw one image onto another
screen.blit(bg, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
dx = -1
dy = 0
elif event.key == pygame.K_RIGHT:
dx = 1
dy = 0
elif event.key == pygame.K_UP:
dx = 0
dy = -1
elif event.key == pygame.K_DOWN:
dx = 0
dy = 1
if x >= screen_x or x < 0 or y >= screen_y or y < 0:
game_over()
pygame.display.flip()
time.sleep(2)
game = False
x += dx * SNAKE_SIZE
y += dy * SNAKE_SIZE
head = [x,y]
snake_list.append(head)
if len(snake_list) > snake_length:
del snake_list[0]
draw_snake(snake_list)
for block in snake_list[:-1]:
if block == head:
print("oops")
pygame.draw.circle(screen, pygame.Color("red"), [x_f + food_d/2, y_f + food_d/2], food_d / 2)
if x == x_f and y == y_f:
score += SNAKE_SIZE
spawn_food = True
snake_list.append([x, y])
x_f = random.randrange(1, 36) * food_d
y_f = random.randrange(1, 32) * food_d
snake_length += 1
show_score()
# flip — Update the full display Surface to the screen
pygame.display.flip()
clock.tick(fps)
pygame.quit()
Python: онлайн обучение детей
Не создавайте новый объект еды, а просто переместите существующий, как будто телепортом на новое место. Также добавьте длину и проверьте, как это работает.
Если все сделано правильно, еда собирается и перемещается. Теперь напишем код для увеличения длины нашей рептилии.
Создадим список для хранения координат каждой части тела пресмыкающейся. В нем будут вложены списки с координатами x и y для каждого блока. Напишем функцию, которая будет проходить по этому списку и рисовать каждый блок, принимая данные в качестве аргумента.
С помощью цикла for переберем элементы списка. Внутри цикла зададим новые координаты для головы и добавим их в список HAT, который будет объединяться с общим списком всех блоков, чтобы каждый раз добавлять новый блок к змее.
Чтобы увидеть результат, активируем функцию drawSnake. С каждым кадром к змее добавляется новый блок. Чтобы блоки не накладывались друг на друга и их количество не превышало длину змеи, добавим условие: когда длина становится больше заданной, удаляем первый элемент из списка.
Уроки Python для детей: настройка функций
Последний блок — это голова змеи, а первый — хвост. Теперь попробуйте добавить возможность собирать еду. Когда она ест еду, к ней добавляются новые блоки.
Добавим правило завершения игры, если змея сталкивается сама с собой. Для этого создадим цикл for, который будет проходить по всем блокам змейки, кроме головы (последнего элемента), и проверять, совпадают ли координаты головы с координатами любого из блоков. Если совпадение обнаружено, вызываем функцию gameOver, которая завершает игру.
Обратите внимание, что цикл проходит по списку блоков до предпоследнего элемента, так как последний элемент — это голова. Это важно для корректного завершения игры.
Теперь добавим функцию отображения количества набранных очков. Она будет аналогична функции gameOver, поэтому можно скопировать часть кода и адаптировать его. Измените названия переменных, чтобы избежать путаницы. Установите размер текста — 15, выберите текст, например, «Очки:», и задайте цвет, например, белый (white). Разместите текст в левом верхнем углу экрана.
Эту функцию необходимо интегрировать в бесконечный цикл игры, чтобы она обновлялась в реальном времени. Убедитесь, что очки корректно отображаются и увеличиваются, когда змея съедает еду.
Python для школьников: финальная настройка
В финале настройки можно внедрить запрет на разворот рептилии на 180 градусов. Это процесс, когда, например, она ползет наверх по прямой линии, мы нажимаем вниз, и она начинает двигаться в обратном направлении. Эту возможность необходимо исключить, так как в этом случае её голова будет врезаться сама в себя.
Чтобы исключить вероятность возникновения такой ошибки, требуется сделать следующее: создать четыре переменные, которые будут отвечать за запрет поворотов.
В зависимости от того, какая кнопка нажата, мы будем менять их значения. Например, если пресмыкающееся движется вверх, запретим кнопку «вниз». То же самое сделаем для других направлений:
- Змея движется влево? — запретим поворот вправо.
- Если движется вправо — запретим поворот влево.
- При условии, что движется вверх — запретим поворот вниз.
- При условии, что движется вниз — запретим поворот вверх.
Теперь поставим эти переменные в условия и проверим. Если всё работает, то змея не сможет развернуться на 180 градусов и врезаться в себя.
import pygame
import time
import random
# активирует модули в pygame
pygame.init()
screen_x = 540
screen_y = 483
fps = 5
# display — module to control the display window and screen
# set_mode — Initializes a window or screen for display
screen = pygame.display.set_mode((screen_x, screen_y))
# pygame.time — pygame module for monitoring time
# clock() — create an object to help track time
clock = pygame.time.Clock()
bg = pygame.image.load("bg.jpg").convert()
pygame.display.set_caption("Snake Pixel Game")
dx = 0
dy = -1
SNAKE_SIZE = 15
food_d = SNAKE_SIZE
x = int((screen_x / SNAKE_SIZE) / 2) * SNAKE_SIZE
y = int((screen_y / SNAKE_SIZE) / 2) * SNAKE_SIZE
x_f = random.randrange(1, 36) * food_d
y_f = random.randrange(1, 32) * food_d
game = True
close = False
spawn_food = True
snake_list = [[x, y]]
snake_length = 1
def draw_snake(snake_list):
for block in snake_list:
pygame.draw.rect(screen, pygame.Color("black"), [block[0], block[1], SNAKE_SIZE, SNAKE_SIZE])
score = 0
def show_score():
score_font = pygame.font.SysFont(None, 15)
score_surface = score_font.render('Score : ' + str(score), True, pygame.Color("white"))
screen.blit(score_surface, [5, 15])
def game_over():
font = pygame.font.SysFont(None, 50)
text = font.render("You lost", True, pygame.Color("red"))
screen.blit(text, [screen_x / 2, screen_y / 2])
Right = True
Left = True
Up = False
Down = True
while game:
# blit — draw one image onto another
screen.blit(bg, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT and Left:
dx = -1
dy = 0
Right = False
Left = True
Up = True
Down = True
elif event.key == pygame.K_RIGHT and Right:
dx = 1
dy = 0
Right = True
Left = False
Up = True
Down = True
elif event.key == pygame.K_UP and Up:
dx = 0
dy = -1
Right = True
Left = True
Up = True
Down = False
elif event.key == pygame.K_DOWN and Down:
dx = 0
dy = 1
Right = True
Left = True
Up = False
Down = True
if x >= screen_x or x < 0 or y >= screen_y or y < 0:
game_over()
pygame.display.flip()
time.sleep(2)
game = False
x += dx * SNAKE_SIZE
y += dy * SNAKE_SIZE
head = [x,y]
snake_list.append(head)
if len(snake_list) > snake_length:
del snake_list[0]
draw_snake(snake_list)
for block in snake_list[:-1]:
if block == head:
print("oops")
pygame.draw.circle(screen, pygame.Color("red"), [x_f + food_d/2, y_f + food_d/2], food_d / 2)
if x == x_f and y == y_f:
score += SNAKE_SIZE
spawn_food = True
snake_list.append([x, y])
x_f = random.randrange(1, 36) * food_d
y_f = random.randrange(1, 32) * food_d
snake_length += 1
show_score()
# flip — Update the full display Surface to the screen
pygame.display.flip()
clock.tick(fps)
pygame.quit()
Мы создали игру «Змейка» на Python, используя Pygame. Этот проект поможет детям и начинающим программистам освоить основы программирования, работы с графикой и взаимодействия с пользователем. Попробуйте добавить в игру счетчик очков, уровни сложности или другие механики, чтобы улучшить игровой процесс!
Итог
Всё готово! Попробуйте сами написать что-то подобное и предложить свои идеи. Хотите лучше разобраться в Python? Приходите на наши онлайн-курсы по различным направлениям.
При обучении языку программирования главное — как можно чаще практиковаться, постепенно выходя за рамки поставленных задач и проявляя фантазию. Ведь это увлекательно — самому придумать внешний вид героя и противников, научить спрайтов стрелять и передвигаться с заданной скоростью. Варианты других проектов — на RuTube-канале школы «Пиксель».
Обучение Python в школе «Пиксель»
Если хотите прокачаться в программировании, Школа «Пиксель» предлагает уроки Python для детей и подростков. Здесь можно освоить азы разработки, создать собственного чат-бота и спроектировать 2D-игры с нуля. Выбирайте удобный формат — онлайн или офлайн — и погружайтесь в мир кодинга с опытными преподавателями. Станьте настоящим IT-гуру вместе с «Пиксель».
На сайте школы представлены различные направления для погружения в мир ИТ. Выбирайте курс и записывайте ребёнка на обучение. Занятия в Pixel проводятся как онлайн, так и очно, в группах или индивидуально.