Skip to content

ikorepanov/simulation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simulation

Учебный проект пошаговой симуляции 2D-мира на Python. Мир представлен в виде сетки, где существа и объекты занимают отдельные клетки и взаимодействуют по заданным правилам. Проект демонстрирует применение принципов ООП: инкапсуляции, иерархий классов, разделения ответственности и расширяемости архитектуры.


Цель проекта

Отработка и закрепление принципов объектно-ориентированного проектирования и архитектурного дизайна приложений.


Описание симуляции

Симуляция представляет собой пошаговое моделирование двумерного мира размером NxM. Каждая клетка может быть занята ровно одним объектом или существом.

В мире присутствуют:

  • живые существа: травоядные и хищники;
  • ресурсы: трава, используемая травоядными;
  • статичные объекты: деревья и камни, занимающие пространство и влияющие на передвижение.

На каждом шаге симуляции существа принимают решения в соответствии со своим поведением: перемещаются, взаимодействуют с окружающей средой или с другими существами.


Архитектура

Сущности

  • Entity
    Базовый абстрактный класс для всех объектов и существ симуляции.

  • Creature
    Абстрактный класс для живых существ. Содержит общее состояние (скорость, HP) и контракт поведения в виде абстрактного метода make_move.

  • Herbivore / Predator
    Конкретные реализации поведения:

    • травоядные ищут и потребляют ресурсы;
    • хищники преследуют травоядных и атакуют их.
  • Grass, Rock, Tree
    Ресурсы и статичные объекты, не обладающие собственной логикой хода.


Карта

  • Map
    Отвечает за хранение состояния мира и расположение сущностей.
    Внутреннее устройство карты инкапсулировано; взаимодействие с ней осуществляется через методы с явной семантикой (добавление, удаление, проверки состояния ячеек).

Actions и Simulation

  • 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 - завершить выполнение

Releases

No releases published

Packages

No packages published

Languages