Как ребенок может сделать игру тетрис на Python

В этой статье мы расскажем о том, как с помощью специального модуля Pygame даже ребенок сможет создать «Тетрис» на Python.

Как ребенок может сделать игру тетрис на Python

Тетрис — популярная аркадная игра, которая была разработана и выпущена русским программистом Алексеем Пажитновым в 1984 году. Она быстро стала мировым хитом и получила огромную популярность по всему миру.

Суть игры довольно проста, но именно это позволяет ей вызывать интерес у людей и по сей день. К тому же ее можно создать самому, используя возможности языка программирования Python («Питон»).

Если программирование для школьников вам не знакомо — не беда. Мы пошагово расскажем о том, что нужно делать для создания игры. Главное — повторять все со 100% точностью. Если вам удобнее воспринимать урок в формате видео, то под статьей мы прикрепили ролик, где преподаватель школы Pixel подробно объясняет, что необходимо установить, запустить и нажать, чтобы ваш проект заработал.

Python для школьников: создаем свой «Тетрис» с нуля

Напоминаем, что для начала кодинга игр на «Пайтоне» нам понадобится модуль Pygame. Для его установки следует запустить Windows PowerShell (приложение доступно по поиску при нажатии кнопки «Пуск») и прописать без кавычек «Pip install pygame», после этого нажать Enter.

Как ребенок может сделать игру тетрис на Python

Начинаем «Тетрис» на Python с импорта необходимых библиотек: pygame, random, copy. Особенно нам важна библиотека copy, так как она позже поможет нам в создании последних штрихов игры.

После этого запускаем Visual Studio Code, paygame и задаем два параметра: I_max и J_max.

Для первого параметра указываем число 11, а для второго — 21. В итоге у нас появляется 11 и 20 ячеек.

Создание «Тетрис» на Python для детей: добавляем переменные

Следующий шаг для того, чтобы ребенку сделать игру самому — создание переменных. Мы должны добавить их с параметрами экрана 300 на 600.

Как ребенок может сделать игру тетрис на Python

Затем приступим к формированию экрана, где указываем переменные и описываем класс Clock (), который будет отвечать за управление временем, а в нашем случае — за частоту его обновления. Также установим название экрана.

Кроме того, чтобы самому сделать игру «Тетрис» нужно вычислить ширину и высоту каждой ячейки нашей сетки. Делим параметр screen на I_max - 1 и J_max - 1. Это объясняется тем, что каждая точка в области соответствует одной ячейке, и количество точек на единицу меньше количества ячеек. Для определения частоты обновления кадров мы создаем переменную, равную 60.

Если вы читаете текст здесь и у вас что-то не получается, то внизу страницы будет указан полный код для запуска проекта. Проверьте все данные или скопируйте часть параметров для самопроверки.

Продолжаем онлайн-урок на Python для детей: запускаем цикл

Теперь предстоит создать список, в котором будут храниться настройки сетки (именно она и будет отображаться на экране).

Также с помощью цикла мы проверим все схемы сетки, включив их во все списки. Внутрь него достаточно установить только единицу, после чего мы укажем остальные параметры для каждой ячейки.

В следующем цикле заполняем существующие списки сущностями прямоугольников — rect, и указываем цвет для каждого. В итоге у вас получится большой список для каждой ячейки. Также требуется прописать координаты прямоугольников с указанием их местоположения — применяем умножение номера точки на шаг.

По завершении запускаем бесконечный цикл.

Создание игры на Python с нуля: заливка экрана

После запуска бесконечного цикла нам предстоит заняться заливкой холста с его покадровым обновлением, а также создать сетку.

Необходимо пройтись по всем прописанным строчками и создать рисунок каждого квадрата.

Здесь двойка — это цвет, единица — сущность уже существующего четырехугольника, а ноль — это тип заполнения. В заполнении цифра 1 создаст границу, а 0 сделает заливку сплошной. После этого добавляем обновление.

«Тетрис» для детей на Python: детали

В верхнем правом углу нажимаем на треугольник (Play), который отобразит написанный код через консоль. Должна быть видна белая сетка на черном фоне. Если это так — вы на правильном пути.

Для более правильной работы кода добавим событие «нажатие на крестик». Это прописывается ниже строки game=True.

Как ребенок может сделать игру тетрис на Python

Чтобы вспомнить о том, какие фигуры (детали) используются в игре, с ними можно ознакомиться в интернете, например, в «Википедии». Всего в «Тетрисе» используются 7 элементов, каждый из которых состоит из 4 кубов.

Рисовать детали мы будем интересным способом: запишем координаты шагов относительно центра, то есть точки 00, и далее будем исходить из того, что 3-й элемент — это 00.

Следующий шаг — сделать список с сущностями деталей. С этой целью мы создаем список det.

Каждую фигуру необходимо наполнить сущностями четырех квадратов. При этом координаты мы будем брать из ранее созданного списка. Умножаем их на шаг и ставим в центр экрана сверху.

Как ребенок может сделать игру тетрис на Python

Теперь можно вывести список в консоль для проверки. В итоге внизу экрана можно будет увидеть информацию о наличии 7 деталей, в каждой из которых будет по 4 квадратика.

Сделаем случайный выбор детали из нашего списка и настроим отрисовку детали в программе. Напишем условие, чтобы на каждый кадр запускался цикл по четырем прямоугольникам внутри случайно выбранной детали. То есть в каждый кадр будет прорисовано 4 прямоугольника из списка случайно выбранной детали. Запускаем консоль для проверки — должна появиться деталь вверху экрана. При каждом новом запуске консоли будет появляться случайная фигура — так и должно быть.

Настройка движения детали в игре на языке Python для детей

Для настройки движения детали, перед ее отрисовкой мы должны снова написать последовательность, которая будет проходиться по четырем элементам. Движение будет происходить очень просто: нужно взять det_choice и поменять координаты у всех четырех квадратов на шаг dx и dy.

Можно, например, прописать строчку 1*dx. Если после этого запустить консоль (напоминаем о кнопке со значком треугольника в верхнем правом углу), то фигура будет двигаться очень быстро вправо, едва заметно. Если поменять значение на минус один, произойдет быстрое смещение влево.

Далее следует создать еще один event, который сработает при нажатии кнопки. Сейчас, нажав на кнопку (которая должна сдвигать фигуру влево), мы меняем значение delta_x на -1. Для правой стрелки делаем аналогично, только со значением +1. Проверяем. Фигуры должны передвигаться более плавно.

Как ребенок может сделать игру тетрис на Python

Следующий пункт — настройка границ, запрет выхода из них. Добавьте условие, что если фигура «пробралась» за грань рабочей области, delta_x будет обнулено и движение не произойдет.

Теперь необходимо настроить аналогичное перемещение по оси Y. Если до этого момента вы все сделали правильно, то фигура после запуска консоли должна быстро переместиться сверху вниз. Чтобы это исправить, важно включить перемещение только на каждые 30 обновлений. Теперь после запуска консоли фигура будет достаточно медленно передвигаться сверху вниз.

Добавление ускорения и границ по оси Y

В уроке от онлайн-школы Pixel мы решили рассказать о том, как добавить ускорение падения фигуры, чтобы это еще больше напоминало оригинальный «Тетрис». Чтобы клавишу можно было зажать, требуется запустить get_pressed(). Если нажатая кнопка совпадает с pygame. K_DOWN (кнопка, назначенная на движение вниз), то число обновлений должно быть равно 31.

Как ребенок может сделать игру тетрис на Python

Если сейчас проверить функцию и нажать стрелку вниз, фигура «улетит» за нижнюю границу консоли. Чтобы этого не происходило, обозначим границы экрана по оси Y. После настройки фигура остановится на нижней границе. Проверить это легко: запускаем консоль и дожидаемся падения фигуры.

После остановки движения важно, чтобы вверху консоли появилась новая фигура. Для этого необходимо закрасить клетки сетки (где осталась деталь) белым цветом. То есть вы должны задать значение заливки и сделать его равным нулю, а цвет поменять с серого на белый. После чего необходимо настроить новый выбор случайного элемента.

Чтобы закрасить клетки, необходимо определиться с индексами клеток. Следует записать две переменные X и Y - и уже в этих переменных менять заданные параметры. После чего прописываем условие для выбора случайной детали. Проверьте написанный код через консоль — детали должны падать сверху вниз, как в «Тетрисе».

В итоге становится заметна одна проблема — во время игры выпадают исключительно семь фигур, а новые не появляются.

Как ребенок может сделать игру тетрис на Python

Это стало итогом того, как именно происходит сохранение информации при использовании языка программирования «Питон». Когда менялись данные о местоположении, менялся и список. Чтобы исключить проблему, важно сделать копию фигур из списка и изменить данные местоположения копии, а не оригинальной детали. Именно поэтому потребуются возможности библиотеки copy, о которой мы писали в самом начале.

После этого снова потребуется запуск консоли для проверки. Если все выполнено верно, новые фигуры появляются в количестве более 7 штук. Но возникает новая проблема — они не ставятся друг на друга!

Так как в онлайн-школе Pixel преподают программирование для детей, то мы знаем способ, с помощью которого любой ребенок сможет справиться с этой ситуацией. Добавляем еще одно условие нижней грани — если нижняя ячейка имеет цвет, то мы останавливаем движение. В результате фигура остается на месте.

На этом этапе основные игровые механики уже реализованы, но требуется добавить некоторые функции и особенности, которые есть в оригинальной игре. Самые важные моменты, которые должны быть реализованы — поворот фигур и «сжигание» заполненного ряда.

Добавляем возможность поворота в будущую игру

Вы уже находитесь на финишной прямой создания игры для детей на Python. Сейчас мы расскажем, как добавить 2 важные игровые механики, после чего можно будет поиграть в свой собственный «Тетрис».

Начнем с поворота — сделаем его по стандартной математической формуле поворота на 90 градусов в декартовой системе координат. То есть относительно центра в (0,0). Центр у вас должен быть записан в третьей ячейке, поэтому прописываем как центр второй индекс det_choice [2]. При этом поворот мы привязываем к нажатию стрелки вверх.

Как ребенок может сделать игру тетрис на Python

Также необходимо создать еще одну проверку на нажатие клавиши стрелки вверх — при ее нажатии переменная rotate становится равной True. Таким образом выполняется условие и мы проходимся по всем элементам наших деталей и смещаем их относительно центра вращения, после чего переписываем rotate на False. Проверяем. Если все выполнено верно, фигуры должны поворачиваться и заполнять пустые места «на дне». Но если фигуры сложились в один ряд, этот ряд не исчезнет. Чтобы он исчезал, пропишем еще несколько условий.

Для этого запустим цикл, который будет проверять насколько у нас заполнен каждый ряд. Будем идти снизу вверх и слева направо, и считать число заполненных ячеек. Они будут заполнены, когда параметр заполнения равен нулю. Но если хотя бы одна ячейка не будет равна нулю, это значит, что вся полоска уже точно не заполнена, и можно завершить цикл на этом ряду и проверять следующий.

Теперь добавляем условие — если число заполненных ячеек равно числу ячеек в целом, то мы запускаем еще два цикла. Сначала все ячейки верхнего ряда делаем незакрашенными, а после, в следующем цикле, все ячейки рядов смещаем на один ряд вниз, начиная с того ряда, где мы нашли заполненность.

Запускаем финальную проверку. Если все сделано верно, то вы сможете поиграть в игру, которую написали сами!

Как ребенок может сделать игру тетрис на Python

Теперь вы знаете, как именно проходит обучение детей IT в школе программирования Pixel. Мы даем задания, которые интересно и полезно выполнять будущим программистам. Больше уроков вы можете на нашем Youtube-канале.

Если вы хотите, чтобы ваш ребенок изучал востребованные навыки и в будущем смог стать IT-специалистом, отправляйте его на курсы обучения в нашу IT онлайн-школу. Здесь он сможет изучить Python, Roblox, Scratch и многое другое. Курсы проходят как в онлайн, так и в офлайн-формате, в группах или индивидуально. Подходящий вариант найдется для каждого.

Полностью сегодняшний и многие другие уроки в видео-формате можно посмотреть тут.

Полный код игры «Тетрис» на Python:

import pygame import random import copy pygame.init() I_max = 11 J_max = 21 screen_x = 300 screen_y = 600 screen = pygame.display.set_mode((screen_x, screen_y)) clock = pygame.time.Clock() pygame.display.set_caption("Tetris Pixel Game") dx = screen_x/(I_max - 1) dy = screen_y/(J_max - 1) fps = 60 grid = [] for i in range(0, I_max): grid.append([]) for j in range(0, J_max): grid[i].append([1]) for i in range(0, I_max): for j in range(0, J_max): grid[i][j].append(pygame.Rect(i*dx, j*dy, dx, dy)) grid[i][j].append(pygame.Color("Gray")) details = [ [[-2, 0], [-1, 0], [0, 0], [1, 0]], [[-1, 1], [-1, 0], [0, 0], [1, 0]], [[1, 1], [-1, 0], [0, 0], [1, 0]], [[-1, 1], [0, 1], [0, 0], [-1, 0]], [[1, 0], [1, 1], [0, 0], [-1, 0]], [[0, 1], [-1, 0], [0, 0], [1, 0]], [[-1, 1], [0, 1], [0, 0], [1, 0]], ] det = [[],[],[],[],[],[],[]] for i in range(0, len(details)): for j in range(0, 4): det[i].append(pygame.Rect(details[i][j][0]*dx + dx*(I_max//2), details[i][j][1]*dy, dx, dy)) detail = pygame.Rect(0, 0, dx, dy) det_choice = copy.deepcopy(random.choice(det)) count = 0 game = True rotate = False while game: delta_x = 0 delta_y = 1 for event in pygame.event.get(): if event.type == pygame.QUIT: exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: delta_x = -1 elif event.key == pygame.K_RIGHT: delta_x = 1 elif event.key == pygame.K_UP: rotate = True key = pygame.key.get_pressed() if key[pygame.K_DOWN]: count = 31 * fps screen.fill(pygame.Color("Black")) for i in range(0, I_max): for j in range(0, J_max): pygame.draw.rect(screen, grid[i][j][2], grid[i][j][1], grid[i][j][0]) #границы for i in range(4): if ((det_choice[i].x + delta_x * dx < 0) or (det_choice[i].x + delta_x * dx >= screen_x)): delta_x = 0 if ((det_choice[i].y + dy >= screen_y) or (grid[int(det_choice[i].x//dx)][int(det_choice[i].y//dy) + 1][0] == 0)): delta_y = 0 for i in range(4): x = int(det_choice[i].x // dx) y = int(det_choice[i].y // dy) grid[x][y][0] = 0 #закрашиваем квадратик grid[x][y][2] = pygame.Color("White") detail.x = 0 detail.y = 0 det_choice = copy.deepcopy(random.choice(det)) #передвижение по x for i in range(4): det_choice[i].x += delta_x*dx count += fps #передвижение по y if count > 30 * fps: for i in range(4): det_choice[i].y += delta_y*dy count = 0 for i in range(4): detail.x = det_choice[i].x detail.y = det_choice[i].y pygame.draw.rect(screen, pygame.Color("White"), detail) C = det_choice[2] #центр СК if rotate == True: for i in range(4): x = det_choice[i].y - C.y y = det_choice[i].x - C.x det_choice[i].x = C.x - x det_choice[i].y = C.y + y rotate = False for j in range(J_max - 1, -1, -1): #цикл по рядам снизу вверх count_cells = 0 for i in range(0, I_max): #цикл по столбцам справа налево if grid[i][j][0] == 0: count_cells += 1 elif grid[i][j][0] == 1: break if count_cells == (I_max - 1): for l in range(0, I_max): grid[l][0][0] = 1 #все ячейки первого ряда for k in range(j, -1, -1): for l in range(0, I_max): grid[l][k][0] = grid[l][k-1][0] pygame.display.flip() clock.tick(fps)
Обучающий урок по программированию на Python от IT школы Pixel.
11
Начать дискуссию