Платформа, Арбитр, api - gnkoshelev/ai-game-platform GitHub Wiki

Платформа / Арбитр

Здесь будет предполагаемая точка "разделения обязанностей". Введя заготовки классов Platform и GameArbitr и настроив Api между ними, далее можно будет работать над различными модулями независимо.

Первое направаление

  • Взаимодействие с БД
  • Связь с FrontEnd
  • Курирование различных GameArbitr-ов
  • Настройка роутинга
  • Авторизация/Аутентификация
  • Интерфейс для загрузки новых AI/Игр

Второе направление

  • Реализация GameArbitr
  • Загрузка Game и AI(s)
  • Моделирование хода игры
  • Сохранение результатов игры

Ес-но это всё не в формате "Первое - для человека Х, а второе - для Y". Практически любые два модуля из двух разнных групп можно будет начать реализовывать параллельно, так что это лишь для удобства дальнейшего планирования.

Пока в роли Platform выступает само приложение (TODO: понять, как оно работает в боевом режиме с группой одновременных пользователей). GameArbitr реализован в виде заглушки.

Методы GameArbitr

  • GameArbitr(game: Game) - Конструктор.
  • LoadAI(ai : AI, id: Int) - загрузка указанного AI на заданное место
  • CurrentState() : GameState - возвращает ID состояния партии.
  • Start() - начинает моделирование игры
  • GetSnapshot(id : Int) : GameSnapshot - возвращает состоянии партии в начале заданного хода. TODO: обсудить, состояние с точки зрения игры или же с точки зрения текущего игрока TODO: обсужить формат GameSnapshot
  • GetSnapshots() : List - хотелось бы что-то вроде IEnumerable из C#.
  • TODO: Требуется метод для возвращения информации об ошибке во время исполнения игры (возможен wrapper внутри GameArbitr для AI и Game)
  • GetStatus() : StatusCode
  • TODO: Требуется review API Гришей

GameState

  • NOT_LOADED - не хватает чего-то для старта игры (например, самой игры или AI)
  • READY - игра готова к старту
  • IN_PROGRESS
  • FINISHED - игра успешно закончена
  • FINISHED_AND_SAVED - результаты игры сохранены в БД
  • ERROR - произошла ошибка, которые привела к остановке моделирования игры / сохранения результатов

Пример использования

val gameArbitr = GameArbitr(game)
gameArbitr.LoadAI(ai1, 0)
gameArbitr.LoadAI(ai2, 1)
gameArbitr.Start()
...
val snapshots = gameArbitr.GetSnapshots()