BrainFu** - Сеточная 2D tower-defense игра на Python.
- Python 97.8%
- Nix 2.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .github/workflows | ||
| app | ||
| assets | ||
| media | ||
| sounds | ||
| tests | ||
| .gitignore | ||
| .python-version | ||
| flake.lock | ||
| flake.nix | ||
| LICENSE | ||
| pyproject.toml | ||
| README.md | ||
| treefmt.nix | ||
| uv.lock | ||
BrainFu** - A Tower Defense Game Written in Python
Сеточная 2D tower-defense игра, где игрок размещает энергетические компоненты, объединяет их в сеть узлов и защищает источники энергии от волн врагов.
Подробное руководство по игре, компонентам и стратегиям доступно в мануале.
Геймплей
- Размещайте компоненты на сетке: Source, Node, Turret, Factory, Wall, Mine.
- Source вырабатывает энергию. Разместить можно только на специальных power-node клетках.
- Node расширяет радиус сети на
NODE_RANGEклеток. Энергия передаётся по евклидову расстоянию. - Turret атакует врагов в радиусе, если подсеть вырабатывает достаточно энергии.
- Factory производит Matter для строительства, если подсеть запитана.
- Wall блокирует проход врагам.
- Mine взрывается при приближении врагов, нанося урон по площади.
- Энергия в одной подсети суммируется от всех Source. Если суммарное потребление превышает выработку, все Turret и Factory в этой подсети отключаются.
- Враги идут к ближайшему достижимому Source. Если источник отгорожен, они ломают стены на границе его зоны. Если источников нет, враги покидают карту через выход.
- Цель - продержаться заданное число волн.
Управление
| Действие | Клавиша |
|---|---|
| Выбрать компонент 1-6 | 1-6 |
| Улучшить выбранный тайл | U |
| Разместить на сетке | ЛКМ по тайлу |
| Удалить компонент | ПКМ по тайлу |
| Пропустить задержку волны | Пробел |
| Пауза | Esc |
| Старт следующей волны | ЛКМ по кнопке волны |
При наведении на энергетический компонент отображается подсказка: выработка подсети, суммарное потребление и статус (работает / нет энергии).
Чит-коды
| Эффект | Комбинация |
|---|---|
| Бесконечная материя | ↑ ↑ ← → |
| Пропустить волну | ↓ ↓ ↑ ↑ |
| +10 жизней | ← → ← → ← → |
Режимы игры
- Standard - 10 волн, классическая сложность.
- Hard - 20 волн, враги сильнее и быстрее, больше времени между волнами.
- Endless - волны не заканчиваются, сложность постепенно растёт.
Архитектура проекта
app/
├── __init__.py # Маркер Python-пакета
├── __main__.py # Точка входа: инициализация pygame, игровой цикл, тики, отрисовка
├── asset_manager.py # Загрузка шрифтов, текстур, спрайтов
├── components.py # Базовые классы: GameObject, Component, EnergyLink, EnergyNetwork
├── config.py # Константы, ComponentConfig, ComponentType, EnemyType, Weapon, GameMode
├── circuit_solver.py # Построение энергетических подсетей и расчёт мощности
├── enemy_ai.py # ИИ врагов: flow field, поиск пути, атака, снаряды, взаимодействие со стенами
├── enemy_spawner.py # Создание врагов с параметрами текущей волны
├── game_logic.py # Основная игровая логика: размещение, улучшение, экономика, тики
├── grid.py # Тайловая сетка, размещение компонентов, отрисовка карты
├── input_controller.py # Обработка клавиатуры, мыши, чит-кодов, паузы и game over
├── menu.py # Главное меню, выбор режима, ссылки на репозиторий и мануал
├── menu_background.py # Анимированный фон главного меню
├── mine_handler.py # Логика мин: обнаружение врагов, взрыв, урон по площади
├── projectile_manager.py # Управление снарядами врагов и турелей
├── renderer.py # Отрисовка врагов, компонентов, превью радиуса, HP-bar, подсказок
├── save_manager.py # Сохранение и загрузка игрового состояния
├── sound_manager.py # Загрузка и воспроизведение звуковых эффектов
├── ui.py # Нижняя панель, кнопки, тултипы, обработка кликов
└── wave_manager.py # Волны врагов, жизни базы, задержки, победа и поражение
tests/ # Unit-тесты
.github/workflows/ci.yaml # Actions Workflow
Алгоритмы
1. Энергетическая сеть
- Все компоненты, кроме стен, образуют неориентированный граф.
- Source и Node соединяются друг с другом, если находятся в радиусе
NODE_RANGE. - Turret и Factory соединяются с ближайшим Source/Node в радиусе
NODE_RANGE. - Каждая связная компонента - одна подсеть.
production = sum(source.power_output * SOURCE_POWER_MULTIPLIER).consumption = sum(TURRET_ENERGY_COST) + sum(FACTORY_ENERGY_COST).- Если
production >= consumption, все потребители работают. Иначе все отключаются.
2. Враги
- Враги используют flow field для движения к цели.
- Цель - ближайший Source, до которого можно добраться. Если Source недостижим, враги бьют стены на границе его зоны.
- Если Source нет, цель - выход карты (
target_point). - Активные (запитанные) турели увеличивают стоимость клеток в своей зоне поражения, заставляя врагов обходить их.
- Враги атакуют Source в ближнем бою или на расстоянии (ranged-типы).
- При уничтожении Source перестраивается flow field, и враги переключаются на оставшиеся Source или уходят с карты.
3. Улучшения
- Каждый компонент можно улучшать до 5 уровня.
- Стоимость улучшения:
base_cost * текущий_уровень. - С каждым уровнем растут характеристики: урон/радиус/скорострельность турелей, HP и мощность Source, HP стен, производство Factory, урон и радиус Mine, HP Node.
Запуск
nix develop --command python -m app
Для разработки
Окружение
Рекомендуется использовать nix для доступа к treefmt и pre-commit-hooks.
nix develop
Форматирование и линтер
nix develop --command treefmt
nix develop --command ruff check app tests
Тесты
nix develop --command pytest
CI
При каждом push и pull request в main запускается:
- Сборка devShell.
- Проверка форматирования через
treefmt --ci. - Запуск
pytest.
Результаты тестов сохраняются как артефакт.

