Готов создать игру, от которой не оторвешься? Давай вместе сделаем Amazing Frogs – убийцу Тетриса на Python! Тут тебе и падающие блоки, и взрывающиеся цвета, и хитрая механика. Запасайся кофе, открывай IDE, и поехали превращать код в игровое безумие!
Amazing Blocks – любопытный кроссовер между легендарным прародителем всех блочных головоломок Тетрисом и жанром «Три в ряд»:
Фигуры состоят из трех элементов (тримино) вместо четырех (тетрамино).
Тримино не поворачиваются вокруг своей оси – вместо этого меняются местами цветные блоки, из которых они состоят. Бывают и одноцветные тримино.
Блоки могут отделяться от тримино, если один или два блока сталкиваются с препятствием. Оставшаяся часть фигуры продолжает движение.
Вместосгораниязаполненных линий сгорают оказавшиеся по соседству3 и болееблоководного цвета. При этом соседство определяется по горизонтали, вертикали и обеим диагоналям (справа налево и слева направо).
Остальная логика Amazing Frogs стандартна:
При наборе каждых 20 очков происходит переход на следующий уровень, и скорость падения фигур увеличивается.
Игра заканчивается, когда очередной фигуре некуда падать.
Нажатие ↓ сбрасывает тримино вниз, пробел ставит игру на паузу, а Esc приводит к выходу.
Окно имеет фиксированный размер 450x600, а игровое поле представляет собой сетку 6x12 клеток. Блоки тримино состоят из двух квадратных элементов 50х50, слегка различающихся по яркости (для создания 2,5-эффекта), и полупрозрачного png-изображения, которое масштабируется до размера 20х20 с применением сглаживания:
Классы Block и Trimino
Эти классы –
ключевые элементы игры: Blockуправляет поведением блоков, а Trimino определяет поведение состоящих из блоков фигур – тримино.
Block обеспечивает отрисовку блоков, движение (вправо/влево) и падение блоков (как уже упоминалось выше, блоки могут двигаться по отдельности после разделения тримино):
Trimino обеспечивает формирование тримино из трех цветных блоков, управляет перемещением всех блоков сразу (как цельной фигуры), и изменяет окраску элементов, которая внешне выглядит, как перестановка блоков внутри фигуры:
Оба класса
взаимодействуют с сеткой (grid), которая представляет собой двумерный массив, отслеживающий положение
блоков на поле. Это позволяет реализовывать проверку столкновений (например,
для остановки падения) и движение блоков влево или вправо.
Окно завершения игры
Если игровое поле заполняется настолько, что очередной фигуре некуда падать, игра заканчивается: на экране появляются две кнопки – «Новая игра» и «Выйти». За визуализацию кнопок и клики по ним отвечает класс Button:
Этот класс реализует всю основную логику игры, включая управление тримино, обновление состояния игры, проверку столкновений и отрисовку. Основные методы 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 – отрисовывает текущий тримино и все заблокированные блоки на сетке. Также отображает статистику (счет, уровень) и следующий тримино, а если игра окончена, выводит окно с кнопками «Новая игра» и «Выйти».
Заключительный блок кода отвечает за основной игровой цикл, в котором происходят обработка событий, обновление состояния игры, отрисовка объектов на экране и управление паузами:
clock = pygame.time.Clock() – используется для контроля частоты обновления игры (FPS).
running = True – переменная-флаг для основного цикла игры, пока она True, цикл продолжается. Внутри этого цикла происходит все взаимодействие с игроком и обновление игры.
paused = False – переменная для отслеживания, поставлена ли игра на паузу.
Обработка событий for event in pygame.event.get(). Здесь происходит проверка на различные события (нажатие клавиш или закрытие окна).
Pygame отлично подходит для разработки простых логических игр: обработку многих событий библиотека берет на себя. Однако если вы планируете создание сложной игры с более продвинутым интерфейсом, есть смысл использовать библиотеку Arcade или фреймворк Flet, основанный на Flutter.
***
Python: от новичка до junior-разработчика
Хочешь освоить Python и создать свой первый проект? Наш курс предлагает пошаговое обучение от основ до создания ботов и парсеров, с индивидуальной обратной связью от экспертов.
90+ часов обучения
4 проекта для портфолио
Работа с PyCharm и Jupyter Notebook
Основы ООП и алгоритмов
Создание ботов для Telegram и Instagram
Парсинг веб-страниц
Курс подходит как для начинающих, так и для тех, кто хочет углубить свои знания. Учитесь в своем темпе с поддержкой опытных преподавателей.