Этот скрипт представляет собой глубокую модификацию проекта Tetris-io: Simple ML Edition. Исходный код, содержащий базовую механику Тетриса, был полностью переработан и трансформирован из пошаговой среды обучения с подкреплением в высокопроизводительный эволюционный планировщик финальных позиций.
Проект очищен от лишней мультимедийной нагрузки и разработан специально как полигон для изучения генетических алгоритмов и эвристического анализа в реальном времени.
Этот проект — не просто технический эксперимент. Это искренняя дань уважения англоязычному ютуберу Code Bullet.
Когда я был маленьким, я взахлеб смотрел его видео о том, как он создает безумные ИИ, заставляя их играть в Flappy Bird, Tetris и, конечно же, в Змейку. Его ролики, наполненные фирменным юмором, бесконечными циклами смертей игровых персонажей и первыми победами обученных нейросетей, вдохновили меня и привили огромную любовь к программированию и технологиям ИИ.
Спустя годы я написал этот проект, чтобы воплотить детскую мечту в реальность и создать свой собственный «цифровой разум», работающий по тем же принципам гибридной логики, о которых рассказывал Code Bullet.
Данный проект разработан не с нуля — он базируется на кодовой архитектуре моего предыдущего репозитория 🤖 Tetris-io (Simple ML Edition).
Tetris-io — это упрощенная, высокооптимизированная и стабильная версия классического «Тетриса» на Python и Pygame. Исходная сборка была полностью лишена тяжелых мультимедийных элементов, главного меню и искусственных задержек, что сделало её идеальной изолированной средой (Sandbox) для интеграции алгоритмов машинного обучения (Machine Learning) и обучения с подкреплением (Reinforcement Learning).
- Мгновенный сброс (Instant Reset): При заполнении стакана и проигрыше игра не зависает на экране «Game Over» и не требует ручного перезапуска. Метод
reset_env()мгновенно очищает поле, позволяя агенту ИИ безболезненно и без задержек начинать новые эпохи (episodes) обучения. - Вынесенный интерфейс: Панель счета и вся сопутствующая аналитика полностью вынесены за пределы игрового стакана на боковую панель (
PANEL_X). Это позволяет алгоритмам считывать чистую координатную сетку игрового пространства без визуального шума от текста. - Изолированная математика: Логика проверки коллизий деталей (
valid) и очистки рядов изначально была отделена от графического движка. Это позволило легко внедрить виртуальный перебор позиций (Lookahead) без фантомных отрисовок на экране. - Максимальная легковесность: Минимальное количество зависимостей гарантирует, что процессор не тратит ресурсы на рендеринг лишней графики, отдавая всю мощность математическим расчетам ИИ в многопоточных или ускоренных режимах.
В отличие от классических моделей Reinforcement Learning (таких как табличный Q-learning или DQN), которые совершают микро-действия (влево, вправо, поворот) на каждом кадре и страдают от «проклятия размерности», данный ИИ мыслит глобальными категориями.
При спавне каждой новой фигуры ИИ не ждет её падения. Метод make_best_move() запускает виртуальный перебор всех возможных финальных положений детали:
- Перебираются все доступные ротации фигуры (от 1 до 4).
- Для каждого поворота симулируется сброс во все 10 столбцов стакана.
- Взгляд в будущее (Lookahead): Для каждого успешного виртуального падения ИИ берет следующую фигуру (
nxt_p) и просчитывает лучшие ходы уже для неё. Это позволяет ИИ не зажимать самого себя и оставлять удобный рельеф для последующих ходов.
Каждое гипотетическое состояние доски после укладки оценивается линейной функцией по 4 ключевым метрикам профессионального Тетриса:
- Макс. высота башни (Height): ИИ стремится держать поле как можно ниже (отрицательный вес).
- Сожженные линии (LinesCleared): Прямая цель игры, поощряется экспоненциально (положительный вес).
- Количество дыр (Holes): Пустоты под заблокированными блоками — главный враг ИИ. Модель жестко штрафует себя за их создание.
- Шероховатость поля (Bumpiness): Суммарный перепад высот между соседними столбцами. ИИ стремится укладывать фигуры так, чтобы стол оставался идеально плоским, избегая глубоких шахт.
Вместо статичных коэффициентов в Tetris-AI-L.py заложен Генетический алгоритм:
- Мутация ДНК: Каждую новую партию с вероятностью Eps (20%) ИИ вносит случайные микро-изменения (мутации) в свои веса оценки поля.
- Естественный отбор: Если с мутировавшими весами ИИ набирает счет выше, чем текущий
best_score, игра закрепляет эти коэффициенты в качестве нового эталона «ДНК» поколения.
Скрипт поддерживает мгновенное переключение скоростей прямо во время выполнения с помощью клавиш клавиатуры:
- Клавиша
1[Режим демонстрации] — Пошаговое выполнение с частотой 60 кадров в секунду. Вы можете лично наблюдать за идеальной геометрической логикой укладки блоков ИИ. - Клавиша
2[Ускоренное обучение] — Просчитывает по 25 шагов ИИ за один кадр отрисовки интерфейса. Оптимально для быстрого набора базы данных без отключения картинки. - Клавиша
3[Максимальный разгон] — Полностью отключает отрисовку стакана, выводя только текстовую заставку с рекордами. Цикл крутит симуляцию по 500 шагов за раз, позволяя ИИ проживать сотни игр за секунды и находить лучшие мутации весов.
Проект написан на чистом Python 3 с использованием библиотек pygame и numpy, не требует CUDA или мощных видеокарт.
# Установка окружения
pip install pygame numpy
# Запуск ИИ
python Tetris-AI-L.pyСистема успешно преодолела проблему «застревания» на счете в ~490 очков благодаря внедрению Lookahead-прогнозирования и генетических мутаций весов. В первых же поколениях ИИ демонстрирует результаты 100000+ очков за одну сессию без единой системной ошибки.
Проект полностью избавлен от мусора. В репозиторий включен настроенный файл .gitignore, который автоматически блокирует кэш Python (__pycache__), временные файлы сред разработки (IDLE, VS Code) и системные логи Windows.
Проект распространяется под свободной лицензией MIT. Вы можете добавлять свои текстуры, препятствия или звуковые эффекты, свободно использовать, модифицировать и распространять данный код.
Сделано с ❤️ руками loanelly.

