Главная » Документация » Практическое руководство по AI

RSS

Практическое руководство по AI

Гибкость

Очень важно, чтобы алгоритм искусственного интеллекта был гибким. На чем большее число модулей вы разобьете его, тем легче вы сможете расширить их впоследствии. Необходимо понимать, что создание AI – это многократный, итеративный процесс, вам следует тщательно проверить некоторые вещи, а уже потом строить что-то из них.

Основная задача заключается в конструировании AI, который управляет юнитами так, что они реагируют на все, происходящее в игровой среде правдоподобно. Если вы сразу же ограничитесь только тем, что будут делать юниты, а что не будут, потом будет затруднительно расширить возможности их интеллекта и поведения, когда вы почувствуете, что необходимо сделать все реалистичней.

Юниты

В игре, где пользователь управляет юнитами, очень важно обладать полезной и хорошо выстроенной информацией о них. Без этого игроку будет трудно разобраться, как управлять этими боевыми единицами, и от этого пострадает как интерфейс, так и сама игра. Если игрок не чувствует управления и не получает надлежащую информацию, его действия превратятся в бесконечные щелчки мышки, а все возможности игры будут не замечены. Пользователь не получит удовольствия, и программа будет потеряна.

Анатомия

Чтобы понять, какого рода информацию можно предоставить игроку, давайте взглянем на простую структуру данных.

1
2
3
4
5
6
7
8
9
10
11
12
13
type
 
TCharacter = packed Record
  Pos: TPoint; // Позиция на карте
  screenX, screenY:integer;// Позиция на экране
  animDir, animAction, animNum:integer;// Информация о анимации, количестве кадров и текущем кадре
  rank:integer;// Звание
  health:integer;// Здоровье
  num:integer;// Номер юнита
  group:integer;// Номер группы
  style:integer;// Тип юнита (эльф, человек)
  AnimationObject: TAnimObj; // Анимация объекта (для сложных анимаций)
end;

А теперь некоторые пояснения:

Переменная pos определяет положение боевой единицы в игровом мире, screenX, screenY очень полезны, если вы хотите, чтобы рядом с юнитом был, к примеру, индикатор здоровья.

animDir, animAction и animNum отвечают за состояние анимации юнитов, которые выводятся на экран.

Переменные rank и health в объяснении не нуждаются и легко догадаться, для чего они нужны.

Переменная num – номер боевой единицы в главном массиве юнитов. Позже, запрашивая информацию о юните из его группы, иногда полезно выяснить, какой это юнит, не получая адрес структуры в ОЗУ.

group определяет, к какой группе боевая единица принадлежит, поскольку почти всегда любой юнит принадлежит к какой-нибудь группе. Юнит не принадлежит

style и animObj содержат дополнительную информацию о том, как спрайт юнита должен быть нарисован.

Построение

После того, как вы составили скелет алгоритма, такой как выше, с простыми юнитами, настало время сделать что-то еще, чтобы их оживить.

Продумайте, какие реакции и действия вы хотите, чтобы ваши юниты выполняли. Может быть сделать, чтобы ими управляли эмоции? Чтобы они спасались? Убегали? Нападали, как сумасшедшие?

Если да,то добавление переменных, определяющих эмоциональное состояние – это следующий шаг. Представьте себя на месте этих юнитов, тогда будет легче всего определить, какие компоненты следует добавить. Чтобы создать реакции, подобные человеку, сравнивайте, как бы поступил человек.

Можно поступить по-другому – совсем наоборот – не основываться на человеческих реакциях. Рассматривать искусственный опыт, не основанный на реальности. Вместо того, чтобы лепить интеллект из инстинктов, прийдется придумать, как юниты будут реагировать. Дело в том, что необходимо будет продумать каждую мелочь, иначе наскучившие одинаковые реакции будет очень легко предсказать. Эти особенности могут похоронить даже хорошую игру, поэтому думать надо долго.

Разбиение на группы

Группировать или не группировать?

Если вы создаете игру с единственным персонажем под управлением пользователя, то, естественно, группировать вам не к чему. Однако, в игрушках типа RTS или тех, в которых игрок управляет несколькими юнитами одновременно, возникает вопрос.

А хотите ли вы, чтобы юниты действовали согласованно?

Если да, то разбиение на группы – хороший выбор. Если нет – все равно могут появиться некоторые приемущества – решайте сами. Нет сомнения, что ответ на вопрос будет зависеть главным образом от того, как должны, по вашему мнению, действовать боевые единицы.

Страницы : 1 2 3 4 5