CLI утилита для проведения соревнований между ботами студентов в рамках лабораторной "Поиск в условиях противодействия" курса CS253. Интеллектуальные системы направления ФИИТ ИММиКН ЮФУ.
См. вики.
- Последним аргументом командной строки принимает цвет (очередь хода), которым он играет:
0
или1
stdin
(cin
) принимает ходы соперникаstderr
(cerr
) пишет свой ход (один на строке)stdout
(cout
) пишет всё остальное: логи, информацию для человека, состояние доскиexit code
: победа-0
, поражение-3
, ничья-4
(соответственно, должен понимать, когда игра окончилась)
Сейчас поддерживается только Windows, поддержка Linux и Mac планируется.
Usage:
botctl [flags] "path/to/mybot1.exe [addition args]" "path/to/mybot2.exe [addition args]"
-o1 string
Куда перенаправить stdout первого бота
'-' = stdout, '+' - stderr, '<dirname>' - будет сохранено в папку, файл на раунд, пусто - игнорировать (default "+")
-o2 string
Куда перенаправить stdout второго бота
'-' = stdout, '+' - stderr, '<dirname>' - будет сохранено в папку, файл на раунд, пусто - игнорировать
-r int
Количество раундов (default 1)
По окончанию всех раундов будет выведен суммарный счёт (1 балл за победу, 0.5 за ничью, 0 за поражение).
При смене раунда цвета меняются.
Раунд reversi_bot_v2.exe reversi_bot_v3.exe
0 Поражение, ходил первым Победа, ходил вторым
1 Поражение, ходил вторым Победа, ходил первым
2 Победа, ходил первым Поражение, ходил вторым
3 Поражение, ходил вторым Победа, ходил первым
4 Поражение, ходил первым Победа, ходил вторым
5 Победа, ходил вторым Поражение, ходил первым
6 Поражение, ходил первым Победа, ходил вторым
7 Ничья, ходил вторым Ничья, ходил первым
8 Победа, ходил первым Поражение, ходил вторым
9 Поражение, ходил вторым Победа, ходил первым
Итого 3.5 6.5
Помимо дуэли ботов также есть другие варианты работы
> botctl help
Доступные команды:
duel Дуэль двух ботов с несколькими раундами.
test Тестирует бота, запуская игру с самим собой
tournament Запускает турнир всех со всеми, ведя турнирную таблицу.
Используйте "botctl help <command>" чтобы больше узнать о конкретной команде.
Для режима турнира необходимо задать конфиг в yaml файле вида
game: Реверси
timeout: 3m
rounds: 1
bots:
Иван Иванов:
cmd: ivanov.exe -d 3
Пётр Петров:
cmd: petrov.exe -d 2
Иван Петров:
cmd: ivan_pertor.exe
botctl test mybot.exe
- после чего бот должен сыграть один раунд сам с собой, в логах будет виден процесс.
Допустим, бот mybot.exe
дополнительным параметром принимает флаг -d
с глубиной,
и я хочу сравнить бота с разной глубиной.
Тогда можно запускать botctl
так (кавычки зависят от ОС, Windows "
, в Linux '
):
botctl "mybot.exe -d 8" "mybot.exe -d 6"
Для этого есть флаг -r
botctl -r 11 "mybot.exe -d 8" "mybot.exe -d 6"
С помощью флагов -o1
и -o2
можно управлять перенаправлением stdout
ботов:
Значение флага | Результат |
---|---|
- |
Логи данного бота будут выводиться в консоль в stdout |
+ |
Логи данного бота будут выводиться в консоль в stderr (значение по умолчанию для -o1 ) |
"" |
Игнорировать (значение по умолачнию для -o2 |
path/to/directory |
Сохранение логов бота в файлы в указанной директории (при необходимости будет создана). На каждый раунд по файлу с названиями вида: round_0_bot_1_botname.txt |
Например, выяснилось, что иногда бот некорректно распознаёт ничью, и хотелось бы получить логи такого события. Для такого можно запустить много раундов с сохранением логов в файлы
botctl -r 20 -o1 logsdir -o2 logsdir bot1.exe bot2.exe
После чего в папке logsdir
окажутся файлы с логами обоих ботов, которые можно спокойно рассмотреть позднее.
Если нам не важны логи ботов (мы точно уверенны в их корректности, и хотим видеть лишь, сколько раундов было отыграно на данный момент), то можно выключить вывод в консоль логов первого бота
botctl -r 20 -o1 "" bot1.exe bot2.exe
Все версии доступны в релизах, там есть архивы с бинарником и ридмишкой. При просмотре репозитория в гитхабе с компьютера это будет видно справа от списка файлов, под About
.
В архиве будет бинарный файл botctl
, который необходимо положить либо в ту папку, где он будет использоваться, либо в одну из
директорий, содержащейся в переменной окружения PATH
.
По умолчанию stdout
и stderr
выводятся в консоль.
При работе в консоли stdout
и stderr
можно перенаправлять по отдельности в файлы или в качестве stdin
в другие команды.
command > filename1.txt 2> filename2.txt
- stdout
окажется в filename1.txt
, а stderr
в filename2.txt
.
Соответственно, можно вызвать бота bot.exe 0 2> cerr.txt
и по содержимому cerr.txt
увидеть, что и как бот туда написал.
И, поскольку stderr
не буферизируется, то файл будет обновляться по мере игры с ботом.
- Проверьте путь к файлу
- Если при запуске использовались кавычки, попробуйте заменить
'
на"
и наоборот, или убрать их вообще (если нет дополнительных аргументов)- Для Windows:
botctl 'bot1.exe -d 4' 'bot2.exe'
- не правильноbotctl "bot1.exe -d 4" bot2.exe
- правильно
- Для Windows:
- Убедитесь, что бот правильно воспринимает аргумент с очередью хода:
bot1.exe 0
- бот должен ходить первым,bot1.exe 1
бот должен ходить вторым Если проблема здесь, то она может возникнуть по следующим причинам:- Не учтено, что в
args[0]
будет лежать название запущенной программы, а аргументы начинаются сargs[1]
- Происходит проверка вида
args[1][0] == 0
- сравнение кода символа с числом, а не с кодом символа числа, правильнее будет хотя быargs[1][0] == '0'
илиargs[1][0]-'0' == 0
- Не учтено, что в
- Проверьте места чтения из
cin
и записи вcerr
Скорее всего после хода нет никакого разделителяПри чтенииstring move; cin >> move; <...> cerr << move; // никаких пробелов и переносов строк - не понятно, где граница между ходами
cin
строки будет происходить чтение до какого-то невидимого символа. Однако, если пробелов/переносов строк нет, тоcin
не закончит чтение строки. Поэтому лучше писатьcerr << x << " " << y << endl;
Ну или читать посимвольно (но тогда и боты противников должны это делать, так что лучше добавлятьendl
после хода)