Блог онлайн школы Пиксель

Бесплатный урок Python для детей: как создать игру «Змейка»

Помните известную игру «Змейка» — простую, но захватывающую? Если забыли, напомним правила: змея ползает по игровому полю, собирая еду и избегая столкновения с собственным хвостом и краями поля. Зная основы языка Python, в “Змейку”  можно не только сыграть, но и написать код игры самостоятельно.

Разработка игр развивает аналитическое мышление ребенка, помогает понять принципы кодинга, учит решать комплексные задачи. А знание 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
Экран для игры "Змейка"

Создание игры в 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.


Бесплатные видеоуроки Python для детей