Учебный проект пошаговой симуляции 2D-мира на Python. Мир представлен в виде сетки, где существа и объекты занимают отдельные клетки и взаимодействуют по заданным правилам. Проект демонстрирует применение принципов ООП: инкапсуляции, иерархий классов, разделения ответственности и расширяемости архитектуры.
Отработка и закрепление принципов объектно-ориентированного проектирования и архитектурного дизайна приложений.
Симуляция представляет собой пошаговое моделирование двумерного мира размером NxM. Каждая клетка может быть занята ровно одним объектом или существом.
В мире присутствуют:
- живые существа: травоядные и хищники;
- ресурсы: трава, используемая травоядными;
- статичные объекты: деревья и камни, занимающие пространство и влияющие на передвижение.
На каждом шаге симуляции существа принимают решения в соответствии со своим поведением: перемещаются, взаимодействуют с окружающей средой или с другими существами.
-
Entity
Базовый абстрактный класс для всех объектов и существ симуляции. -
Creature
Абстрактный класс для живых существ. Содержит общее состояние (скорость, HP) и контракт поведения в виде абстрактного методаmake_move. -
Herbivore / Predator
Конкретные реализации поведения:- травоядные ищут и потребляют ресурсы;
- хищники преследуют травоядных и атакуют их.
-
Grass, Rock, Tree
Ресурсы и статичные объекты, не обладающие собственной логикой хода.
- Map
Отвечает за хранение состояния мира и расположение сущностей.
Внутреннее устройство карты инкапсулировано; взаимодействие с ней осуществляется через методы с явной семантикой (добавление, удаление, проверки состояния ячеек).
-
Action
Абстракция действия, совершаемого над миром. Каждое действие оформлено отдельным классом и оперирует состоянием карты.В симуляции используются два набора действий:
- действия инициализации (выполняются перед стартом);
- действия хода (выполняются на каждом шаге симуляции).
-
Simulation
Центральный управляющий компонент, который:- хранит состояние симуляции;
- управляет жизненным циклом;
- выполняет действия;
- инициирует рендеринг;
- обрабатывает пользовательский ввод.
-
Pathfinder
Независимый компонент поиска пути к ближайшей цели. В качестве алгоритма поиска используется BFS. Не встроен в классы существ и не зависит от их логики, что упрощает повторное использование и развитие. -
Renderer
Отвечает за визуализацию состояния мира. Используется терминальный вывод с применением ANSI-последовательностей и цветовых схем.
- Python 3.9+
- Терминальная визуализация (ANSI 256 colors)
loguru— логированиеuv— управление зависимостямиmypy,ruff— статический анализ и контроль качества кода
Клонируйте репозиторий:
git clone https://github.com/ikorepanov/simulation.git
cd simulationУбедитесь, что установлен uv и синхронизируйте зависимости:
uv syncЗапуск симуляции:
python -m simulation.mainили через entry point:
uv run simulationПосле запуска симуляция сразу начнёт выполняться и отрисовываться в терминале.
Основные параметры симуляции задаются в simulation/settings.py:
- размер карты:
WIDTH = 40
HEIGHT = 20
- количество сущностей:
PREDATOR_NUMBER = 10
HERBIVORE_NUMBER = 50
GRASS_NUMBER = 200
-
параметры существ (HP, скорость, сила атаки);
-
цветовая схема терминала:
COLOR_SCHEME = 'abyss'
Доступные цветовые схемы:
industrial, midnight, ocean, savanna, twilight, glacier, abyss.
Во время выполнения симуляции доступны следующие команды (вводятся с подтверждением клавишей Enter):
p- поставить симуляцию на паузу или снять с паузыq- завершить выполнение