ИСКУСТВЕННЫЙ ИНТЕЛЕКТ
/волчьи мысли/
═══════════════════════════════
(С) WOLF/RAGE
(W) SERGEY STURM/LGN
---------------------
Про искуственный интелект уже сказано
довольно много. Особенно выделяется в этом
ZX-FORMAT 5 & 6. Но оба метода предложен-
ные там, обладают некоторыми недостатка-
ми. Волновая трассировка работает довольно
медленно /это признает сам В.Медноногов/.
А метод расчета лучшего хода по оценочной
формуле годится практически только для ло-
гических игр типа шахмат и реверси. Но что
-же делать, если вы пишите динамическую
игру, где нужны быстрые интеллекты? Есть
несколько методов...
Для начала, давайте определимся:
Мы делаем не мыслящий персонаж, а персо-
наж, который только кажется мыслящим. К
примеру, если вы видели Monstrland Level 4
(а вы его не видели), то персонажи там хо-
дят вокруг вас, переодически постреливая.
Если вы пытаетесь подоти к нему, он ухо-
дит от прямой схватки. А если припрете к
стене, то только тогда он кинется в атаку.
И ко всему прочему от них довольно трудно
отделаться. Короче они создают впечатление
"мыслящих". И достигается это довольно
простыми методами.
Самое необходимое, это определить на-
правление на точку. Допустим координаты
вашего персонажа хр,ур. Координаты куда
ему надо идти: хо,уо. Направление кодиру-
ется числом:
Если 4, значит идти ^ /
некуда. Мы и так | /
уже здесь. | /
0 1 2
{---3 4 5---}
6 7 8
/ |
/ |
/ V
Алгоритм вычисления направления
--------------------------------
1. р=хр-хо
2. Если р<128, то sx=-1 ; xр-xо>0? sx=#ff
3. Если р>128, то sx=1 ; хр-хо<0? sx=1
4. Если р=0, то sx=0 ; хр-хо=0? sx=0
5. р=ур-уо
6. Если р<128, то sy=-1 ; yр-yо>0? sy=#ff
7. Если р>128, то sy=1 ; ур-уо<0? sy=1
8. Если р=0, то sy=0 ; ур-уо=0? sy=0
Выборка
--------
9. Если sx=-1, то n=[0,3,6]
10.Если sx=1, то н=[2,5,8]
11.Если sx=0, то n=[1,4,7]
12.Если sy=-1, то р=n1 /первое число из n/
13.Если sy=0, то р=n2 /второе число из n/
14.Если sy=1, то р=n3 /третье число из n/
И все! После отработки этого алгорит-
ма в р у вас бидет код направления. Кста-
ти, имейте ввиду, что этот алгоритм не оп-
тимизирован. Более-менее опытный програм-
мист уже, наверное , увидел, где можно со-
кратить проверки и т.д.
Но это только одно. Допустим, код на-
правления у нас есть. Но как-же сделать
ход по коду? Элементарно! В Monstrland'е я
сделал табличку смещений по координатам,
где номером смещения служил код направле-
ния. Это должно выглядеть где-то так:
(-1=#FF)
считаем, что 1-й элемент, это смеще-
ние по X, второй элемент - смещение по y.
Теперь делаем выборку из таблицы.
;С - код направления
; таблица ТАВ расположена по "круглому"
НЕХ адресу
LD A,С
ADD A,A
LD Н, ТАВ /ст. байт адреса таблицы/
LD С,A
LD A,(HL)
INC L
LD Н,(HL)
LD L,A
Теперь у нас в HL смещения относите-
льно координат. Делаем так: ХР+L ; УР+Н и
это будут наши новые координаты. Можно
сделать еще проще и без таблицы. Посмотри-
те вверх. Ведь мы, по-сути, уже вычисляли
смещения т.е. SX и SY. Достаточно там их
сохранить и использовать здесь. Но так де-
лать я вам не советую, иначе потом могут
появиться лишние сложности.
ИСКУСТВЕННЫЙ ИНТЕЛЕКТ
(PART II)
Итак, мы научились выбирать направле-
ние и совершать ход в этом направлении.
Как вы понимаете, этого явно недостаточно
для написания действительно сильного инте-
ллекта. Нам требуется инструмент, позволя-
ющий управлять направлениями хода. Такой
инструмент есть. Это механизм, носящий
название "конечный автомат". Несмотря на
простоту реализации, он позволяет получать
довольно неплохие результаты.
Итак, что-же такое конечный автомат?
Это набор состояний, т.е. действий, кото-
рые может совершать ваш объект. Допустим
вы определились, что персонаж может идти к
игроку. Если тот сильно вооружен, убегает
от него. Если расстояние не слишком боль-
шое, то он обрушивает на игрока ураганный
огонь. Пока все.
Итак у нас есть состояния:
1. Идти к игроку
2. Убегать от него
3. Стрелять в игрока
В описании объекта создаем байт сос-
тояния, в котором хранится текущее состоя-
ние объекта на данный момент. Далее созда-
ем правила перехода из одного состояния в
другое.
Т.Е.
Текущее состояние 1. Правила:
Если игрок вооружен, то перейти в сос-
тояние 2
Если игрок близко, то перейти в состоя-
ние 3
Текущее состояние 2.
Если игрок далеко, то перейти в состоя-
ние 1
Текущее состояние 3.
Если игрок вне досягаемости выстрела,
перейти в состояние 1
Короче говоря, на ассемблере это за-
писать проще, чем словами. На каждое сос-
тояние вы пишите программу обработки и вы-
бираете их в зависимости от байта состоя-
ний. В каждую такую программу надо внести
правила перехода, иначе персонаж никогда
не выйдет из этого состояния.
То, что у нас уже есть, хватит на до-
вольно "умный" интеллект. То о чем я буду
говорить дальше считается высшим пилотажем
в программировании интеллектов. Я буду го-
ворить об эмоциях. Представьте себе, что
выбором состояния управляют не жестко зак-
репленные правила перехода, а эмоции, дей-
ствуя по принципам неявной логики. Т.е со-
стояние "отступление" вызывается комбина-
цией двух эмоций: "паника" и "страх". Чув-
ство "голода" вынуждает искать пищу /пищей
вполне может оказаться главный герой или
такой-же объект/. Эмоция "осторожность"
указывает, что двигаться надо осторожно,
используя укрытия и т.д. Это действительно
круто! Вы можете придумать кучу разных
эмоций и присвоить им разные приоритет.
Но только не перестарайтесь. Иначе движе-
ния вашего объекта будут напоминать танец
сумашедшего...
Вот я и рассказал вам о своих мыслях
в области скоросных И.И. Я нарочно не при-
водил ни одной программы, а показывал
только методику. Все методы реализации вы
разработаете сами, если, конечно, захоти-
те. Ведь мой рассказ весьма поверхностен и
придется многое додумывать вам самим. Но в
этом и заключается интерес написания игр.
Обычно ведь, достаточно лишь небольшого
толчка, порой одного слова, чтобы родилась
ИДЕЯ...
------------------------------------------
Other articles: