Skip to content

Latest commit

 

History

History
82 lines (60 loc) · 4.59 KB

File metadata and controls

82 lines (60 loc) · 4.59 KB

Добавление новых игр

Это руководство описывает процесс добавления новой игры в систему TJudge.

Обзор

Каждая игра состоит из двух частей:

  1. Исполнитель - логика игры в tjudge-cli (Rust)
  2. Плагин - метаданные игры в Go-сервере

Шаг 1: Реализация логики игры в tjudge-cli

Добавьте новый тип игры в проект tjudge-cli:

  1. Создайте модуль игры в src/games/your_game.rs
  2. Реализуйте trait Game: определите протокол взаимодействия (инициализация, итерации, подсчёт очков)
  3. Зарегистрируйте новый тип игры в CLI-аргументах
  4. Соберите обновлённый Docker-образ tjudge-cli

Шаг 2: Регистрация GamePlugin в Go

Добавьте плагин в файл internal/domain/game/builtin.go:

_ = registry.Register(&GamePlugin{
    Name:              "your_game",       // Должно совпадать с именем в tjudge-cli
    DisplayName:       "Название игры",   // Отображаемое имя (UTF-8)
    DefaultIterations: 100,               // Количество итераций по умолчанию
    ScoreMultiplier:   1.0,               // Множитель очков для баланса лидерборда
})

Поля GamePlugin

Поле Описание
Name Уникальный идентификатор [a-z0-9_]+. Должен совпадать с именем типа игры в tjudge-cli
DisplayName Название для отображения в UI
DefaultIterations Сколько раундов/итераций по умолчанию в одном матче
ScoreMultiplier Множитель для балансировки очков между играми. Например, 10.0 для Перетягивания каната, где очки за раунд малы (0 или 1)

Шаг 3: Создание игры через API

После запуска сервера создайте запись игры в базе данных:

curl -X POST http://localhost:8080/api/v1/games \
  -H "Authorization: Bearer <admin_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "your_game",
    "display_name": "Название игры",
    "rules": "# Правила\n\nОписание правил в формате Markdown..."
  }'

Либо добавьте SQL-миграцию по аналогии с migrations/000015_seed_games.up.sql.

Шаг 4: Добавление игры к турниру

curl -X POST http://localhost:8080/api/v1/tournaments/<tournament_id>/games/<game_id> \
  -H "Authorization: Bearer <admin_token>"

После этого участники смогут загружать программы для новой игры, и она будет включена в раунды турнира.

Пример: текущие игры

Имя Отображение Множитель Итерации
dilemma Дилемма заключённого 1.0 100
tug_of_war Перетягивание каната 10.0 100
travelers_dilemma Дилемма путешественника 0.05 100
public_goods Общественное благо 0.1 100
dollar_auction Аукцион двойной цены 1.0 100

Советы

  • Множитель очков (ScoreMultiplier) нужен для балансировки. Если очки за раунд в вашей игре значительно выше или ниже, чем в Дилемме заключённого, подберите множитель так, чтобы вклад игры в общий рейтинг был сопоставим.
  • Имя игры должно быть одинаковым в tjudge-cli и в Go-плагине. Именно по нему система сопоставляет записи в БД с исполнителем.
  • Правила в формате Markdown отображаются участникам на странице игры. Включайте протокол взаимодействия, формат ввода и вывода и ограничения.