Разработка игр развивает аналитическое мышление ребенка, помогает понять принципы кодинга, учит решать комплексные задачи. А знание Python пригодится детям в будущем, даже если профессия не напрямую будет связана с программированием.
Рассказываем, как составить игру в змейку на Python с помощью модуля Pygame — справится и начинающий. Для этого нужно установить модуль, придумать змейку, задать управление, не забыть о еде, добавить условия и вывод очков.
Школа «Пиксель» в уроке Python для детей поэтапно описывает, как прописать код змейки на Python — берем на вооружение. Для наглядности после прочтения статьи предлагаем посмотреть видеоролик про создание «Змейки».
Установка библиотеки Pygame в Python
Модуль Pygame не встроен в Python — его необходимо установить отдельно. Проще это сделать в консоли командой pip install pygame:
После установки можно использовать то, что входит в этот модуль: команды, переменные, классы. Для этого импортируем модуль.
- Запишем команду pygame.init(), которая активирует модули в Pygame.
- В 2 переменных — размеры окна будущей игры: 540 и 480 — под формат заднего фона.
- А также переменную fps, отвечающую за скорость обработки действий.
Создание экрана игры "Змейка" на Python
Для окна с указанными размерами в переменную clock запишем класс Clock(), который поможет с обработкой времени. Затем загрузим картинку и дадим название игре — Snake Pixel Game.
После можно запускать игру. Для ее непрерывной работы используем цикл с булевой переменной.
Командой 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 для детей: добавляем змейку и управляем ею
Запишем координаты, где появится змейка. Воспользуемся сложным способом записи — для уверенности в том, что змейка и еда, которую она будет есть, находятся на одной полосе и пересекутся. Для этого разбиваем область на ячейки по размерам змеи, после ставим ее на одну из ячеек — посередине.
- В переменных dx и dy указываем направление движения. Важно помнить, что в pygame ось y направлена вниз — чтобы змейка изначально шла наверх.
- В событиях добавляется проверка нажатия клавиш. Если это нужные стрелки, направление меняется в соответствии с ними.
- После настраиваем передвижение координаты: x += dx * SNAKE_SIZE. В новых координатах рисуем прямоугольник, которым является змея. Заносим экран, цвет, указываем координаты и размеры прямоугольника. Суть передвижения: в каждый кадр пишется новая координата, и квадратик переставляется на нее.
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
Добавим условия окончания игры. Они сработают, если пользователь врезался в границы или вышел за них — x больше размера экрана и меньше нуля. Так же и для y. Для этого пропишем функцию game_over().
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()
Python для детей: рисуем еду для змейки
Теперь, когда змейка передвигается, пришло время рисовать еду для нее.
Еда будет круглой, поэтому вводим переменную для диаметра. Затем пишем формулу для рандомных координат еды. Добавляем переменную длины змейки и собранных очков. В заданных координатах рисуем круг.
Определяем условие: если координаты змейки равны координатам еды, то очки прибавляются. Обратите внимание, как меняются координаты еды: новый объект не создается — старые координаты «телепортируются» на другое место. К длине змеи прибавляется +1.
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()
Увеличиваем змею в игре на Python
Пишем список, где хранятся координаты каждой части змеи. В нем также вложенные списки с 2 координатами: x и y.
Делаем функцию, которая будет проходиться по списку и рисовать блоки. Внутри цикла задаем новые координаты для головы и добавляем в список. Каждый раз к змее будет присоединяться еще один блок. Если длина списка превышает длину змейки, из него удаляется первый элемент — хвост.
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, py*game.Color("black"), [block[0], block[1], SNAKE_SIZE, SNAKE_SIZE])*
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()
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)
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, 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()
Игра Python: столкновение с собой
Указываем, чтобы каждый раз программа проверяла, не находится ли голова на каком-то из блоков. Если да — делаем выход.
draw_snake(snake_list)
for block in snake_list[:-1]:
if block == head:
game_over()
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:
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
# flip — Update the full display Surface to the screen
pygame.display.flip()
clock.tick(fps)
pygame.quit()
Выводим очки в игре
Пишем функцию, которая будет показывать количество очков.
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
В конце делаем запрет на разворот на 180 градусов. Для этого создадим 4 переменные и переназначим при каждом повороте.
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 для начинающих создана и работает. Попробуйте ее написать, а также привнести что-то свое: при обучении языку программирования главное — как можно чаще практиковаться, постепенно выходя за рамки поставленных задач и проявляя фантазию. Ведь это увлекательно — самому придумать внешний вид героя и противников, научить спрайтов стрелять и передвигаться с заданной скоростью. Варианты других игр — на YouTube-канале школы «Пиксель».
Глубже разобраться в кодинге школа «Пиксель» помогает на курсах по программированию на Python. Пройдя офлайн- или онлайн-курс по Python для детей, школьник познакомится с разработкой, научится конструировать чат-ботов и проектировать 2D-игры на языке Python.