Пишем ИИ для Виндиниума на одноплатных компьютерах. Часть 2: логика принятия решения

c98924b0cdbe5408f93e5db812ea0569.jpg

Описание

Vindinium — многопользовательский пошаговый рогалик. У каждого из четырех игроков есть один герой, который может перемещаться по карте. Цель состоит в том, чтобы игроки собрали максимальное количество золота в течение заданного количества ходов (каждый игрок делает 300 ходов за игру, таким образом, вся игра состоит из 1200 ходов). Игроки должны взять под свой контроль золотые рудники для производства золота; однако рудники защищены гоблинами. Когда игрок побеждает гоблина, он становится владельцем рудника и получает одно золото за ход. Кроме того, гоблин теперь защищает рудник от других игроков.

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

Наведываясь в таверну, герои могут купить пиво за 2 единицы золота, таким образом восстанавливая свои очки здоровья.

Цель состоит в том, чтобы создать компьютерную программу (бота), которая играет в игру Vindinium как можно более разумно. Рекомендуется использовать один из стартовых наборов для большого числа языков программирования в качестве отправной точки.


Карта

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

+----------------------------------------+
|######$-    $-############$-    $-######|
|######        ##        ##        ######|
|####[]    ####            ####    []####|
|##      ####  ##        ##  ####      ##|
|####            $-    $-            ####|
|##########  @1            @4  ##########|
|############  ####    ####  ############|
|$-##$-        ############        $-##$-|
|  $-      $-################$-      $-  |
|        ########################        |
|        ########################        |
|  $-      $-################$-      $-  |
|$-##$-        ############        $-##$-|
|############  ####    ####  ############|
|##########  @2            @3  ##########|
|####            $-    $-            ####|
|##      ####  ##        ##  ####      ##|
|####[]    ####            ####    []####|
|######        ##        ##        ######|
|######$-    $-############$-    $-######|
+----------------------------------------+


Легенда

## — Непреодолимый лес
@1 — Первый герой
[] — Таверны
$- — Золотой рудник (ничейный)
$1 — Золотой рудник (принадлежащий первому герою)

Сгенерированные карты симметричны и всегда содержат 4 таверны и 4 героя.


Герой

Герои могут перемещаться на одну клетку за каждый ход и иметь следующие показатели:


  • Очки здоровья (HP): Каждый «свежий» игрок начинает с максимального значения = 100. Если HP падает до нуля, герой умирает (смотрите раздел «Смерть героя»).
  • Золото: начиная с нуля, это показатель успешности героя. В конце игры герои будут оценены на основе их количества золота.
  • Количество золотых рудников.


Направление движения

Бот должен отдавать один приказ за ход. Возможные приказы: Стоять на месте (Stay), На север (North), На юг (South), На восток (East) или На запад (West). Как только приказ исполнен, герой остается на своем месте или перемещается на одну клетку в заданном направлении.


Перемещение героя

Если герой:


  • Пытается выйти за границы карты или пройти сквозь деревья, ничего не происходит.
  • Заходит в золотой рудник, он остается на месте и:
    • Если рудник уже принадлежит герою, ничего не происходит.
    • Если шахта ничейная или принадлежит другому герою, происходит бой с гоблином-стражем, охраняющим шахту. Герой теряет 20 очков жизни. Если он выживет, шахта его.
  • Наступает на другого героя, он остается на месте и ничего не происходит. Поединки героев решаются в конце хода.
  • Заходит в таверну, он остается на месте и заказывает себе поесть. Герой платит 2 золота и восстанавливает 50 единиц здоровья. Обратите внимание, что количество здоровья не может превышать 100 единиц.
  • Не отправляет приказ за отведенное ему время для принятия решения (1 секунду), он остается на месте до окончания игры, отправлять новые приказы становится невозможно. Обратите внимание, что он все равно может выиграть, если в конце игры у него больше золота, чем у других игроков.


Конец хода

После того, как герой переместился (или решил остаться на месте), произойдут следующие вещи:


Сражения

Герои немного нервничают и никогда не упускают возможности ударить друг друга большими мечами. В конце хода героя, если есть враг на расстоянии одного квадрата в любом направлении, герой его атакует. Например, в этой ситуации, в конце хода первого героя (@1):

########
##@1@2##
##  @3##
########

Игрок 1 атакует второго игрока, но не трогает третьего, потому что третий стоит на расстоянии двух клеток от него.
Нападающий не теряет единиц здоровья, обороняющийся теряет 20 единиц.
Если обороняющийся умирает (см .: Смерть героя), нападающий получает контроль над всеми золотыми рудниками проигравшего.


Добыча золота

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


Жажда

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


Смерть героя

Когда здоровье героя падает до нуля, он умирает. Герой немедленно появляется на карте на своей точке возрождения, с полным запасом здоровья (100 единиц). Герой теряет контроль над всеми своими золотыми рудниками, но сохраняет все свое накопленное золото. Будьте осторожны, когда герой возвращается на точку возрождения, любой противник, который находится в этой клетке, автоматически умирает. Таким образом, вам следует избегать пребывания на клетке возрождения одного из героев …

Герой не может умереть от жажды. Жажда может оставить героя с одной единицей здоровья, но не убить его.


Конец игры

Игра заканчивается, когда достигается максимальное количество ходов (обычно 300). Победителем является герой с наибольшим количеством золота. Если у двух игроков одинаковое количество золота, победителя нет.


Рейтинг

Система оценки относительной силы игроков использует Рейтинг Эло. Идея такова: лучше быть первым, чем вторым, лучше быть вторым, чем третьим, и так далее. Надеюсь, принцип понятен.


Использование нескольких ботов одновременно

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

© Geektimes