BrainFu** - A Logic Game Written in Python.
  • Python 94.2%
  • Nix 5.8%
Find a file
Kirill Samoylenkov f3db22a8c5
All checks were successful
CI / fmt (push) Successful in 1m42s
fix: update sprites
2026-05-27 17:32:43 +05:00
.github/workflows ci: add treefmt formatting check (#1) 2026-05-15 18:35:55 +05:00
app fix: update sprites 2026-05-27 17:32:43 +05:00
.gitignore add[dev tools]: add .pre-commit config 2026-05-15 17:01:04 +05:00
.pre-commit-config.yaml add[dev tools]: add .pre-commit config 2026-05-15 17:01:04 +05:00
.python-version update[dev tools]: initialize uv project 2026-05-15 16:18:25 +05:00
flake.lock add[dev tools]: add devshell flake 2026-05-15 16:44:16 +05:00
flake.nix fix: fix pygame issues on nixos 2026-05-26 11:11:55 +05:00
LICENSE Initial commit 2026-05-14 23:58:33 +05:00
pyproject.toml update[dev tools]: add treefmt & update ruff, ty configs 2026-05-15 16:45:59 +05:00
README.md docs: add relevant algorithms 2026-05-27 16:30:21 +05:00
treefmt.toml update[dev tools]: add treefmt & update ruff, ty configs 2026-05-15 16:45:59 +05:00
uv.lock update[dev tools]: initialize uv project 2026-05-15 16:18:25 +05:00

BrainFu** - A Logic Game Written in Python

Сеточная 2D-игра, где игрок размещает логические компоненты, соединяет их проводами и строит цепи, управляющие защитными турелями для защиты от врагов.

Геймплей

  • Размещайте логические компоненты на сетке (Source, Wire, AND, OR, NOT, XOR, Turret).
  • Компоненты соединяются проводами автоматически при размещении рядом (бидирекционально).
  • Логические цепи управляют турелями, которые стреляют по врагам при сигнале TRUE.
  • Враги движутся по маршруту, приоритетно атакуя источники питания, обходя зоны огня.
  • Цель - собрать схему и пережить волны врагов.

Управление

Действие Клавиша
Выбрать компонент ЛКМ по кнопке
Разместить на сетке ЛКМ по тайлу
Удалить компонент ПКМ по тайлу

Архитектура проекта

app/
├── __main__.py         # Точка входа, игровой цикл, тики, отрисовка
├── config.py           # Константы: сетка, FPS, цвета, ComponentType, Weapon
├── components.py       # GameObject (ABC) + подклассы; Component dataclass
├── grid.py             # Тайловая сетка, размещение/авто-соединение/отрисовка
├── circuit_solver.py   # Симуляция цепи, итеративное распространение (без pygame)
├── enemy_ai.py         # Враги: A*, EnemyManager, приоритет целей, волны (без pygame)
└── ui.py               # Нижняя панель, кнопки компонентов, обработка кликов

Алгоритмы

1. Симуляция цепи - итеративное распространение ограничений

  • SOURCE инициализируется True, остальные - None.
  • На каждой итерации каждый компонент пересчитывает состояние через соседей (неориентированный граф).
  • Схождение = ни одно состояние не изменилось. Ограничение итераций (2×V) детектирует циклы.
  • Трёхзначная логика: True, False, None.
  • Сложность: O(V·E).

2. Поиск пути врагов - A* на взвешенной сетке

  • Базовая стоимость прохода = 1.
  • Занятые клетки непроходимы.
  • Зона огня активной турели (Chebyshev ≤ 3) = +5.0.
  • Эвристика: Манхэттенское расстояние.
  • Реализация: heapq, словари g_score и came_from.
  • Сложность: O(E log V).

3. Приоритет целей врага

Враги используют трёхуровневую систему выбора цели:

  1. Source без защиты - ближайший доступный Source вне зоны огня турелей.
  2. Source под защитой - ближайший доступный Source в зоне огня.
  3. Любой компонент - когда Source есть, но все недоступны (путь блокирован).
  4. Выход из карты - если Source на карте нет вообще.

Доступность цели проверяется A* до проходимой клетки рядом с целевым компонентом (не на сам компонент - он непроходим). При разрушении цели враг пересчитывает путь.

Запуск

python app/__main__.py

Для разработки

Зависимости

С помощью nix можно установить рабочее окружение: Python 3.13, uv, ruff, ty, treefmt, pre-commit:

nix develop

Форматирование

treefmt

Pre-commit

Автоматически прогоняет treefmt при коммите:

pre-commit install