Это руководство описывает процесс добавления новой игры в систему TJudge.
Каждая игра состоит из двух частей:
- Исполнитель - логика игры в tjudge-cli (Rust)
- Плагин - метаданные игры в Go-сервере
Добавьте новый тип игры в проект tjudge-cli:
- Создайте модуль игры в
src/games/your_game.rs - Реализуйте trait
Game: определите протокол взаимодействия (инициализация, итерации, подсчёт очков) - Зарегистрируйте новый тип игры в CLI-аргументах
- Соберите обновлённый Docker-образ
tjudge-cli
Добавьте плагин в файл internal/domain/game/builtin.go:
_ = registry.Register(&GamePlugin{
Name: "your_game", // Должно совпадать с именем в tjudge-cli
DisplayName: "Название игры", // Отображаемое имя (UTF-8)
DefaultIterations: 100, // Количество итераций по умолчанию
ScoreMultiplier: 1.0, // Множитель очков для баланса лидерборда
})| Поле | Описание |
|---|---|
Name |
Уникальный идентификатор [a-z0-9_]+. Должен совпадать с именем типа игры в tjudge-cli |
DisplayName |
Название для отображения в UI |
DefaultIterations |
Сколько раундов/итераций по умолчанию в одном матче |
ScoreMultiplier |
Множитель для балансировки очков между играми. Например, 10.0 для Перетягивания каната, где очки за раунд малы (0 или 1) |
После запуска сервера создайте запись игры в базе данных:
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.
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 отображаются участникам на странице игры. Включайте протокол взаимодействия, формат ввода и вывода и ограничения.