ИИ. Патрулирование

Одним из важнейших составляющих игры является наличие так называемого искусственного интеллекта. Чем хуже ИИ – тем скучнее игра.

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

Этот подход мне нам не очень нравится, как и вариант когда компьютерный игрок знает «чуть больше», чем обычный. Например, точное расположение сундуков, противников, ловушек.

В идеале, хотелось бы создать такой ИИ, что при игра с ним, не сильно отличалась от игры с реальным противников.
До сих пор, компьютерные существа в нашей игре, ходили случайным образом, а в случае попадание в их видимость противника – атаковали.

Для начала решено сделать патрулирование. Это означает что моб, будет обходить всю карту, узнавая ее - и запоминать маршрут, а затем при полном обходе карты – начнет патрулировать по проложенному маршруту.

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

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

Функция для тестирования открытии карты назвали checkPatrul(int) - параметр количество AP(активных очков движения) для каждого конкретного персонажа.

Как и было сказано ранее, реализация проста – каждое существо теперь хранит свою открытую карту виде массива байтов размера (mapW*mapH), 0 – проход, 1 – препятствие, -1 не открытая территория.

При запуске функции проверяется эта самая карта (перебирается скажем от 0 до конца) для поиска неизвестной территории. Далее высчитывается возможность прохода туда, считая что закрытая территория – возможный проход, делается ход. Если на точку нельзя пройти (а она помечена как -1), то она помечается в локальной карте – как препятствие. Если перебрали всю карту, а закрытых территорий нет – то открыли всю карту.

Далее проверяем наш набор контрольных точек – расстояние от каждой до этой более 4*AP? Значит это новая контрольная точка.

Если открыли всю карту, то начинаем движение по контрольным точкам, (также придется внедрить флаг направления, скажем int f_d – отрицательное значение значит идет в обратном порядке, положительно – в прямом ; значение индекс точки, к которой движемся)

Алгоритм тут - patrol.cpp

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