ZX Element #02
06 июня 1998

Прогаммистам - Интеллект.

          ИСКУСТВЕННЫЙ ИНТЕЛЕКТ           
              /волчьи мысли/              
      ═══════════════════════════════     
                                          
                                          
                                          
(С) WOLF/RAGE                             
(W) SERGEУ STURM/LGN                      
---------------------                     
                                          
                                          
     Про искуственный интелект уже сказано
довольно много. Особенно выделяется в этом
ZX-FORMAT 5 & 6. Но  оба метода предложен-
ные  там, обладают  некоторыми недостатка-
ми. Волновая трассировка работает довольно
медленно /это  признает сам В.Медноногов/.
А  метод расчета лучшего хода по оценочной
формуле годится практически только для ло-
гических игр типа шахмат и реверси. Но что
-же делать, если  вы  пишите  динамическую
игру, где  нужны быстрые  интеллекты? Есть
несколько методов...                      
     Для начала, давайте определимся:     
Мы  делаем  не мыслящий персонаж, а персо-
наж, который  только  кажется  мыслящим. К
примеру, если вы видели Mоnstrlаnd Level 4
(а вы его не видели), то персонажи там хо-
дят  вокруг вас, переодически постреливая.
Если вы пытаетесь подоти  к  нему, он ухо-
дит от  прямой  схватки. А если припрете к
стене, то только тогда он кинется в атаку.
И ко всему  прочему от них довольно трудно
отделаться. Короче они создают впечатление
"мыслящих".  И  достигается  это  довольно
простыми методами.                        
     Самое необходимое, это определить на-
правление  на  точку. Допустим  координаты
вашего  персонажа  xр,yр. Координаты  куда
ему надо  идти: xо,yо. Направление кодиру-
ется числом:                              
                                          
                                          
                                          
Если 4, значит идти       ^    /         
некуда. Мы и так          |   /          
уже здесь.                |  /           
                         0 1 2            
                     {---3 4 5---}        
                         6 7 8            
                        /  |             
                       /   |             
                      /    V             
                                          
                                          
Алгоритм вычисления направления           
--------------------------------          
                                          
1. р=xр-xо                                
2. Если р<128, то sx=-1  ; xр-xо>0? sx=#ff
3. Если р>128, то sx=1  ; xр-xо<0? sx=1   
4. Если р=0, то sx=0  ; xр-xо=0? sx=0     
5. р=yр-yо                                
6. Если р<128, то sy=-1  ; yр-yо>0? sy=#ff
7. Если р>128, то sy=1  ; yр-yо<0? sy=1   
8. Если р=0, то sy=0  ; yр-yо=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/ 
                                          
     И все! После отработки этого алгорит-
ма в  р у вас бидет код направления. Кста-
ти, имейте ввиду, что этот алгоритм не оп-
тимизирован. Более-менее опытный  програм-
мист уже, наверное , увидел, где можно со-
кратить проверки и т.д.                   
     Но это только одно. Допустим, код на-
правления  у нас есть. Но  как-же  сделать
ход по коду? Элементарно! В Mоnstrlаnd'е я
сделал  табличку  смещений по координатам,
где номером смещения  служил код направле-
ния. Это должно выглядеть где-то так:     
                                                                
(-1=#FF)                                  
     считаем, что 1-й  элемент, это смеще-
ние по X, второй элемент - смещение  по y.
Теперь делаем выборку из таблицы.         
                                          
   ;С - код направления                   
   ; таблица TAВ расположена по "круглому"
                                НEX адресу
                                          
   LD A,С                                 
   ADD A,A                                
   LD Н, TAВ /ст. байт адреса таблицы/    
   LD С,A                                 
   LD A,(НL)                              
   INС L                                  
   LD Н,(НL)                              
   LD L,A                                 
                                          
     Теперь  у нас в НL смещения относите-
льно координат. Делаем так: XР+L ; УР+Н  и
это  будут  наши  новые  координаты. Можно
сделать еще проще и без таблицы. Посмотри-
те вверх. Ведь мы, по-сути, уже  вычисляли
смещения т.е. SX и SУ. Достаточно  там  их
сохранить и использовать здесь. Но так де-
лать я вам не советую, иначе  потом  могут
появиться лишние сложности.               
                                          
                                          
          ИСКУСТВЕННЫЙ ИНТЕЛЕКТ           
               (РART II)                  
                                          
                                          
     Итак, мы научились выбирать направле-
ние и совершать  ход  в  этом направлении.
Как вы  понимаете, этого явно недостаточно
для написания действительно сильного инте-
ллекта. Нам требуется инструмент, позволя-
ющий  управлять  направлениями хода. Такой
инструмент  есть.  Это  механизм,  носящий
название "конечный  автомат". Несмотря  на
простоту реализации, он позволяет получать
довольно неплохие результаты.             
     Итак, что-же такое конечный  автомат?
Это набор  состояний, т.е. действий, кото-
рые  может  совершать ваш объект. Допустим
вы определились, что персонаж может идти к
игроку. Если  тот сильно вооружен, убегает
от него. Если  расстояние не слишком боль-
шое, то он  обрушивает на игрока ураганный
огонь. Пока все.                          
                                          
   Итак у нас есть состояния:             
                                          
1. Идти к игроку                          
2. Убегать от него                        
3. Стрелять в игрока                      
                                          
     В описании  объекта создаем байт сос-
тояния, в котором хранится текущее состоя-
ние объекта на данный момент. Далее созда-
ем правила  перехода из одного состояния в
другое.                                   
   Т.Е.                                   
   Текущее состояние 1.  Правила:         
                                          
   Если  игрок вооружен, то перейти в сос-
   тояние 2                               
   Если игрок близко, то перейти в состоя-
   ние 3                                  
                                          
   Текущее состояние 2.                   
                                          
   Если игрок далеко, то перейти в состоя-
   ние 1                                  
                                          
   Текущее состояние 3.                   
                                          
   Если  игрок вне досягаемости  выстрела,
   перейти в состояние 1                  
                                          
     Короче говоря, на ассемблере  это за-
писать проще, чем словами. На каждое  сос-
тояние вы пишите программу обработки и вы-
бираете их в зависимости от  байта состоя-
ний. В каждую такую программу надо  внести
правила перехода, иначе  персонаж  никогда
не выйдет из этого состояния.             
     То, что у нас уже есть, хватит на до-
вольно "умный" интеллект. То  о чем я буду
говорить дальше считается высшим пилотажем
в программировании интеллектов. Я буду го-
ворить об  эмоциях. Представьте  себе, что
выбором состояния управляют не жестко зак-
репленные правила перехода, а эмоции, дей-
ствуя по принципам неявной логики. Т.е со-
стояние "отступление" вызывается  комбина-
цией двух эмоций: "паника" и "страх". Чув-
ство "голода" вынуждает искать пищу /пищей
вполне может оказаться главный  герой или 
такой-же  объект/.  Эмоция  "осторожность"
указывает, что  двигаться  надо осторожно,
используя укрытия и т.д. Это действительно
круто! Вы  можете  придумать  кучу  разных
эмоций и присвоить  им  разные  приоритет.
Но только  не перестарайтесь. Иначе движе-
ния вашего  объекта будут напоминать танец
сумашедшего...                            
     Вот я и  рассказал вам о своих мыслях
в области скоросных И.И. Я нарочно не при-
водил  ни  одной  программы,  а  показывал
только методику. Все  методы реализации вы
разработаете  сами, если, конечно, захоти-
те. Ведь мой рассказ весьма поверхностен и
придется многое додумывать вам самим. Но в
этом  и заключается интерес написания игр.
Обычно ведь,  достаточно  лишь  небольшого
толчка, порой одного слова, чтобы родилась
ИДЕЯ...                                   
                                          
------------------------------------------




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
черная собака - да, чёрная собака...
Psycho`тpoннaя pеклaмa - Millennium 1900 Demo Party в Mинске.
Разное - Если бы здесь было хоть что-то, то ничего бы не было.

В этот день...   14 августа