Skip to content

XanderGI/SimulationGame

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 

Repository files navigation

🌍 Ecosystem Simulation Game

Консольная 2D-симуляция экосистемы с хищниками, травоядными и растительностью. Реализация с ООП подходом на Java.

📋 Описание

Проект разработан в рамках учебного курса Java Backend Learning Course и представляет собой пошаговую симуляцию с автоматическим балансом популяций.

Основной функционал

  • ✅ Автоматическая симуляция экосистемы в реальном времени
  • ✅ Три типа существ: хищники 🐺, травоядные 🐇, трава 🌾
  • ✅ Интеллектуальное поведение написано при помощи алгоритма поиска кратчайшего пути (BFS)
  • ✅ Система здоровья и голода с постепенным уроном
  • ✅ Динамический спавн сущностей при снижении популяции
  • ✅ Консольная визуализация с ANSI-графикой и эмодзи
  • ✅ Управление симуляцией в реальном времени (пауза/возобновление/выход)
  • ✅ Статистика популяций на каждом ходу

🚀 Установка и запуск

Требования

  • Java 17 или выше
  • Maven 3.6+

Запуск симуляции

Примечание: Запускать приложение лучше всего в Windows Terminal во избежания неровности карты.

  1. Клонировать репозиторий:
git clone https://github.com/XanderGI/SimulationGame.git
cd SimulationGame
  1. Собрать проект:
mvn clean package
  1. Поменять кодировку на UTF8 в консоли(необходимо для корректного отображения emoji)
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
chcp 65001
  1. Запустить:
java "-Dfile.encoding=UTF-8" -jar target/SimulationGame-1.0-SNAPSHOT.jar

📊 Пример работы программы

image

🎯 Особенности реализации

Архитектура

В ходе реализации проекта старался следовать принципам 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
  • ✅ Применение интерфейсов-маркеров на практике.

About

This is study project game #2 for study and practice OOP paradigm in Java programming

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages