Бібліотека алгоритмів штучного інтелекту для ігор. Частина 1. (Вихідні коди)








Ми сподіваємося, що статті будуть цікаві будь-яким програмістам і дизайнерам, які цікавляться розробкою ігор.


Ми будемо вдячні пропозиціями та побажаннями по опублікованими статтями і темах. Обговорити статтю можна буде на нашому форумі.







 

Малюнок 14

Ви вже бачили установку змінних середовища через панель управління. Однак є більш гнучкий спосіб установки з використанням утиліт установки змінних середовища. Ці утиліти можна викликати як безпосередньо в командному вікні, так і через різні скрипти (наприклад, через bat файли). Серед них найбільш відома setx – ця версія підійде як для Windows 2000 так і для WindowsXP, вона також міститься в пакеті SupportTools для WindowsXP. Невеликий урок для Вашого setx перебувати на http://www.ss64.com/nt/setx.html. Також існує ще одна утиліта подібного плану http://barnyard.syr.edu/ ~ Evefatica / # SETENV.

Опис включених до бібліотеки аніматов

Отже, тепер ви можете запускати аніматов, але не вистачає опису, які конкретно функції реалізовані під тим чи іншим ім'ям. Нижче в алфавітному порядку перераховані всі приклади, що виходять в інсталяцію бібліотеки FEAR.

Aimy – анімат використовує персептрон для управління корекцією стрільби. Цей анімат збирає дані від сенсорів для визначення поточного повороту тіла скоєного під дією команд на поворот. У процесі роботи відбувається тренування персептрона і потім анімат може апроксимувати обернену функцію помилок прицілювання для того, щоб зменшувати промахи.

Bouncer – простий анімат, бігає за рівнем і спостерігає за своїм станом. Якщо Bouncer у що то впирається, його швидкість падає. Вимірюючи свою швидкість просування, Bouncer робить висновок про зіткнення і виробляє поворот до тих пір, поки не зможе продовжити свій рух.

Breaker – анімат використовує правила (rulebased animat) для виведення своїх дій, англійська версія уроку з використання даного анімат дано http://aigamedev.com/tutorials/RuleBasedSystem.html. Однак, у зв'язку із змінами в основному коді бібліотеки у версії fear 4 даний приклад працює з помилками. Проте, в силу того, що в FEAR останньої версії є інший анімат, що працює на rulebased принципах – Stalker, ви можете спробувати знайти помилки і відповідним чином виправити їх. Також можна поекспериментувати з попередніми версіями FEAR, які ви знайдете на офіційному сайті.

Brutus – простий анімат з рисами поведінки нагадують поведінку собаки, реалізує елементарний рівень процедурної експертної системи. Здатний слідувати за гравцем або зупинятися біля його ніг. Кожне з дій закодовано найпростішої if () then послідовністю.

Colin – анімат, який робить спроби передбачити положення супротивника, грунтуючись на тому, що він бачить. У процесі передбачення він перевіряє, чи знаходиться попереду супротивника стіна. Якщо мета може обігнути стіну, передбачена швидкість руху буде злегка підправлена шляхом припущення. Якщо стіна виявляється суцільний, цикл припущень зупиняється і використовується поточне значення для мети.

Jacky – анімат, що використовує fuzzy логіку для визначення своїх дій – посадку на платформу, відкриття дверей, виклик елеватора, якщо анімат не знаходиться близько згаданих об'єктів – він просто мандрує за рівнем.

Kanga – анімат, який застосовує генетичний алгоритм для знаходження параметрів для відскоків і поворотів для відходу від запускається в нього Rocket launcher. Для того, щоб натренувати Kanga бажано знайти і завантажити невелику сцену (який-небудь bsp файл і покласти його в baseq2Maps, наприклад нехай це буде файл baseq2Mapstest.bsp), тоді ваш файл для запуску сервера буде мати рядок

quake2.exe + set game fear + set dedicated 1 + set maxclients 32 + set deathmatch 1 + map test

або в рядку налагодження

set game fear + set dedicated 1 + set maxclients 32 + set deathmatch 1 + map test

Потім, ви або повинні увійти в гру і вибравши Rocket launcher переслідувати Kanga, або запустіть анімата Salty. Salty буде стояти на місці і стріляти ракетами в усе що рухається навколо, в цьому випадку зручніше увійти для спостереження за процесом тренування необхідно увійти як Spectator, інакше, в разі входження як гравець, Salty вб'є вас.

Marvin – анімат, який реалізує алгоритм відходу від зіткнень (collision avoidance), в процесі роботи Marvin збирає інформацію про навколишній світ через виклики space-> TraceWalk і обробивши її робить повороти.

Можливі проблеми з простим підходом відходу від зіткнень з цим аніматом:
– Локальні пастки – рівень може бути досить складним, і успішний обхід перешкод може бути утруднений. У разі кутів, анімат може застрягти. Це відбудеться, коли анімат вирішить повернутися в одну сторону, але потім зрозуміє, що інший поворот потенційно краще. Для вирішення таких проблем необхідно додавати штрафні функції для повороту або якісь інші способи поділу рішень; тривалий тестування коду, яке породжується масою інших проблем, окрім пасток, тому незважаючи на простоту, йде маса часу на доведення параметрів;
– Не дуже високий реалізм – в силу простих правил – анімат виглядає занадто роботоподібними;
– Не висока масштабованість – якщо доводиться обходити додатковим кодуванням кілька ситуацій, то трудомісткість налагодження різко зросте.

Mole – анімат Darth Mole використовує навчання з підкріпленням (reinforcement learning) для знаходження адаптивних deathmatch стратегій.

Moody – aнімат демонструє виникнення різних емоцій під впливом вхідних впливів. Помістіть Moody в простій рівень і додайте кілька Stalker і Salty аніматов. Емоції визначаються двома кінцевими автоматами для почуттів і сприйняття.

Onno – анімат, що використовує нейронну мережу, розроблений для попередньої версії бібліотеки, не працює в останній версії 0.4 FEAR (поексперементіруйте c з попередніми версіями, які ви знайдете на сайті FEAR). Урок, присвячений даному анімату можна знайти тут: http://aigamedev.com/tutorials/NeuralNetwork.html.

Pain – анімат Major Pain, іспользется простий персептрон для навчання моментів часу стрільби. Він стріляє, коли є ворог і готове зброю. Персептрон навчається простої операції AND над двома вхідними впливами.

Picky – анімат з простим скриптом (перевірте наявність файлу fearmodulesweapon_select.py, він є в архіві коду) для процедури голосування вибору кращого зброї. Скрипт може безпосередньо взаємодіяти з оточенням, збираючи необхідну інформацію. Вибране зброю повертається через високорівнева інтерфейс. Проте, даний приклад містить помилку, правда, безпосередньо не впливає на роботу анімата. Помилка пов'язана з реалізацією сінглентона і конкретно функцією Factory & Factory:: GetInstance () з файлу factory.hpp. Природа помилки у тому, що модуль С + + Framework бібліотеки FEAR лінкуются статично з кожною dll (у даному випадку з двома dll game.dll і PickyBrain.dll). Тому при запуску анімата Picky виникає ситуація, коли Factory & Factory:: GetInstance () повертає в PickyBrain.dll локальну копію фабрики, яка не збігається з фабрикою створеної в game.dll і містить необхідну інформацію. Виходом із ситуації могло бути перетворення проекту файлів Fасtory в окрему dll, для цього потрібно зробити наступні кроки – створити проект Dll для Factory і вставити його в загальний проект FEAR. Перемістити до нього посилання на файл Factory.cpp, а потім додати генеруються dll і lib у всіх потрібних ситуаціях. Крім того, є й інша особливість – з файлу Factory.cpp перенесена в файл Architecture.cpp реалізація конструктора Exception:: Exception (const std:: string & msg, const std:: string & fn, const int l). Даний підхід усуває проблему з Picky, але створює проблему з динамічною лінковки стандартної бібліотеки. Насправді, приклад чудово працює, проте, як рішення усунення warnings в процесі компіляції може бути а) написання свого map (наприклад http://www.thecodeproject.com/vcpp/stl/bimap.asp http://www.codeproject.com/cpp/ufstmaps.asp), або обігу до статей http:/ / support.microsoft.com/kb/q168958 / http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html. Проте, оскільки Microsoft стверджує, що map експортувати не можна, зіткнувшись з труднощами реалізації підходу описаної (як працюючій) по другій посиланням, я припинив спроби.

Модифікація бібліотеки (у тому числі інші додавання) виходять за рамки статті.

Ви можете поекспериментувати з метою добитися результату.

Pinbot простий анімат, що демонструє обробку повідомлень ботом від модуля фізики.

Pyrophoric – простий анімат входить до групи аніматов в директорії demosanimats, не включений в основний проект Animats.sln, але файли для роботи цього анімата встановлюються в Quake 2 директорію, тому його варто згадати. Може бути використаний для вивчення коду та самостійних експериментів. Код можна поправити вивчаючи код Bouncer і Marvin, спробуйте змусити його працювати.

Rampage анімат, що є розвитком PinBot а, додає до Pinbot у навички використання зброї (без використання самої зброї).

Remote – досить складний анімат, що демонструє емоції, які обчислюються з використанням пам'яті про стан, відчуття з приводу власного стану та оточення, демонструє and displays витонченість і поліпшену правдоподноность симуляції переміщення тіла. Використовує ієрархічний підхід до обчислення настрою.

Rookie простий анімат, який вміє прицілюватися і вибирати цілі.

Salty анімат, вибирає найближчого гравця, як його супротивника і прямує прямо з цього напрямку. Розрахунок траєкторій можливого попадання проводиться тільки під час бою.

Selector – анімат, що використовує дерево рішень (decision tree) для оцінки цінності наявного у нього зброї залежно від поточної ситуації. Це призводить у більшості випадків до вибору найкращого зброї.

Spin найпростіший анімат, який просуваючись постійно повертається. Впершись у перешкода – зупиняється.

Splash – пророкує положення ворога, потім вибирає випадкову мета біля нього, використовуючи персептрон для оцінки ймовірність ураження цілі. Якщо зміни ймовірності попадання задовільні, вистрілюється ракета.

Stalker – анімат, слід вздовж стін, використовуючи систему правил (rule based system, RBS).

Tank – анімат Sir Tank реалізує пряме реактивне реагування. Іншими словами при виникненні однієї ситуації (для Tank – зіткнення) здійснює інше, пов'язане дію дію (для Tank а дія відскоку). Цей анімат відрізняється тим, що рух корпусу не пов'язано з його орієнтацією. Цей прийом дозволяє простежити, як рух можна розділити від інших можливостей, наприклад прицілювання.

Tobor – анімат, схожий на Bouncerа. Також як і останній, бігає за рівнем і спостерігає за своїм оточенням. На відміну від Bouncer а Tobor перевіряє стан прапора наявності зіткнення, у разі виставленого прапора зіткнення, Tobor повертається до тих пір, поки не може продовжити свій рух.

Невелике післямова.

Зручність роботи у віконному режимі і можливості налаштовувати більшу кількість параметрів, ніж у стандартному quake2, коду quake2_Q2CP додає, однак, деякі складності конфігурації бажаних параметрів, виникають із за помилок при збереженні cfg файлів.

При роботі з FEAR і quake2_Q2CP з командами запуску, наведеними у статті, будуть використовуватися такі файли cfg

baseq2config.cfg

fearconfig.cfg

fearplayer.cfg

fearspectactor.cfg

У принципі, плутанину в чому легко уникнути, якщо запускати ярлики або bat файли без вказівки специфічних конфігураційних файлів, наприклад:

(FEAR) Player

quake2.exe +set game fear +connect 127.0.0.1

замість

quake2.exe +set game fear +connect 127.0.0.1 +exec player.cfg

і (FEAR) Spectator

quake2.exe +set game fear +connect 127.0.0.1 +set spectator 1

замість

quake2.exe + set game fear + connect 127.0.0.1 + set spectator 1 + exec spectator.cfg

Такий підхід трохи зменшить гнучкість налаштування режимів – зате розбиратися доведеться всього лише в двох файлах

baseq2config.cfg

fearconfig.cfg

Нарешті, ви можете розібратися з кодом збереження cfg файлів quake2_Q2CP і виправити його.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*