Code Monkey home page Code Monkey logo

ultimate-tic-tac-toe1's Introduction

starter-kit

Заготовка для написания ботов CodinGame.com

Инструкция по использованию

  1. Сделайте копию репозитория для конкретной игры.
  2. Пишите код в проекте bot.
  3. Начните с того, что скопируйте код ввода из шаблона codingame в StateReader: инициализационный ввод в ReadStateInit, а ввод для каждого раунда в ReadState.
  4. Опишите команды бота в файле BotCommands.cs
  5. Напишите алгоритм в Solver.cs
  6. builder сделайте стартовым проектом, при каждом запуске он собирает все файлы bot и lib в один файл и копирует его содержимое в буфер обмена.
  7. Тесты запускайте в проекте tests. На каждом раунде ваш бот будет писать на StdErr введённое состояние в компактном виде, удобном для того, чтобы скопировать его и перенести в тесты.
  8. Обобщённые алгоритмы ищите в lib.
  9. После окончания соревнования, все новое полезное обобщённое, что можно было бы поместить в lib, оформите в виде pull request к этому репозиторию. Не присылайте реализацию обобщённых алгоритмов поиска, только вспомогательные примитивы, которые могут оказаться полезными в будущем.

Что тут есть?

Общая архитектура решения

  1. ISolver — общая абстркция для алгоритмов поиска.
  2. State — состояние игры, StateInit — часть состояния, которое неизменно и вводится перед началом игры.
  3. StateReader — чтение State и StateInit.
  4. App — точка входа. Создает Solver, организует ввод и вывод.

ISolver

Абстракция позволяет комбинировать разные солверы друг с другом. Некоторым солверам нужен другой солвер, для работы. Можно делать солверы обёртки. Например, вот так можно добавить логгирование 10 лучших найденных решений к любому солверу:

var solver = new MyCustomSolver(new SomeOtherSolver(...), ...).WithLogging(bestSolutionsCountToLog: 10);

Многие фичи лучше добавлять не в конкретный солвер, а делать оберткой, которую можно будет применить к любым солверам в будущем.

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

ISolver возвращает решения. У каждого решения есть отладочная информация, как правило помогающая в отладке:

  1. Время и номер итерации, на которой было найдено решение.
  2. Количество улучшений найденного решения (не для всех алгоритмов поиска имеет смысл, но для HillClimbing и MonteCarlo —— имеет)
  3. Имя солвера (ISolver.ShortName), который нашел решение (удобно, когда вы начинаете комбинировать солверы)

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

Базовый record для команд бота

В разных контестах CG команды, которые вы отдаёте боту устроены однообразно. Поэтому есть общий класс BotCommand для всех команд, который за вас реализует форматирование команды в строку. Вам остается только определить класс команды с публичными полями или свойствами вот так:

    // MOVE X Y
    public record Move(V Destination) : BotCommand;

    // WAIT
    public record Wait : BotCommand;

    // USE BOOSTER
	public class UseCommand(Bonus bonus) : BotCommand

StatValue

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

Вектор

Для того, чтобы код, активно манипулирующий векторами не был громоздким, класс вектора называется супер-кратко: V. В нем реализованы все операции, над целочисленными двумерными векторами, которые обычно нужны.

Из необычного — рассчет времени до столкновения с другим объектом, к которому мы движемся со скоростью speed: double GetCollisionTime(V speed, V obstacle, double radius)

Иногда нужен нецелочисленный вектор. Для этого есть аналогичный класс VD.

Extension-методы

Много мелочей пригождаются постоянно во многих играх. Они собраны в файле Extensions.cs и оформлены методами расширения.

MaxHeap

Бинарная куча. Её нет в net5, но нужна в некоторых алгоритмах. Вероятно, станет не нужна, когда CodingGame перейдет на net6 с его PriorityQueue.

Что из этого часто пригождается?

  1. Архитектура: App + State + StateReader + Countdown + Solver + BotCommand — получается использовать всегда.
  2. Часто пригождаются StatValue, V, VD, некоторые Extension-методы.
  3. ISolver и его готовые реализации — получается применять далеко не в каждом контесте. Но когда они подходят, сразу получаешь кучу отладочной информации из коробки.

ultimate-tic-tac-toe1's People

Contributors

xoposhiy avatar cockamamie avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.