Комментарии.
главная страница статьи файлы о сайте ссылки
Комментарии к искуственном интеллекту.

Георгий Мошкин
tmtlib@narod.ru

Здесь я даю некоторые комментарии к своим статьям, которые помогут вам лучше во всём разобраться, если что-то непонятно.

strategy.htm "Как сделать 2d игру: уровни и монстры, а также скрипты, интерпретаторы, искуственный интелект и создание стратегических игр". В этой статье дан основной принцип: абсолютно все герои игры (монстры, крысы, птицы, роботы, зомби, лягушки) храняться в одном массиве mosnter:array of TMonster. Заметье, что главный герой, которым вы управляете с клавиатуры, тоже находится в этом массиве. То есть и для крыс, и для птиц, и для роботов, и для людей есть один главный тип TMonster. То есть вы должны сделать так, что любым объектом игры можно будет управлять с клавиатуры. Например, вы используете DirectInput или события OnKeyDown и OnKeyUp. У вас есть какие-то IF-ы, которые срабатывают при нажатии клавиш. Эти IF-ы следует отделить от процесса изменения координат. Например, если у вас было:

IF (key[VK_UP]=true) then y:=y+1;

то это следует заменить на:

IF (igrok[i].UP=true) then y:=y+1;

а (key[VK_UP]=true) вынести в обработчик интеллекта:

FOR i:=0 to 100 do
begin


// управление с клавиатуры
if (igrok[i].intellekt="keyboard") then
begin
...
IF (key[VK_UP]=true) then igrok[i].UP:=true;
...
end;

// искуственный интеллект первого типа
if (igrok[i].intellekt="ai-1") then
begin
...
if random(100)<50 then igrok[i].UP:=true;
...
end;

// искуственный интеллект второго типа
if (igrok[i].intellekt="ai-2") then
begin
...
if sin(gettickcount/1000)<0 igrok[i].UP:=true;
...
end;

// искуственный интеллект третьего типа
if (igrok[i].intellekt="ai-3") then
begin
...
if igrok[i].UP=false then igrok[i].UP:=true;
...
end;

end;

То есть нужно сделать у всех героев игры переменные состояния нажатых клавиш:

igrok[i].UP:=...;
igrok[i].DOWN:=...;
igrok[i].LEFT:=...;
igrok[i].RIGHT:=...;
igrok[i].SPACE:=...;

Например, если вы на клавиатуре нажмёте и не будете отпускать кнопку "вправо", то igrok[15].RIGHT:=true. Но только в том случае, если igrok[i].intellekt="keyboard". Это связано с тем, что:

// управление с клавиатуры
if (igrok[i].intellekt="keyboard") then
begin
...
IF (key[VK_UP]=true) then igrok[i].UP:=true;
...
end;

Стоит нам поменяить igrok[15].intellekt="keyboard" на igrok[15].intellekt="ai-1", то сразу же управление игроком под номером 15 перейдёт в руки искуственного интеллекта первого типа:

// искуственный интеллект первого типа
if (igrok[i].intellekt="ai-1") then
begin
...
if random(100)<50 then igrok[i].UP:=true;
...
end;

Итак, наш герой:
type Geroy=record
x,y:single;
intellekt:string;
UP:boolean;
DOWN:boolean;
LEFT:boolean;
RIGHT:boolean;
end;


Массив героев:

Geroi: array[0..100] of Geroy;

Герой движется только в том случае, если UP, DOWN, LEFT или RIGHT равны TRUE.

Например, если Geroi[57].intellekt="keyboard", то он управляется с клавиатуры:

Geroi[57].UP:=DirectInput.UP;
Geroi[57].DOWN:=DirectInput.DOWN;
Geroi[57].LEFT:=DirectInput.LEFT;
Geroi[57].RIGHT:=DirectInput.RIGHT;

А если Geroi[57].intellekt="ai-4", то записи UP, DOWN, LEFT и RIGHT изменяются соответствующим искуственным интеллектом. Например, вот так:

Geroi[57].UP:=true;
If СтолкновениеСоСтеной THEN Geroi[57].LEFT:=true else Geroi[57].LEFT:=false;

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

Обработка перемещения всех игроков производится следующим образом:

for i:=0 to 100 do
begin
IF (igrok[i].UP=true) then y:=... x:=...;
IF (igrok[i].DOWN=true) then y:=... x:=...;
IF (igrok[i].LEFT=true) then y:=... x:=...;
IF (igrok[i].RIGHT=true) then y:=... x:=...;
end;

Итак, мы ушли от "прямых" if-ов. Этот подход существенно упрощает создание как самой игры, так и искуственного интеллекта. Координатами игрока можно управлять как с клавиатуры (intellekt:="keyboard"), так и алгоритмом искуственного интеллекта (intellekt:="ai-5"). Вы можете менять это даже во время игры.