BrainFu** - A Logic Game Written in Python.
- Python 94.2%
- Nix 5.8%
|
|
||
|---|---|---|
| .github/workflows | ||
| app | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| .python-version | ||
| flake.lock | ||
| flake.nix | ||
| LICENSE | ||
| pyproject.toml | ||
| README.md | ||
| treefmt.toml | ||
| uv.lock | ||
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. Приоритет целей врага
Враги используют трёхуровневую систему выбора цели:
- Source без защиты - ближайший доступный Source вне зоны огня турелей.
- Source под защитой - ближайший доступный Source в зоне огня.
- Любой компонент - когда Source есть, но все недоступны (путь блокирован).
- Выход из карты - если 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