ИСКУСТВЕННЫЙ ИНТЕЛЕКТ /волчьи мысли/ ═══════════════════════════════ (С) 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 Короче говоря, на ассемблере это за- писать проще, чем словами. На каждое сос- тояние вы пишите программу обработки и вы- бираете их в зависимости от байта состоя- ний. В каждую такую программу надо внести правила перехода, иначе персонаж никогда не выйдет из этого состояния. То, что у нас уже есть, хватит на до- вольно "умный" интеллект. То о чем я буду говорить дальше считается высшим пилотажем в программировании интеллектов. Я буду го- ворить об эмоциях. Представьте себе, что выбором состояния управляют не жестко зак- репленные правила перехода, а эмоции, дей- ствуя по принципам неявной логики. Т.е со- стояние "отступление" вызывается комбина- цией двух эмоций: "паника" и "страх". Чув- ство "голода" вынуждает искать пищу /пищей вполне может оказаться главный герой или такой-же объект/. Эмоция "осторожность" указывает, что двигаться надо осторожно, используя укрытия и т.д. Это действительно круто! Вы можете придумать кучу разных эмоций и присвоить им разные приоритет. Но только не перестарайтесь. Иначе движе- ния вашего объекта будут напоминать танец сумашедшего... Вот я и рассказал вам о своих мыслях в области скоросных И.И. Я нарочно не при- водил ни одной программы, а показывал только методику. Все методы реализации вы разработаете сами, если, конечно, захоти- те. Ведь мой рассказ весьма поверхностен и придется многое додумывать вам самим. Но в этом и заключается интерес написания игр. Обычно ведь, достаточно лишь небольшого толчка, порой одного слова, чтобы родилась ИДЕЯ... ------------------------------------------