BrainFu** - Сеточная 2D tower-defense игра на Python.
  • Python 97.8%
  • Nix 2.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Kirill Samoylenkov 142651e6c1
All checks were successful
CI / test (push) Successful in 2m31s
refactor(enemy_ai): extract mine logic into MineHandler
2026-06-23 04:11:50 +05:00
.github/workflows fix: fix upload-artefacts version error 2026-06-21 22:49:22 +05:00
app refactor(enemy_ai): extract mine logic into MineHandler 2026-06-23 04:11:50 +05:00
assets update(ui): add clickable footer links to repository and profile 2026-06-22 05:39:55 +05:00
media docs(readme): update controls, game modes and enemy mechanics 2026-06-22 15:22:50 +05:00
sounds feat(audio): add sound effects manager and game audio 2026-06-22 07:50:25 +05:00
tests refactor(enemy_ai): extract mine logic into MineHandler 2026-06-23 04:11:50 +05:00
.gitignore feat: add animated menu background 2026-06-21 10:54:54 +05:00
.python-version update[dev tools]: initialize uv project 2026-05-15 16:18:25 +05:00
flake.lock ci: update treefmt-nix & add pre-commit-nix config 2026-06-18 21:08:44 +05:00
flake.nix docs: update readme 2026-06-18 21:38:18 +05:00
LICENSE Initial commit 2026-05-14 23:58:33 +05:00
pyproject.toml chore(release): bump version to 1.0.0 2026-06-22 15:28:23 +05:00
README.md docs: update project structure section 2026-06-22 15:45:36 +05:00
treefmt.nix refactor: optimize internals and expand test coverage 2026-06-21 13:22:07 +05:00
uv.lock update[dev tools]: initialize uv project 2026-05-15 16:18:25 +05:00

BrainFu** - A Tower Defense Game Written in Python

Сеточная 2D tower-defense игра, где игрок размещает энергетические компоненты, объединяет их в сеть узлов и защищает источники энергии от волн врагов.

Подробное руководство по игре, компонентам и стратегиям доступно в мануале.

Геймплей

Главное меню BrainFunc Выбор режима

  • Размещайте компоненты на сетке: 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 запускается:

  1. Сборка devShell.
  2. Проверка форматирования через treefmt --ci.
  3. Запуск pytest.

Результаты тестов сохраняются как артефакт.