ИИ - с чего начать
Автор: James Matthews
Перевел: Daddy
WEB-сайт: http://daddy.mirgames.ru
Игровой искусственный интеллект (ИИ) - определенно одна из наиболее интересных областей искусственного интеллекта. Его написание доставляет слишком много трудностей многим людям, так что эта статья поможет рассмотреть на некоторые пути, для преодоления этих трудностей.
В статье мы рассмотрим несколько подходов: непрограммируемый, программируемый, использующий существующие игры, и программируемый нуля.
Непрограммируемый: на примере игры MindRover
MindRover - игра, произведенная крмпанией CogniToy, в которой игрок выбирает вездеход, добавляет компоненты и соединяет их с помощью проводов, для выполнения некоторой задачи: чего-нибудь взорвать, выиграть гонку, управлять схемой или все сразу!
MindRover это превосходная платформа для экспериментов с игровым искусственным интеллектом, потому что она не требует умения программирования. Все «программирование» сделано через графический интерфейс (на рисунке). Выбираем транспорт, добавляем радар, управляющие компоненты и оружие. После, соединяем компоненты так, чтобы при обнаружении чего-либо радаром, транспорт стрелял по цели и двигался к ней. Итак запускаем сценарий и находим, что вездеход в порядке, но если противник выстреливает медленно летящую ракету, радар обнаруживает ее и поворачивается к ней. Это не совсем то, что нам надо, поэтому возвращаемся назад и добавляем IFF (опознаватель "свой-чужой") фильтр на радаре, и отфильтровываем все, что не является врагом. Запустим сценарий, теперь вездеход работает намного лучше.
В MindRover роботы могут быть гораздо более сложными чем этот и содержать много компонентов (до 30). Они могут быть связаны через логические выходы, радиопередачи (один элемент включает несколько), переключатели (разрешают и запрещают события), и тд.
MindRover основан и является графической оболочкой для языка программирования ICE. Ниже - кусок кода, который сгенерирован схемой вездехода, показанного в вышеупомянутом скриншоте.
class DkrPursuit extends Vehicle
sys as VehicleSystemObject
Filter_IFF1 as Filter_IFF
MediumEngine1 as MediumEngine
Steering1 as Steering
BumpSensor1 as BumpSensor
Filter_IFF2 as Filter_IFF
LongRangeRadar1 as LongRangeRadar
MediumRadar1 as MediumRadar
MediumRadar2 as MediumRadar
MediumRadar3 as MediumRadar
MediumRadar4 as MediumRadar
Broadcast1 as Broadcast
TurnLeft as Broadcast
Timer1 as Timer
' class functions are here...
end class 'DkrPursuit
В этой статье мы не будем касаться программирования на ICE, его возможности гораздо шире чем в графическом интерфейсе и описывать их очень долго.
В настоящее время есть группа программистов на ICE, которые расширяют набор компонентов в игре, типа более продвинутых логических выходов, компоненты, которые эмулируют память СППЗУ и более другие вещи. Так что, если вы еще не знаете высокоуровневый язык программирования, обратите внимание на MindRover. По мере того, как вы будете входить в суть, сможете программировать дополнительные компоненты и более интеллектуальные вездеходы.
Создание модов. Программируемый
С появлением игр типа Quake II, разработчики обратились к созданию легко расширяемых игр. Весь код Quake II был в DLL, которые грузились во время загрузки игры. ID Software (разработчики Quake) выложили исходники, позволив любому изменить оружие, аспекты процесса игры, физику и, что наиболее важно (для нас), искусственный интеллект.
Изменять ИИ для игр такого типа относительно легко, начиная с изменения значения параметров, изменения функциональных возможностей ИИ и заканчивая внедрением новых особенностей ИИ.
На скриншоте один из результатов моего Quake II mod, который улучшен в плане искусственного интеллекта, весьма значительно. На нем вы видите солдата, подпрыгнувшего над выстрелом, нацеленного ему в ноги, и стреляющего при этом. Этот мод имеет следующие параметры:
- Уворачивание. Враг уворачивается, только когда необходимо.
- Некоторые враги подпрыгивают, когда выстрелы направлены им в ноги.
- Монстры могут плавать. По умолчанию монстры в Q2 не плавают,
- монстры не будет стрелять, когда один из них – мешает обстрелу.
- Экспериментировал со взрывчаткой.
- Экспериментировал с алгоритмами поиска пути.
Уворачивание просто требовало подбора числа. В конечном счете я научился вычислять время, требуемое для уворачивания от выстрела. Что означает, что стало очень трудно уничтожить кого-нибудь из бластера.
Функция прыжка появилась несколько позже, когда я стал более свободно разбираться в исходных текстах, так как нужно было изменить игровые структуры. Я использовал мультипликацию от уворачивания, но запустил врагов в воздух, чтобы прыжок был более реалистичным! Так как враги стали после этого увертываться, прыгать и отступать после атаки игрока, первый уровень стал очень труднопроходимым, без дополнительного оружия.
Плавание также требовало много модификаций, так как большинство монстров не умеют плавать. Так, я нашел, что монстры после попадания в воду не двигались, пока они не поражали пол. В общем я добавил специальный флажок, что разрешило им плавать и ходить по земле!
Изменяя ИИ вы можете получить абсолютно непохожую на оригинал игру. Другие игры типа Unreal, HalfLife и Quake III также позволяют изменять код. Так что, если у вас есть, какая-нибудь из этих игр и вы знаете C/C++ - модифицируйте их на здоровье! (ну а мы как-нибудь на Delphi перебьемся ;) )
С нуля...
Настольные игры - превосходный выбор для написания ИИ, так как они имеют очень простую графику (которая может многократно использоваться в других играх) и правила - необходимую часть ИИ. Вот некоторые из настольных игр, с указанием уровня сложности реализации ИИ:
- Pente (средний)
- Крестики-Нолики (легкий)
- Othello (легче среднего)
- Шашки (средний)
- Шахматы (тяжелый)
- Connect 4 (легкий)
- Go (тяжелый)
- 3D Крестики-Нолики (легче среднего)
Написание настольных игр - наилучший путь к изучению принципов искусственного интеллекта, так как довольно сильные противники могут быть созданы, через использование простой эвристики (см. Простой ИИ Настольной игры) без использования сложных методов. Можно расширить ИИ игры "игровыми деревьями" и "минимаксным" алгоритмом. Выгодное отличие в создании игры с нуля это, то что вы сами решаете насколько простым или сложным будет алгоритм, и вы можете постоянно менять его. Конечно, написание любой игры может утомить, поэтому не ставьте перед собой заоблачные планы. Будет гораздо интереснее добавлять и расширять возможности работающей игры, чем ковыряние в супер алгоритме незаконченной пре-альфы.
|