Готов создать игру, от которой не оторвешься? Давай вместе сделаем Amazing Frogs – убийцу Тетриса на Python! Тут тебе и падающие блоки, и взрывающиеся цвета, и хитрая механика. Запасайся кофе, открывай IDE, и поехали превращать код в игровое безумие!
Логика игры
Amazing Frogs – клон популярной винтажной игры Amazing Blocks:
Amazing Blocks – любопытный кроссовер между легендарным прародителем всех блочных головоломок Тетрисом и жанром «Три в ряд»:
- Фигуры состоят из трех элементов (тримино) вместо четырех (тетрамино).
- Тримино не поворачиваются вокруг своей оси – вместо этого меняются местами цветные блоки, из которых они состоят. Бывают и одноцветные тримино.
- Блоки могут отделяться от тримино, если один или два блока сталкиваются с препятствием. Оставшаяся часть фигуры продолжает движение.
- Вместо сгорания заполненных линий сгорают оказавшиеся по соседству 3 и более блоков одного цвета. При этом соседство определяется по горизонтали, вертикали и обеим диагоналям (справа налево и слева направо).
Остальная логика Amazing Frogs стандартна:
- При наборе каждых 20 очков происходит переход на следующий уровень, и скорость падения фигур увеличивается.
- Игра заканчивается, когда очередной фигуре некуда падать.
- Нажатие ↓ сбрасывает тримино вниз, пробел ставит игру на паузу, а Esc приводит к выходу.
🐍 Библиотека питониста
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»
🐍🎓 Библиотека Python для собеса
Подтянуть свои знания по Python вы можете на нашем телеграм-канале «Библиотека Python для собеса»
🐍🧩 Библиотека задач по Python
Интересные задачи по Python для практики можно найти на нашем телеграм-канале «Библиотека задач по Python»
Внешний вид и основные настройки игрового окна
Окно имеет фиксированный размер 450x600, а игровое поле представляет собой сетку 6x12 клеток. Блоки тримино состоят из двух квадратных элементов 50х50, слегка различающихся по яркости (для создания 2,5-эффекта), и полупрозрачного png-изображения, которое масштабируется до размера 20х20 с применением сглаживания:
Классы Block и Trimino
Эти классы – ключевые элементы игры: Block управляет поведением блоков, а Trimino определяет поведение состоящих из блоков фигур – тримино.
Block обеспечивает отрисовку блоков, движение (вправо/влево) и падение блоков (как уже упоминалось выше, блоки могут двигаться по отдельности после разделения тримино):
Trimino обеспечивает формирование тримино из трех цветных блоков, управляет перемещением всех блоков сразу (как цельной фигуры), и изменяет окраску элементов, которая внешне выглядит, как перестановка блоков внутри фигуры:
Оба класса взаимодействуют с сеткой (grid), которая представляет собой двумерный массив, отслеживающий положение блоков на поле. Это позволяет реализовывать проверку столкновений (например, для остановки падения) и движение блоков влево или вправо.
Окно завершения игры
Если игровое поле заполняется настолько, что очередной фигуре некуда падать, игра заканчивается: на экране появляются две кнопки – «Новая игра» и «Выйти». За визуализацию кнопок и клики по ним отвечает класс Button:
Статья по теме
🐍 Пишем Тетрис на Python с помощью библиотеки Pygame
Класс Game
Этот класс реализует всю основную логику игры, включая управление тримино, обновление состояния игры, проверку столкновений и отрисовку. Основные методы Game:
- reset_game – сбрасывает игру до начального состояния. Создает новую сетку, генерирует новый текущий и следующий тримино, обнуляет статистику и настройки.
- check_collision – проверяет, столкнулся ли блок с нижней границей сетки или с другим блоком. Если блок достиг низа или под ним есть другой блок, возвращает True.
- lock_trimino – когда тримино перестает двигаться, его блоки фиксируются в сетке, то есть цвет блоков сохраняется в массиве grid. Затем проверяются заполненные линии (метод check_lines), и если в верхнем ряду уже есть блоки, игра заканчивается.
- draw_next_trimino – отображает следующую фигуру в панели статистики справа.
- find_matches – ищет совпадения цветов блоков в сетке по горизонтали, вертикали и диагоналям (если три и более блоков одного цвета стоят рядом).
- remove_matches – удаляет найденные совпадения из сетки и сдвигает блоки выше вниз, заполняя пустые места, после чего обновляется статистика.
- level_up – увеличивает уровень игры, если было удалено достаточно блоков, после чего повышается скорость падения блоков.
- update – обновляет состояние игры, заставляя текущий тримино падать и проверяя столкновения. Если все блоки тримино остановились, они фиксируются на поле, после чего проверяются линии (check_lines) на наличие 3 и более блоков одного цвета, расположенных рядом.
- draw – отрисовывает текущий тримино и все заблокированные блоки на сетке. Также отображает статистику (счет, уровень) и следующий тримино, а если игра окончена, выводит окно с кнопками «Новая игра» и «Выйти».
Статья по теме
😛👻 Пишем игру Pac-Man на Python в 300 строк кода
Основной игровой цикл и обработка событий
Заключительный блок кода отвечает за основной игровой цикл, в котором происходят обработка событий, обновление состояния игры, отрисовка объектов на экране и управление паузами:
- clock = pygame.time.Clock() – используется для контроля частоты обновления игры (FPS).
- running = True – переменная-флаг для основного цикла игры, пока она True, цикл продолжается. Внутри этого цикла происходит все взаимодействие с игроком и обновление игры.
- paused = False – переменная для отслеживания, поставлена ли игра на паузу.
- Обработка событий for event in pygame.event.get(). Здесь происходит проверка на различные события (нажатие клавиш или закрытие окна).
Полный исходный код игры находится в репозитории Amazing Frogs.
В заключение
Pygame отлично подходит для разработки простых логических игр: обработку многих событий библиотека берет на себя. Однако если вы планируете создание сложной игры с более продвинутым интерфейсом, есть смысл использовать библиотеку Arcade или фреймворк Flet, основанный на Flutter.
***
Python: от новичка до junior-разработчика
Хочешь освоить Python и создать свой первый проект? Наш курс предлагает пошаговое обучение от основ до создания ботов и парсеров, с индивидуальной обратной связью от экспертов.
- 90+ часов обучения
- 4 проекта для портфолио
- Работа с PyCharm и Jupyter Notebook
- Основы ООП и алгоритмов
- Создание ботов для Telegram и Instagram
- Парсинг веб-страниц
Курс подходит как для начинающих, так и для тех, кто хочет углубить свои знания. Учитесь в своем темпе с поддержкой опытных преподавателей.
(function () { let link = document .getElementById ("3728f6bf-4aa8-4c19-9184-b07c4659bb21-https://proglib.io/w/98fb3ce1-45"); if (! link) return; let href = link .getAttribute ("href"); if (! href) return; let prefix = link .dataset .prefix; let action = link .dataset .action; link .addEventListener ("click", function (e) { let data = new FormData (); data .append ("url", href); apiFetch (action, { method: "POST", body: data }) .then (function (res) {}) .catch (function (err) { console .error (err); }); }) })();