Читайте также:
|
|
(А) Атака 5% (П)Преследование 60% (С)Случайное 20% (Р)Роение 10% (Ш)Шаблон 5%
Как вы можете судить по распределению вероятностей, Аннигилятор преимущественно атакует, Хныкалка предпочитает преследование, а Умник -что-то среднее между ними. Прежде чем перейти к разговору о реализации вероятностей, я хочу поговорить еще об одном принципе поведения игровых объектов — о роении. Роение означает, что создания в игре сбиваются в кучи и пытаются как-то сгруппироваться. Это похоже на то, как настоящие солдаты или насекомые иногда стремятся собраться вместе и остаться рядом друг с другом.
В действительности, это не что иное, как выбор общей точки встречи и целеустремленное движение к ней. Мы можем использовать такой тип поведения как совершенно новое состояние, при котором создания кажутся группирующимися.
Моделирование этого состояния не очень сложно:
§ Выбрать существа, которые вы хотите сгруппировать вместе;
§ Выбрать среднюю относительно всех созданий позицию. Эта точка в пространстве является центром и может быть использована для вычисления траекторий движения всех объектов, которые следуют к ней;
§ Вычислить траекторию так, чтобы каждое создание следовало к центру.
В состояние роения имеет смысл переходить, когда слишком много противников вдруг начинают одновременно изрыгать огонь, торпеды и прочие средства уничтожения. Наверное, логичнее всего объединять существ по типам. Посмотрим на рисунок 13.6, на котором показано геометрическое представление роения.
Теперь перейдем к тому, как мы могли бы составить справочные таблицы вероятностей. Давайте посмотрим на наш игровой «мозг», изображенный на рисунке 13.7, с другой стороны.
У нас есть высокоуровневое управление состоянием, которое инициирует новые состояния, основываясь на состоянии окружающей среды и вероятности Это новое состояние является «задействованным вовне» с помощью низкоуровневого управления состоянием, которое, в конечном итоге, является аналогом моторной доли человеческого мозга. Теперь мы двигаемся к тому, чтобы добавить еще один уровень к «мозгу». Этот новый уровень принимает во внимание и состояние окружающей среды, и распределение вероятности. Отдельное распределение вероятности может существовать для каждого создания так что мы можем получить много разных «личностей» с одной и той же общей архитектурой «двигательного центра». Существуют миллиарды путей составления справочных таблиц вероятности. Вам нужно перечислить все состояния которые есть в игре. К примеру, будем использовать те, которые мы уже имеем.
Вот они:
§ Преследование;
§ Уклонение;
§ Случайное;
§ Шаблон;
§ Роение;
§ Неподвижность.
Я добавил еще состояние «неподвижности», под которым подразумеваю полное бездействие противника. Это состояние может показаться не интересным, но в результате враг выглядит так, будто он думает, или поджидает игрока, чтобы сделать выпад. Это создает в игре некоторое напряжение и беспокойство.
Нам необходимо определить переменные состояния окружающей среды, которые управляют нашими решениями. С этой целью можно задать две переменные:
§ Дистанция до игрока;
§ Состояние и вооружение игрока: стреляет или нет.
Теперь можно построить таблицы вероятностей. Чтобы сделать это, заполним массивы цифрами от 1 до 6, которые представляют различные состояния. У нас получится таблица из 20 элементов. Для выбора состояния проиндексируем таблицу случайными числами от 0 до 19. Конечно, когда мы выбирай случайное число таким способом, как показано здесь:
sel= rand()%20
числа от 0 до 19 получаются равноценными. Возникает вопрос, как сделать так, чтобы переключение в то или иное состояние происходило чаще или реже? Иначе, что вам делать, чтобы заполнить таблицу тем распределением вероятностей которое вы желаете. К примеру, если вы хотите получить 50% преследования вам необходимо поместить в таблицу 10 единиц. Если роение должно составлять 20%, то вам необходимо занести в таблицу четыре пятерки. Начало вашей таблицы выглядело бы примерно так:
int table_1[20] = {1,1,1,1,1,1,1,1,1,1,5,5,5,5,... остальные_состояния}
С точки зрения математики мы используем переменную, которая имеет равное распределение вероятности от 0 до 19, чтобы переиндексировать таблицу, которая представляет собой функцию плотности вероятности, где элемент индексирует следующее состояние.
Я надеюсь, что вы понимаете, о чем идет речь, но даже если нет, то поверьте мне - все, о чем мы говорим, довольно круто! Теперь, когда вы видите форму справочных таблиц, мы можем поговорить насчет выбора состояний. Как вы видели в программе «Умная муха» (Листинг 13.4), дистанция до игрока и случайные числа были использованы для выбора следующего состояния. Мы подошли к тому, чтобы сделать для этого же значительно больше. Мы будем учитывать как дистанцию, так и вооружение игрока для выбора одной из двух плотностей вероятности: одна используется, когда противники далеко, а другая - когда они близко.
При таком подходе всеми врагами используется только одна модель «характера», но, внося разнообразие в «индивидуальность» противников, мы без особых дополнительных затрат заметно обогатим игру. Такой алгоритм показан ниже.
Дата добавления: 2015-07-12; просмотров: 187 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Листинг 13.4. Умная «Муха» (BFLY.C). | | | Алгоритм 13.6. Использование плотности вероятностей в выборе состояния. |