Консольная 2D-симуляция экосистемы с хищниками, травоядными и растительностью. Реализация с ООП подходом на Java.
Проект разработан в рамках учебного курса Java Backend Learning Course и представляет собой пошаговую симуляцию с автоматическим балансом популяций.
- ✅ Автоматическая симуляция экосистемы в реальном времени
- ✅ Три типа существ: хищники 🐺, травоядные 🐇, трава 🌾
- ✅ Интеллектуальное поведение написано при помощи алгоритма поиска кратчайшего пути (BFS)
- ✅ Система здоровья и голода с постепенным уроном
- ✅ Динамический спавн сущностей при снижении популяции
- ✅ Консольная визуализация с ANSI-графикой и эмодзи
- ✅ Управление симуляцией в реальном времени (пауза/возобновление/выход)
- ✅ Статистика популяций на каждом ходу
- Java 17 или выше
- Maven 3.6+
Примечание: Запускать приложение лучше всего в Windows Terminal во избежания неровности карты.
- Клонировать репозиторий:
git clone https://github.com/XanderGI/SimulationGame.git
cd SimulationGame- Собрать проект:
mvn clean package- Поменять кодировку на UTF8 в консоли(необходимо для корректного отображения emoji)
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
chcp 65001- Запустить:
java "-Dfile.encoding=UTF-8" -jar target/SimulationGame-1.0-SNAPSHOT.jar
В ходе реализации проекта старался следовать принципам Clean Architecture и SOLID, выражаю отдельную благодарность Алексею за качественное и очень полезное ревью моего прошлого проекта Виселица. Замечания постарался учесть в текущем проекте.
Приложение имеет следующие основные слои:
Domain Layer (бизнес-логика)
Entity— базовый класс для всех объектов на картеCreature— абстрактный класс существ с логикой здоровья и движенияHerbivore/Predator— конкретные реализации с уникальным поведениемGrass,Rock,Tree— статичные объекты среды
Simulation Layer (управление процессом)
Simulation— координатор симуляции, выполнение действий по ходамSimulationEngine— многопоточный движок с управлением жизненным цикломAction— паттерн Команда для действий (движение, спавн, рендеринг)SimulationFactory— создание настроенного экземпляра симуляции
Presentation Layer (UI)
Renderer— отрисовка карты и статистикиConsoleUI— централизованный вывод сообщенийInputHandler— неблокирующий ввод командViewConfig— настройка визуального представления сущностей
State Layer (состояние)
GameMap— карта мира с управлением позициями сущностей
Utils Layer (вспомогательные классы)
PathFinder— алгоритм BFS для поиска пути с учетом препятствийPosition— record для координат
✅ Многопоточность: симуляция работает в отдельном потоке, не блокируя ввод
✅ Неблокирующий ввод: BufferedReader для обработки команд без остановки игры
✅ Алгоритм BFS: поиск кратчайшего пути с учетом препятствий и диагоналей
✅ Action Pattern: каждое действие (движение, голод, спавн) — отдельный класс(экшен)
✅ Балансировка экосистемы: автоспавн при падении популяции ниже порога
✅ Конфигурируемость: все параметры (размер карты, статистики существ) в пакете config
- Java 17
- Maven
- Jansi 2.4.1 (ANSI-цвета в консоли)
- Git
simulation-game/
├── src/main/java/io/github/XanderGI/
│ ├── config/
│ │ ├── CreatureStats.java
│ │ ├── MapConfig.java
│ │ ├── PredatorStats.java
│ │ └── SpawnConfig.java
│ ├── domain/
│ │ ├── Creature.java
│ │ ├── Entity.java
│ │ ├── Grass.java
│ │ ├── Herbivore.java
│ │ ├── Obstacle.java
│ │ ├── Position.java
│ │ ├── Predator.java
│ │ ├── Rock.java
│ │ ├── StepResult.java
│ │ └── Tree.java
│ ├── presentation/
│ │ ├── ConsoleUI.java
│ │ ├── InputHandler.java
│ │ ├── Renderer.java
│ │ └── ViewConfig.java
│ ├── simulation/
│ │ ├── action/
│ │ │ ├── Action.java
│ │ │ ├── CreatureMovementAction.java
│ │ │ ├── EntitySpawnerAction.java
│ │ │ ├── InitializeMapAction.java
│ │ │ ├── RemoveDeadEntitiesAction.java
│ │ │ └── RenderAction.java
│ │ ├── PauseSettings.java
│ │ ├── Simulation.java
│ │ ├── SimulationCommand.java
│ │ ├── SimulationEngine.java
│ │ └── SimulationFactory.java
│ ├── state/
│ │ └── GameMap.java
│ ├── utils/
│ │ ├── MapUtils.java
│ │ └── PathFinder.java
│ ├── Main.java
│ └── MainMenuOption.java
├── pom.xml
└── README.md
1. Start Simulation — запустить симуляцию
2. Exit — выход из программы
- P + [ENTER] — пауза
- R + [ENTER] — возобновление
- E + [ENTER] — выход в главное меню
Параметры карты настраиваются в классе MapConfig:
public class MapConfig {
public static final int WIDTH = 25; // Ширина карты
public static final int HEIGHT = 25; // Высота карты
public static final int NUM_ROCKS = 8; // Количество камней
public static final int NUM_TREES = 8; // Количество деревьев
public static final int NUM_GRASSES = 40; // Начальное количество травы
public static final int NUM_HERBIVORES = 16; // Начальное количество травоядных
public static final int NUM_PREDATORS = 8; // Начальное количество хищиников
// Конфигурации спавна сущностей(Порог, Скорость/ход)
public static final int THRESHOLD_GRASS = 15;
public static final int RATE_PER_TURN_GRASS = 3;
public static final SpawnConfig GRASS_SPAWN_CONFIG = new SpawnConfig(THRESHOLD_GRASS, RATE_PER_TURN_GRASS);
public static final int THRESHOLD_HERBIVORE = 8;
public static final int RATE_PER_TURN_HERBIVORE = 1;
public static final SpawnConfig HERBIVORE_SPAWN_CONFIG = new SpawnConfig(THRESHOLD_HERBIVORE, RATE_PER_TURN_HERBIVORE);
public static final int THRESHOLD_PREDATOR = 4;
public static final int RATE_PER_TURN_PREDATOR = 1;
public static final SpawnConfig PREDATOR_SPAWN_CONFIG = new SpawnConfig(THRESHOLD_PREDATOR, RATE_PER_TURN_PREDATOR);
// Атрибуты хищников (HP, Speed, HungerDamage, AttackDamage)
public static final int PREDATOR_HEALTH = 60;
public static final int PREDATOR_SPEED = 2;
public static final int PREDATOR_HUNGER_DAMAGE = 8;
public static final int PREDATOR_ATTACK_DAMAGE = 20;
public static final PredatorStats PREDATOR_STATS = new PredatorStats(PREDATOR_HEALTH, PREDATOR_SPEED, PREDATOR_HUNGER_DAMAGE, PREDATOR_ATTACK_DAMAGE);
// Атрибуты травоядных (HP, Speed, HungerDamage)
public static final int HERBIVORE_HEALTH = 45;
public static final int HERBIVORE_SPEED = 2;
public static final int HERBIVORE_HUNGER_DAMAGE = 5;
public static final CreatureStats HERBIVORE_STATS = new CreatureStats(HERBIVORE_HEALTH, HERBIVORE_SPEED, HERBIVORE_HUNGER_DAMAGE);
private MapConfig() {
throw new AssertionError("Configuration class");
}
}- ✅ Наработка навыка проектирования многослойной архитектуры
- ✅ Работа с многопоточностью (
Thread,volatile) - ✅ Реализация алгоритма BFS для поиска оптимального пути
- ✅ Неблокирующий ввод в консольных приложениях с использованием BufferedReader.
- ✅ Применение паттернов проектирования (Command, Factory)
- ✅ Работа с ANSI-эскейп кодами для цветного вывода
- ✅ Написание и рефакторинг кода по принципам SOLID(старался)
- ✅ Организация проекта по пакетам (domain, presentation, simulation, state, utils)
- ✅ Работа с Generics для создания обощенных классов и увеличения гибкости приложения
- ✅ Декомпозиция проекта на объекты с использованием объектно-ориентированного подхода(изнчаально проектировал через excalidraw)
- ✅ работа с enum
- ✅ Lambda expression + stream API
- ✅ Ознакомление с Optional - для предотвращения возращения null поведения из методов.
- ✅ Ознакомление с ключевым словом record
- ✅ Применение интерфейсов-маркеров на практике.