Основы проектирования искусственного интеллекта.
Я
думаю, что каждый программист сталкивался с проблемой создания
AI в играх. Даже опытным разработчикам приходится
выкладывать все свои
силы.
А я попытаюсь дать вам основные понятия, служащие для разработки
AI. В общем, поехали. :-)
Детерминированные алгоритмы
Детерменированные
алгоритмы означают предопределённое и заранее
запрограммированное
поведение объектов. Это встречается довольно часто
в
современных играх, хотя и было придумано во времена игр типа PacMan.
Но
все-таки из множества простых алгоритмов можно построить мощный алгоритм.
Случайное движение
Этот
алгоритм можно объединять с детерминированными, т.е. случайным образом
выбирается
какое-либо действие при определённых событиях. Также можно и без
него,
но получится это некрасиво! Если в цикл добавить этот код,
x+=
-8 + rand()%10 ;
y+=
-8 + rand()%10 ;
то
всё видно даже ребёнку. Этот код можно записать иначе, тем самым можно
сделать
более плавные движения. Просто сделайте условие и переменные xp,
yp
указывающие
на точку, в которую нужно переместиться. А также переменную st
которая
будет указывать, что объект должен делать, искать новую позицию для
перемещения
или перемещаться. Теперь запишем и сам алгоритм:
if( st == 0)
{
xp=rand()%10;
yp=rand()%10;
st = 1
} else {
if( x < xp )
x+=1;
if( x > xp )
x-=1;
if( y < yp )
y+=1;
if( y > yp )
y-=1;
if((x==xp) & (y==yp))
st=0;
}
Всё
просто!!! Комбинация и соединение различных алгоритмов AI
дадут
вам большой результат. Конечно же это зависит и от
профессионализма
программиста.
А
теперь чтобы это доказать, запишем наш алгоритм в функцию
и поэкспериментируем!
void
ai_function( int max_rand, int p)
{
if( st == 0)
{
xp=rand()%max_rand;
yp=rand()%max_rand;
st = 1
} else {
if( x < xp )
x+=p;
if( x > xp )
x-=p;
if( y < yp )
y+=p;
if( y > yp )
y-=p;
if((x==xp) & (y==yp))
st=0;
}
}
Теперь у вас есть функция ai_function (int max_rand, int p).
С
помощью её можно сделать ещё более мощный алгоритм.
Ниже
написан код с использованием этой функции.
Перед
условиями нужно переменной object_ai
задавать
случайные
значения от 1 до 5, а потом запишем следующее:
[cj]
if( object_ai == 1 )
ai_function(
5, 1 );
if( object_ai == 2 )
ai_function(
14,4 );
if( object_ai == 3 )
ai_function(
2, 7 );
if( object_ai == 4 )
ai_function(
6, 5 );
if( object_ai == 5 )
ai_function(
7, 7 );
Кстати,
предпоследний алгоритм это почти алгоритм следования
,
переменные xp yp, можно считать координатами
второго объекта!
Немного
поправить код и всё готово. :-)
Я
надеюсь всем всё понятно! Если нет, то прочитайте ещё раз :-)
Ну
а теперь перейдём к другим вопросам!
Сценарии действий
Сценарии
это те же детерменированные алгоритмы, т.е.
сценарий
это одно из действий объекта, который он может
выполнить,
действия могут быть детерменированные частично или полностью.
Например,
объект с координатами x, y,
может выполнить только 5 различных действий,
т.е. сценариев (дальше я их буду сценариями
называть). Переменная get будет
хранить
номер сценария, который выполняет объект. Сценарии следующие:
1) sc_1();
- объект двигается прямо
2) sc_2();
- объект ищет укрытие
3) sc_3();
- объект нападает
4) sc_4();
- объект ждёт, при этом медленно двигается
5) sc_5();
- объект выполняет случайные движения
Теперь
просто напишите функцию, которая будет проверять значения переменной
get, и в зависимости от значения выполнять сценарии!
Всё
просто! Обязательно попробуйте что-нибудь сделать со сценариями,
и
с предыдущими способами (хотя они особо не отличаются).
Copyright © DRAG 2008
|