Как мыслят игры


Автор: Романенко Сергей / awilum
Дата: 12.03.2009
Источник: http://pascalgames.net



Человек ответственен за качество мышления,
ибо оно или творит или разрушает.
 Рерих



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

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

Как мыслят игры

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

В современных компьютерных играх применяются сложные алгоритмы реализации поведения персонажей(существ). Но запомните: игры не думают. Они создают видимость того что они думают, это программист запрограммировал механизмы поведения в замкнутой системе. Это можно увидеть в игре «Жизнь».
В которой бактерии двух видов борятся за жизнь, размножаются. Делают вид реальной жизни, но они все равно подчинены  замкнутой системе со своими правилами, которые сделал программист.


Искусственный интелект. Алгоритмы преследования и уклонения

Значит начнем с самого простого алгоритма преследования и уколнения.
Этот алгоритм заставляет противника доганять игрока или убегать от него.

Преследование

1.   Нам необходимо знать расположение обоих обьектов. Координаты противника и игрока позволят нам знать их раположение.
2.   Нам необходимо сконструировать алгоритм который будет управлять поведением врага, переследующего игрока.


Вот этот алгоритм:
Предположим, что px,py – координаты игрока. ex,ey – координаты противника.

Код:
while (игра) do
begin
  игровой код
………………



// перемещение по горизонтали
if (ex>px) then ex := ex + 1;
if (ex<px) then ex := ex - 1;

// перемещение по вертикали
if (ey>py) then ey := ey + 1;
if (ey<py) then ey := ey - 1;

  …………
игровой код
end;


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

используя этот алгоритм, противник преследует игрока до тех пор пока не поймает его.

Уклонение

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

Предположим, что px,py – координаты игрока. ex,ey – координаты противника.

Код:
while (игра) do
begin
  игровой код
………………



// перемещение по горизонтали
if (ex>px) then ex := ex - 1;
if (ex<px) then ex := ex + 1;

// перемещение по вертикали
if (ey>py) then ey := ey - 1;
if (ey<py) then ey := ey + 1;

  …………
игровой код
end;


Теперь созданное существо будет убегать от игрока.


Искусственный интелект. Шаблонные мысли

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

 

Конструирование шаблона достатчно легко.
Сейчас напишем шаблон для моделирования разума, который можно использовать, для управления космическим кораблем. Он может уварачиваться и при этом прицельно стрелять.

Вот так вот выглядит алгорим:

Код:
// patter – это масив, содержащий  содержащий набор команд
// для реализации десяти различных шаблонов поведения.

while(игра) do
begin
  …..код игры
// проверяем, законченна ли обработка текущего шаблона
If (если обработка команд текущего шаблона закончена) then
begin
 // выбираем новый шаблон
current_pattern = pattern(random(10))
позиция противнка = старая позиция + следующий элемент текущего шаблона
Увеличиваем на единицу значение индекса элементов шаблона

…код игры
end;

end;



-Выбирается некоторый шаблон
-Движение созданий в каждом проходе цикла изменяется в соответствии с направлением, указанным в шаблоне
-Затем мы переходим к следующему элементу шаблона.

Блок-схема работы шаблона


Чтобы сделать преследование игрока более изящным можно использовать шаблон, когда  противник приближается к игроку.  Для этого нужно добавить измерение расстояния до игрока. Если противник оказывается близко к игроку, то он начинает свои перемещения по шаблонам.

Вот так будет этот алгоритм будет выглядеть
Код:
while(игра) do
begin
  …..код игры
if (игрок вне круга с радиусом 50 точек) then преследуем его
else
выбираем случайный шаблон и реализуем его
  …..код игры
end



Случайные передвижения

Случайный перемещения используются во многих современных компьютерныъ играх.
Случайные перемещения называют еще «Неявной логикой»
Неявная логика помагает существу принять решение при отсутствии необходимой информации. Тоесть свободное поведение.

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

Алгоритм такого поведения будет выглядеть так:




Код:
while(игра) do
begin
  …..код игры
If (перемещение точки по текущей траектории закончено) then
begin
  выбор новой траектории
end;
двигаем точку несколько раз по новой траектории
  …..код игры
end



В итоге можно увидеть забавное перемещение существа. Получается имитация разумного существа которое  произвольно движется.  

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