Заготовка для написания ботов CodinGame.com
- Сделайте копию репозитория для конкретной игры.
- Пишите код в проекте bot.
- Тесты запускайте в проекте tests.
- Обобщённые алгоритмы ищите в lib.
- builder сделайте стартовым проектом, при каждом запуске он собирает все файлы bot и lib в один файл и копирует его содержимое в буфер обмена.
- После окончания соревнования, все новое полезное обобщённое, что можно было бы поместить в lib, оформите в виде pull request к этому репозиторию. Не присылайте реализацию обобщённых алгоритмов поиска, только вспомогательные примитивы, которые могут оказаться полезными в будущем.
- ISolver — общая абстркция для алгоритмов поиска.
- State — состояние игры, StateInit — часть состояния, которое неизменно и вводится перед началом игры.
- StateReader — чтение State и StateInit.
- App — точка входа. Создает Solver, организует ввод и вывод.
Абстракция позволяет комбинировать разные солверы друг с другом. Некоторым солверам нужен другой солвер, для работы. Можно делать солверы обёртки. Например, вот так можно добавить логгирование 10 лучших найденных решений к любому солверу:
var solver = new MyCustomSolver(new SomeOtherSolver(...), ...).WithLogging(bestSolutionsCountToLog: 10);
Многие фичи лучше добавлять не в конкретный солвер, а делать оберткой, которую можно будет применить к любым солверам в будущем.
В проекте реализованы несколько базовых классов для алгоритмов: жадного алгоритма, случайного поиска и поиска восхождением.
Регистрируйте в объекте StatValue наблюдаемые значения случайной величины, а он посчитает матожидание, стандартное отклонение, доверительный интервал для матожидания и т.п.
Для того, чтобы код, активно манипулирующий векторами не был громоздким, класс вектора называется супер-кратко: V. В нем реализованы все операции, над целочисленными двумерными векторами, которые обычно нужны.
Из необычного — рассчет времени до столкновения с другим объектом, к которому мы движемся со скоростью speed: double GetCollisionTime(V speed, V obstacle, double radius)
Много мелочей пригождаются постоянно во многих играх. Они собраны в файле Extensions.cs и оформлены методами расширения.
Бинарная куча. Её нет в net5, но нужна в некоторых алгоритмах. Вероятно, станет не нужна, когда CodingGame перейдет на net6 с его PriorityQueue.