Бесплатный урок 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 для детей: добавляем змейку и управляем ею
Запишем координаты, где появится змейка. Воспользуемся сложным способом записи — для уверенности в том, что змейка и еда, которую она будет есть, находятся на одной полосе и пересекутся. Для этого разбиваем область на ячейки по размерам змеи, после ставим ее на одну из ячеек — посередине.
В переменных 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()
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.
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.
Делаем функцию, которая будет проходиться по списку и рисовать блоки. Внутри цикла задаем новые координаты для головы и добавляем в список. Каждый раз к змее будет присоединяться еще один блок. Если длина списка превышает длину змейки, из него удаляется первый элемент — хвост.
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]
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()
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.