Правила игры HexaWars

Игра HexaWars представляет собой пошаговый клеточный автомат. Основная цель игры - захватить наибольшее количество жизненного пространства.

Игровое поле представляет собой сетку из шестиугольников 50 х 50. Каждая ячейка может содержать n-ое количество игровых единиц одного из игроков. Максимально возможное значение ячейки равно 1000.

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

Во время хода игрок может переместить n единиц в любую из соседних ячеек. В случае если ход совершается за пределы поля, то осуществляется перенос на противоположную сторону.

В конце хода у каждого из игроков происходит рост ячеек в зависимости от коэффициента роста. Новое значение в клетке получается после умножения старого значения на коэффициент роста.

Коэффициент роста определяется по формуле:

Округление происходит по математическим правилам, например:

  • • В ячейке 4 * 1.1 = 4.4 после сокращения останется 4
  • • В ячейке 5 * 1.1 = 5.5 после сокращения останется 6

Каждый ход каждому боту предоставляется полная информация об игровом поле, включая расположение и вес ячеек противника.

В описании классов присутствуют только публичные методы, свойства и конструкторы. Остальные элементы в данном описании отсутствуют, так как недоступны в процессе написания ботов.

Класс Field — это класс игрового поля. Для написания своего бота вам потребуются следующие методы:

  • Cell GetCellByDirection (Cell cell, MovementCommand.Direction direction, int dist) - Получить ячейку, находящуюся по направлению direction от ячейки cell, находящейся от текущей на расстоянии dist
  • Cell GetCellByDirection (Cell cell, MovementCommand.Direction direction) - Получить ячейку, находящуюся по направлению direction от ячейки cell, находящейся от текущей на расстоянии 1.
  • bool BelongToM e(Cell cell) – определить, принадлежит ли ячейка запрашивающему игроку.
  • List‹Cell› GetMyCells () - получить список своих ячеек
  • int GetMyPopulation (Cell cell) - получить размер моей ячейки (в случае, если ячейка вам не принадлежит, вернёт 0)
  • int GetMyPopulation (Cell cell) – получить количество своих единиц в ячейке (если ячейка принадлежит врагу, то возвращает 0)
  • Cell GetCellByCoordinate(Point coordinate) – получить ячейку по координатам coordinate
  • Cell GetCellByCoordinate(int x, int y) – получить ячейку по координатам x и y

Класс Cell — это класс отдельной ячейки игрового поля. Для того, чтобы узнать состояние ячейки, потребуется использовать следующие свойства:

  • Coordinate - координаты ячейки
  • Population - размер ячейки

Класс Bot — это основной класс игрового бота. От него наследуются все боты игроков. В нём содержится один метод, который требуется переопределить в каждом новом боте.

Методы:

  • abstract void getNextCommands (List movementCommands, Field field) - Переопределяемый метод для создания ботов участников, в него подаётся пустой лист MovementCommand, который нужно заполнить и копия игрового поля Field.
  • Класс MovementCommand - это класс команды для перемещения ячейки полностью или частично. Для создания новой команды на перемещение необходимо создать экземпляр класса MovementCommand и передать в конструктор координаты ячейки, откуда будет производиться ход, направление хода, заданное enum Direction и количество перемещаемых единиц.

Конструкторы:

  • new MovementCommand(int xFrom, int yFrom, Direction direction, int count)
  • new MovementCommand(Point from, Direction direction, int count)

Поля:

  • Point From - оординаты исходной ячейки, из которой будет производиться ход
  • Direction direction Направление хода передаётся MovementCommand в виде MovementCommand.Direction.(направление). Направление может иметь значения:
  • Left
  • Right
  • UpLeft
  • UpRight
  • DownLeft
  • DownRight

int count – количество перемещаемых единиц

Для создания своего бота пользователю необходимо разработать собственный класс, который будет наследовать класс Bot, и переопределить в нем метод getNextCommands.

Пример бота

Скачать тестовый проект