Skip to content

J0es1ick/Game

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RPG Tournament

Консольная RPG на TypeScript с турнирной системой, тремя классами персонажей, системой навыков, арен и прокачки. Игроки сражаются в турнире на выбывание — каждый бой в случайной арене, победители получают опыт и повышают уровень.


Быстрый старт

Требования

  • Node.js ≥ 20
  • npm ≥ 9

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

npm install
npm run dev

Запуск тестов

npm test

Запуск через Docker

Требования

  • Docker Desktop (Windows / macOS) или Docker Engine (Linux)

1. Сборка образа

docker build -t fantasy-tournament .

Используется двухэтапная сборка: первый контейнер компилирует TypeScript, второй — содержит только скомпилированный JS без dev-зависимостей. Итоговый образ весит ~100 МБ вместо ~400 МБ.

2. Запуск

docker run -it fantasy-tournament

Флаг -it обязателен — без него readline не получит stdin и игра зависнет на первом вопросе.

Windows

В PowerShell и Windows Terminal команда работает без изменений:

docker run -it fantasy-tournament

В старом cmd.exe нужна обёртка winpty:

winpty docker run -it fantasy-tournament

Пересборка после изменений в коде

docker build -t fantasy-tournament . && docker run -it fantasy-tournament

Архитектура

Паттерны проектирования

Фабричный метод (Factory Method)

Каждый тип сущностей создаётся через изолированную фабрику.

Фабрика Ответственность
PlayerFabric Точка входа — делегирует в нужную фабрику класса
KnightFabric / ArcherFabric / WizardFabric Создают конкретный класс с дефолтными навыками
WeaponFabric Создаёт оружие по типу со случайным уроном
SkillFabric Создаёт навыки из шаблонов или с нуля
ArenaFabric Выбирает арену по имени или случайно

Шаблонный метод (Template Method)

Player реализует общую логику боя (attack, takeDamage, useSkill, gainExperience). Подклассы переопределяют только специфическое поведение — например, Knight может переопределить takeDamage.

Принцип единственной ответственности (SRP)

  • Logger — весь консольный вывод в одном месте
  • Game — только игровой процесс (турнир, бои, опыт)
  • readAnswer — изолирует работу с readline
  • Утилиты рандомизации — чистые функции без состояния

Схема зависимостей

index.ts
  └── createGame()
        ├── Game
        │     ├── PlayerFabric → KnightFabric / ArcherFabric / WizardFabric
        │     │                       └── SkillFabric, WeaponFabric
        │     ├── ArenaFabric → TrainingGround / VolcanicCrater / AncientRuins
        │     └── Logger
        └── createCharacter()

Игровая механика

Поток игры

Ввод числа игроков (кратно 4)
  → Создание персонажа (опционально)
    → Генерация остальных случайных игроков
      → Турнир на выбывание
        → Каждый бой — в случайной арене
          → Победитель получает опыт → возможный levep-up
            → Победитель сбрасывает состояние и идёт дальше
              → Финал → Победитель

Бой

Бой ведётся пошагово, ходы чередуются. На каждом ходу:

  1. Если у атакующего есть активные баффы — они применяются к урону
  2. Арена модифицирует итоговый урон через modifyDamage()
  3. С вероятностью 40% атакующий использует случайный навык
  4. Бой заканчивается, когда health ≤ 0 у одного из участников

Если у игрока активен стан (countOfSkipingTurns > 0), его атака пропускается и счётчик уменьшается.

Арены

Каждый бой проходит в случайно выбранной арене. Арена влияет на урон и количество опыта после победы.

Арена Модификатор урона Бонус опыта
Training Ground ×0.9 (мягче) +25
Volcanic Crater ×1.15 (жёстче) +40
Ancient Ruins ×1.0 (нейтрально) +55

Система опыта и уровней

После победы в бою победитель получает опыт:

опыт = experienceBonus_арены + уровень_побеждённого × 10

При достижении порога опыта игрок повышает уровень:

  • Начальный порог: 100 XP
  • После каждого повышения порог умножается на ×1.35
  • За каждый уровень: +10 HP, +2 к силе
  • При повышении уровня HP и сила полностью восстанавливаются

reset() после боя сбрасывает только боевые состояния (стан, кулдауны навыков, здоровье до текущего initialHealth). Уровень и накопленный опыт сохраняются между боями.

Навыки

Навык Тип Механика
Огненные стрелы Бафф (постоянный) +2 к силе, без ограничения по ходам, 1 использование
Ледяные стрелы Бафф (временный) +3 к силе на 3 атаки, у лучника 2 использования
Удар возмездия Эффект (урон) Наносит сила × 1.3 + урон оружия напрямую
Заворожение Эффект (стан) Противник пропускает 1 ход

Баффы без turns (огненные стрелы) остаются активными до reset(). Баффы с turns (ледяные стрелы) применяются каждую атаку и истекают по счётчику.


Классы персонажей

Класс Оружие Дефолтные навыки Особенность
Knight Меч (sword) Удар возмездия, Ледяные стрелы
Archer Лук (bow) Ледяные стрелы ×2, Огненные стрелы Ледяные стрелы можно использовать дважды
Wizard Посох (stick) Заворожение, Ледяные стрелы

Параметры случайного игрока

Параметр Диапазон
Здоровье 125–150
Сила 10–15
Урон оружия 2–5

Структура проекта

src/
├── index.ts                          # Точка входа
├── abstract/
│   └── Player.ts                     # Базовый класс игрока с логикой боя и прокачки
├── classes/
│   ├── Knight.ts
│   ├── Archer.ts
│   ├── Wizard.ts
│   └── index.ts
├── arenas/
│   ├── IArena.ts                     # Интерфейс арены
│   ├── TrainingGround.ts
│   ├── VolcanicCrater.ts
│   └── AncientRuins.ts
├── fabrics/
│   ├── arenasFabric/
│   │   └── ArenaFabric.ts
│   ├── playersFabrics/
│   │   ├── PlayerFabric.ts           # Главная фабрика + уникальные имена (shuffle)
│   │   ├── KnightFabric.ts
│   │   ├── ArcherFabric.ts
│   │   ├── WizardFabric.ts
│   │   └── index.ts
│   ├── skillFabric/
│   │   └── SkillFabric.ts            # Шаблоны навыков + deep copy buff
│   └── weaponsFabric/
│       └── WeaponFabric.ts
├── gameplay/
│   └── Game.ts                       # Турнир, бой, начисление опыта
├── skills/
│   └── ISkill.ts
├── weapon/
│   └── IWeapon.ts
└── utils/
    ├── input/
    │   ├── createGame.ts             # Диалог запуска игры
    │   └── createCharacter.ts        # Диалог создания персонажа
    ├── output/
    │   └── Logger.ts                 # Весь консольный вывод
    ├── question/
    │   └── readAnswer.ts             # Обёртка над readline
    └── randomization/
        ├── getRandomNumber.ts
        ├── getRandomArrayElement.ts
        └── index.ts

tests/
├── Archer.spec.ts
├── ArcherFabric.spec.ts
├── ArenaFabric.spec.ts
├── Game.spec.ts
├── ISkill.spec.ts
├── Knight.spec.ts
├── KnightFabric.spec.ts
├── PlayerFabric.spec.ts
├── PlayerProgression.spec.ts
├── SkillFabric.spec.ts
├── WeaponFabric.spec.ts
├── Wizard.spec.ts
├── WizardFabric.spec.ts
├── getRandomArrayElement.spec.ts
└── getRandomNumber.spec.ts

About

A game in which randomly created players fight each other in a tournament format

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors