Искусственный интеллект в CRPG

Я сейчас работаю над компьютерной RPG. Вот краткий обзор того, что я придумал.
Так как это мой первый опыт в работе над искусственным интеллектом (ИИ) первое, что я сделал, это купил и прочитал книгу "Методы Программирования Искусственного интеллекта: изучение на основе LISP". Из нее я узнал о различных типах искусственного интеллекта и общей идее ИИ. После чтения книги нужно было решить, какой уровень ИИ включить в игру. Нужно ли создавать очень сложный ИИ или просто использовать уловки для придания иллюзии размышления? Сложный ИИ требует слишком много усилий от программиста, и игра не обязательно будет иметь лучший геймплей. А простой ИИ уподобит игру остальным. И еще надо принять во внимание, что я никогда ничего не планирую на бумаге перед написанием программ. В общем я решил сделать гибкий ИИ, достаточно сложный, чтобы быть модифицируемым в игре , вместо того, чтобы модифицировать код и достаточно простым, чтобы быть уверенным в интересности игры.
Теперь, когда уровень сложности ИИ был определен, я принялся к его созданию. Первое что я сделал, это отделил каждый элемент, который составит части ИИ:
Среда - это то, из чего состоит мир. Локациии и объекты. В классическом программировании игр, объекты обычно определяются как переменные и имеют некоторое число параметров.
Например:
Weapon(x).Type = "Меч"
Weapon(x).Value = 100
Weapon(x).Damage = 0
И т.д......

Но этот путь определения объектов потребовал бы изменение кода, если бы я захотел добавить параметр. Так же пришлось бы изменять ИИ, чтобы принять во внимание новый параметр. Так что я решил, что все объекты будут определены "внешне". Объекты имеют некоторые характеристики, и некоторые из них могут изменяться. Например, шар (объект) красный (атрибут цвета) и может быть брошен (действие) и если, это случится - местоположение (атрибут), изменится. С этими элементами я могу начать написание редактора. Я сделал " редактор атрибутов ", "редактор объектов" и " редактор действий ".
Редактор атрибутов позволяет создавать атрибуты типа "состояние открытости" для двери или любого другого объекта, который может быть открыт или закрыт. Этот атрибут может иметь значение "открыт" или "закрыт". Атрибут "повреждения" - может иметь значение от 0 до 100 и отражает степень повреждения объекта. Это позволяет ИИ проверять атрибут объекта и пробовать при необходимости изменить его. Например, персонаж может "видеть", что дверь закрыта и если нужно, может пробовать открыть ее.
Теперь, когда атрибуты созданы, нужен способ изменения их игроком или персонажем. Для этого используется "редактор действий". Действие состоит из нескольких ключевых элементов. Сначала мы должны убедиться, что действие доступно только тогда, когда определенные условия истинны. Например, действие "открыть" не должно быть доступно на двери, которая уже открыта. Для этой цели используются "необходимые атрибуты". Раздел "необходимых атрибутов" содержит все атрибуты, которые проверяются, для определения доступности действия. Так при действии "открыть" проверяется атрибут "состояние открытости" на значение "закрыто". После того, как все требуемые атрибуты проверены, можно переходить к разделу "проверки атрибута". Здесь, если атрибуты имеют нежелательное значение, игрок уведомляется об этом. Например, если атрибут двери "состояние блокированности" в значении "заперто", игра может сообщить "эта дверь заперта, отоприте сначала" . И наконец, есть раздел "изменения атрибута". В примере двери этот раздел содержал бы изменение атрибута "состояние открытости" до значения "открыто".
Редактор объекта позволяет давать различным объектам различные атрибуты и возможные действия. Например, после создания объекта "дверь", мы можем назначать ему атрибут "состояние открытости", чтобы знать, является ли дверь открытой или закрытой. Потом мы можем назначать, атрибут "состояние блокированности", чтобы знать, блокирована ли дверь. Теперь мы можем создать действия "открыть" и "закрыть" и присвоить их двери. Как только создание объекта дверь закончено, мы можем создавать объект "ключ" и назначить ему действия "запереть" и "отпереть", которые могут изменять атрибут "состояние блокированности".
Наконец, самое интересное, как ИИ будет работать с этими данными.
ИИ теперь имеет достаточно данных, чтобы размышлять. Эта схема может работать с любыми созданными объектами, что не требует писать определенный код для каждого различного объекта. Вот пример того, как это работает.
Продолжая пример с дверью: персонаж может "видеть", что атрибут "состояние открытости" двери имеет значение "закрыто". Если по какой либо причине, персонаж "хочет", чтобы значение было "открыто", он "думает" по следующему пути. Сначала он проверяет, какие действия изменяют атрибут "состояние открытости" объекта. И находит, что это делает действие "открыть". Теперь, когда персонаж знает, какое действие нужно сделать он проверят, какие атрибуты являются необходимыми этого для действия. Действие "открыть" требует, чтобы атрибут "состояние открытости" объекта, был равен значению "закрыто". Затем он проверяет "проверки атрибутов". Предположим, что атрибут "состояние блокированости" имеет значение "заперто". Теперь, "зная", что нужно изменить значение "состояние блокированности" двери, ИИ продолжает исследовать, и находит, что изменить состояние можно действием "отпереть". После выполнения действия "отпереть" на двери персонаж может выполнить действие "открыть" и наконец получить открытую дверь. Как вам это? Теперь у нас есть ИИ, который может взаимодействовать с поддающимся изменению миром.
На этом месте я остановился. Далее, вероятно следует идти в этих направления:
Персонажи должны иметь собственную базу знаний, это оградит их от "знания всего". Например, в разделе проверок действия ключа "отпереть", может быть атрибут "уникальный идентификатор". Этот атрибут указывает, что ключ разблокирует только "ту-самую" дверь (key.uniqueID=door.uniqueID). Но персонаж не должен знать, какая именно дверь имеет "тот-самый" идентификатор. То-есть должен быть своего рода "фильтр", который скрывал бы двери и идентификаторы ключей, пока не будут найдены правильные комбинации ключ-дверь.
Персонажи должны иметь побуждения или цели. Они могут взаимодействовать с миром, но им нужны причины, для того чтобы что-то делать. Это можно достичь в соответствии с требованиями атрибутов. Например, атрибут "состояние сытости" персонажа должен всегда быть ниже 90 % (character.hungry< 90) что бы заставить персонаж иногда есть. Этот атрибут повышается с течением времени, и "применение" еды приводит к его понижению.
Между персонажами должны быть установлены иерархические связи, генеалогические деревья и отношения. Это позволит персонажам взаимодействовать друг с другом основываясь на том, кого они любят, какое место занимают и каковы их семейные связи Самой трудной частью вероятно будут беседы. Нужен гибкий текстовый парсер (синтаксический анализатор), чтобы не заставлять игрока вводить текст. Я все еще думаю об этом, и думаю, что скоро придумаю.
Вот в принципе и все. Надейтесь, что вам понравилось.



Опубликовал admin
7 Дек, Воскресенье 2003г.



Программирование для чайников.