Civilization и Total War

 

Имя
Пароль  
Забыли пароль?
Регистрация


CIVru.com / "Совет по концепции" - "Мозговой штурм" / Программирование ИИ
<< . 1 .  . 3 . >>   Версия для печати . Вверх
Автор Сообщение
fantakt
Участник



Репутация: 2529700(???)

# Дата: 13 Апр 2006 11:01:48 Цитата

el_kamikaze А форум и сайт тоже один человек делал? Картинки впечатляют. Сейчас качаю, посмотрю, запуститься ли. А как долго это делалось "одним человеком"?

Murick
Участник



Репутация: 3094240(???)
# Дата: 13 Апр 2006 13:54:02 Цитата

el_kamikaze
Да, картинки впечатлили

el_kamikaze
Участник


Репутация: 2261580(???)
# Дата: 14 Апр 2006 01:13:55 Поправил: el_kamikaze Цитата

Чуть больше года. Там на самом деле не все его, но бОльшая часть. К тому же это стартовый проект - т.е. вообще первый. Все расходы на проект свелись к покупке лицензии для навесной защиты Themida, оплате сайта и прочим мелочам. Если бы не это, проект был бы с нулевым бюджетом. Если понадобится лечилка для версии 0.713 - ко мне в приват. Или платите $25, что вобще-то было бы лучше Подмигивание

ЗЫЖ это все к вопросу о невозможности анимации в любительских условиях. Таких проектов масса, это всего лишь один из них. Вообще игровая анимация очень проста - ибо она в большинстве случаев довольно стандартна. Если, конечно, вам не нужно делать сюжетную анимацию, вроде как в Final Fantasy. Берете стандартные анимационные библиотеки, загоняете в Character Studio какой-нить или A:M, и немного хуманизируете под ситуацию.

fantakt
Участник



Репутация: 2529700(???)

# Дата: 14 Апр 2006 10:48:47 Поправил: fantakt Цитата

Теперь ждем комментарии Деймона и Йорика... el_kamikaze спасибо за консультацию и интересный пример. А игруля забавная. Модельки, города, переход на большую карту и движение юнита по ней между городами (то, что могло бы нам пригодиться)

Yorick
Реал-цивер


Репутация: 1994060(???)
# Дата: 14 Апр 2006 11:37:00 Цитата

Комментарий простой: мне лично анимация и нафиг не нужна. А вот того, что стоило бы разрекламировать в 1ю очередь - в чем эта игруля СТРАТЕГИЧЕСКИ лучше других - я под ворохом литературщины так и не разглядел.

Вот уже и СВК для Цив4 С ИСХОДНИКАМИ вышел - а толку? Кто будет перелопачивать чужую, НЕОПРАВДАННО перегруженную всякими 3Д и анимациями, и бедную стратегически игру?!

Deimon
Кибердемон



Репутация: 2574090(600)
# Дата: 14 Апр 2006 11:46:17 Цитата

fantakt:Теперь ждем комментарии Деймона и Йорика.
Пока никаких комментов. У меня на работе бурный секс с банком-заказчиком... =(

fantakt
Участник



Репутация: 2529700(???)

# Дата: 14 Апр 2006 11:54:50 Цитата

Yorick:под ворохом литературщины Это ты о чем? Пример приведенный el_kamikaze - не более,чем пример анимации, созданный 1 челом. К тому же это не стратегия. Мы же терпеливо ждем, когда Деймон дойдет до оргазма и вернется к нам.

Murick
Участник



Репутация: 3094240(???)
# Дата: 14 Апр 2006 12:12:01 Цитата

Yorick:и бедную стратегически игру?!
Эт ты не подумав ляпнул. По богатству стратегий она превосходит все предыдущие Цивы. имхо

recon
Участник



Репутация: 2641710(???)

# Дата: 14 Апр 2006 17:21:02 Поправил: recon Цитата

Еще об иерархическом ИИ (Информация к размышлению)
------------------------------------
Идея использования иерархического ИИ в походовых стратегиях была предложена главразрабом "The Clash of Civs" Mark Everson'ом, который сам эту идею позаимствовал у некоего Andrew Luppnow (здесь).
Сам принцип такого ИИ заключается вот в чем.
Система принятия решений распределяется по уровням, от высшего к низшему. Чем ниже уровень, тем детальней инфа, которой ИИ распологает, и которую соответственно передает вверх. Чем выше уровень ИИ, тем более общий вид будет иметь, доступная ему в данный момент инфа, и тем более масштабные решения он способен принять. (Оба автора, кстати, проводят аналогию с системой сбора информации и передачи приказов в армии: от генерала до рядового). Т.е. ИИ верхнего эшелона ("генералитет" т.ск. ) принимает решения "что-если", то ИИ низшего ранга ("рядовые" ) просто выполняют приказы.
Mark Everson предлагает следующую схему принятия решений для компьютерного ИИ:
1. Генеральная стратегия (напр. "Полет в космос" ) - определяется в начале игры.
| (нисходящий поток "приказов" - напр. ускорить н.-т. развитие)
V
2. 100-ходовая стратегия для достижения цели (напр. исследование тех, которые приведут к космическим полетам)
| (приказы (изучить "Гравитацию" ) ^ (восходящий поток информации)
V |
3. 10-ходовая политстратегия (дипломатия, военное дело, экономика)
| ^
V |
4а. Генеральная военная стратегия(<10 ходов) 4б. Дипломатический ИИ 4в. Экономический ИИ
| ^
V |
5. ИИ военного театра действий (<5 ходов)
| ^
V |
6. оборонительный/наступательный ИИ (<5 ходов) (общий характер действий)
| ^
V |
7. конкретные задачи (1-2 хода) ( атаковать/обороняться/отступать )

A. Luppnow утверждает, реализовать такой ИИ можно и нейронными сетями, и нечеткой логикой и т.д.
M. Everson предпочитает генетические алгоритмы.

fantakt
Участник



Репутация: 2529700(???)

# Дата: 14 Апр 2006 17:42:07 Цитата

Еще было бы неплохо, раз уж мы говорим об ИИ, все же ввести компьютерных игроков и дать каждому свой уровень сложности и развития интелекта. В Галактик Цивилизэйшн это решено просто, есть пакет файлов с описанием ИИ и в начале игры можно каждой комп.нации дать направленность от "очень доброго" до "очень злого". И нормально работает. И работает. Не помню, в СТР такое было или нет?

recon
Участник



Репутация: 2641710(???)

# Дата: 14 Апр 2006 17:50:35 Цитата

fantakt:Еще было бы неплохо, раз уж мы говорим об ИИ, все же ввести компьютерных игроков и дать каждому свой уровень сложности и развития интелекта. В Галактик Цивилизэйшн это решено просто, есть пакет файлов с описанием ИИ и в начале игры можно каждой комп.нации дать направленность от "очень доброго" до "очень злого". И нормально работает. И работает. Не помню, в СТР такое было или нет?
Изменение характеристик ИИ по ходу игры, в зависимости от ситуации, было бы прикольней, и ближе к жизни.

fantakt
Участник



Репутация: 2529700(???)

# Дата: 14 Апр 2006 18:13:28 Цитата

Самообучающийся? И кто его напишет? Можно сразу в Нобелевский комитет заявку подавать Улыбка

recon
Участник



Репутация: 2641710(???)

# Дата: 14 Апр 2006 21:23:10 Цитата

fantakt:Самообучающийся?
Нет, не обязательно. Кроме того, эвристические системы и нейронные сети давным давно уже не редкость даже в играх.

el_kamikaze
Участник


Репутация: 2261580(???)
# Дата: 15 Апр 2006 00:35:15 Цитата

recon:Кроме того, эвристические системы и нейронные сети давным давно уже не редкость даже в играх.
Кстати согласен. Самообучение это пока миф, но адаптацию под стиль вполне можно. Экспертную систему можно вполне себе сделать - хотя б высокоуровневую. Только возни много. А Нобелевский комитет тут ни при чем.

recon
Участник



Репутация: 2641710(???)

# Дата: 16 Апр 2006 01:07:51 Цитата

В тему об ИИ.
На www.dtf.ru лежит любопытная статья о том как "очеловечить" ИИ комьютерного противника.
Создание AI в играх с помощью матриц

Yorick
Реал-цивер


Репутация: 1994060(???)
# Дата: 16 Апр 2006 12:05:23 Цитата

recon, спасибо за наводку на интересную статью и интересный сайт. Сайт слишком серьезный, попытался я на нем зарегиться - иначе не могу прочитать даже отзывы о статье, посмотрю, что из этого получится.

Статью я бегло пробежал - в детали вдаваться не хочется, и сложно - я ведь не геймдев. Сама идея понятна и так - мы ведь об этом, по сути о тех же бильярдных шарах Улыбка давно говорим, и отом, что у каждого шара-юнита д.б. своя психология, или хотя бы интстинкт самосохранения тоже. И о том, что каждый шар-юнит должен знать только то, что он знал бы в реале.

Но остается главная, базовая проблема, без которой не то что не сделать игру нового поколения, а даже не повторить Цив1: как заинтересовать (в коммерческом смысле) фирму-разработчика. Пока мы с этой проблемой, увы, не справились. Остается надеяться на энтузазистов.

recon
Участник



Репутация: 2641710(???)

# Дата: 17 Апр 2006 09:55:09 Цитата

Yorick:recon, спасибо за наводку на интересную статью
Улыбка You're welcome!

fantakt
Участник



Репутация: 2529700(???)

# Дата: 17 Апр 2006 19:24:02 Поправил: fantakt Цитата

Особенно интересен конец статьи с описанием возможностей по принятию решения. Карта "в духе Йорика", возможность отступления... Сразу рождается новая тактика - "выдавливание противника с территории превосходящими силами". Потом наступает равновесие и один из игроков нападает... Хм, чем-то мне это напоминает брянский мод "История войн"... Может они тоже эту статью читали...

Aku_Aku
Участник



Репутация: 1271430(???)
# Дата: 31 Май 2006 23:31:38 Цитата

Поделюсь тут своими мыслями, поскольку давно интерисуюсь ИИ ( в широком смысле, а не только в геймах)

ИИ это просто.. Подмигивание и о-о-очень сложно

еще в Н-ацатом году гражданин Дуглас Ленат (Doug Lenat )
продемонстрировал програму (EURISCO) которая САМА могла генерировать стратегии и применять их на практике
что и продемонстрировала во время соревнования.. отсылаю вас самих найти эту историю

правда сам Ленат по видимому не понял ЧТО он создал -- прототип настоящего ИИ, и потому занялся очень впечатляющей но чисто академической разработкой -- CYC

так что реального продвижения в ИИ нужно еще подождать,
а покамест остаеться только старый проверенный метод -- написание скриптов
(вообще все существующие реализации ИИ в геймах -- суть скрипты)

сама тема ИИ очень интересная, так что прошу заинтерисовавшихся обращаться в чат ICQ:339413786

так что покамест щитаю более прагматичным подход
(читай мою тему -- "Бредовое поведение. возможные решения"Подмигивание
разработки ПРАВИЛ для игры типа человек-человек

ИМХО такая концептуальная бритва позволит сформулировать таки ЕДИНУЮ идею

KVEbek
Участник



Репутация: 2657190(???)
# Дата: 1 Июн 2006 01:48:58 Цитата

Искусственный интеллект
(Искусственный интеллект - by {LIS}, Просмотров: 112)
Человеческий разум представляет собой бездну, заполненную прошлым, настоящим и будущим. Он осознает свое собственное существование и является в известном сиысле всего лишь устройством с возможностью самоорганизации и способностью задавать вопросы о своем самоощущении. Вычислительная техника находится на пороге понимания механизмов мысли, памяти и сознания. Однако нам, как программистам компьютерных игр, на самом деле не нужно быть слишком искушенными в создании разумно мыслящих систем. Существа в наших играх должны только производить впечатление, что они способны мыслить самостоятельно. В этой части мы избороздим те воды, которые и до сих пор отсутствуют на картах даже самых передовых видеоигр. Мы обсудим темы, в коих область от практического до теоретического полностью изотерична. Несмотря на это, комплекс мыслящих моделей может быть получен даже с минимальными знаниями. Эти модели будут способны самостоятельно выполнять такие простейшие задачи, как сражение, поиск и уклонение.

Мы обсудим следующие темы:
- Обзор того, как мыслят видеоигры;
- Алгоритмы Преследования и Уклонения;
- Шаблонные мысли;
- Случайные передвижения;
- Автоматы с конечными состояниями;
- Вероятностные автоматы;
- Память и обучение;
- Алгоритмы Поиска;
- Теория игр.

КАК МЫСЛЯТ ВИДЕОИГРЫ: ОБЗОР

Придет тот день, когда компьютер станет таким же серьезным собеседником, как и лучшие человеческие умы. Однако сегодняшние компьютеры (по крайней мере, ПК) не обладают сложностью, необходимой для инициации мыслей и творческих процессов.Но на самом деле нас это и не должно волновать! Мы же делаем видеигры, а не андроидов. В игре у нас присутствуют некоторые создания и объекты. Все, что нам нужно сделать, это придать им видимость способности разумного мышления. Играющий может ощущать себя помещенным на короткое время в некое пространство, где он думает, что вражеская атака на корабль реальна! Для осуществления этих целей мы должны проанализировать, каким разумом мы должны наделить наши игровые объекты. Сложность этого "разума" зависит от того, какую разновидность существ мы конструируем. К примеру, создания из Pac Man большую часть своего времени тратят на преследование или убегание от вас. Будь мы теми людьми, что написали Pac Man, мы имели бы возможность загорать где-нибудь на Гавайях, но у нас в таком случае уже был бы алгоритмический инструмент для осуществления этих преследований и убеганий.

С другой стороны, если бы мы создавали видеоигры, подобные "Космическим Захватчикам", придание видимости интеллекта вряд ли потребовало бы более пары дюжин строк в программе. Псевдокод выглядел бы примерно так:

1. Продолжать движение в том направлении, в котором вы двигаетесь (вправо или влево);

2. Когда вы попадете на границу экрана, изменить направление и двигаться вдоль оси высоты;

3. перейти к п.1.

Не шибко обширный набор "интеллектуальных" функций для игры, прибыль от которой за все время ее существования составила от 50 до 100 миллионов долларов. Трехмерные видеоигры нам интересны не потому, что они "умнее" обычных "плоских" игр. Объемность дает только повышенное ощущение реальности, а алгоритмы, наделяющие персонажей разумом, в них те же, что и в двухмерных играх. К примеру, Terminator Rampage имеет действительно несложную систему искусственного интеллекта, примерно того же уровня сложности, что и в Pac Man. Однако, при наличии трехмерной графики вместе с изощренным звуком существа в ней кажутся вполне одушевленными. Итак, приведем к общему знаменателю характер большинства компьютерных игр: интеллект персонажей находится на пещерном уровне, но этот недостаток компенсируется за счет графики и звука. Разработчиков видеоигр идея искусственного интеллекта притягивает снова и снова на протяжении длительного времени, потому что игры, которые они пишут, в большинстве своем довольно агрессивны. Наша задача в этой части состоит в том, чтобы понять методы, используемые для моделирования интеллекта, и главные критерии, внутри которых существуют "мыслящие" алгоритмы. Запомните, игры не думают. Они только "делают умное лицо". Посему большую часть времени мы будем конструировать основной разумный вид деятельности вроде преследования и нападения. Как вы догадываетесь, на это большого ума не надо: обнаружить противника и уничтожить его, или, с точки зрения компьютерной программы, двигаться по направлению к врагу, взять его на мушку и открыть огонь из всех видов оружия.

АЛГОРИТМЫ ПРЕСЛЕДОВАНИЯ И УКЛОНЕНИЯ

Итак, начнем. Наиболее простыми игровыми алгоритмами искусственного интеллекта являются так называемый Алгоритм Преследования и его противоположность - Алгоритм Уклонения. В основном, они заставляют игровой объект или догонять игрока, или убегать от него. Конечно, конфигурация игрового пространства также должна учитываться, чтобы преследователь даже и не пытался пройти сквозь стены. Давайте рассмотрим процесс, моделирующий погоню некоторого существа за игроком. ,h4> Преследование
------------------------------------
Во-первых, нам необходимо знать расположение обоих объектов. У нас есть эти данные, так как мы знаем координаты игрока и игрового объекта, являющегося врагом. Во-вторых, нам необходимо сконструировать алгоритм, который будет управлять поведением врага, преследующего игрока. Алгоритм 13.1 делает именно то, что мы от него и хотим:

Алгоритм 13.1. Алгоритм Преследования.
------------------------------------

// Предположим, что px,py - координаты игрока,
// ex,ey - координаты противника

while ( игра )
{
программный код
......
......
// Вначале рассматриваем перемещение по горизонтали (ось Х)
if ex > px then ex=ex+1
if ex py then ey=ey+1
if ey
- Если враг находится справа, то есть его Х-координата больше соответствующей коондинаты игрока, преследователь уменьшает свою собственную позицию по оси Х на единицу и тем самым приближается к игроку. Если же противник находится левее игрока, он, наоборот, увеличивает свою горизонтальную координату.

- Та же самая логика применима и к перемещению по вертикали.

Используя этот алгоритм, противник преследует игрока почти столь же неумолимо, как и Т1000 из Терминатора-2. Он не остановится до тех пор, пока не поймает игрока. Мы могли бы несколько облегчить его задачу путем добавления некоторой дополнительной логики, способствующей его движению к позиции нанесения удара. Однако, перед тем, как это делать, давайте посмотрим программу, моделирующую преследование. Листинг программы 13.1 рисует 2 точки: одну голубую (вы), а другую красную(противник). Что бы вы ни предпринимали, красная точка пытается настичь вас. Для движения (или, я бы сказал, бега!) нажмите клавишу U - перемещение вверх, N - вниз, H - влево и J - вправо. Для выхода из программы нажмите Q.

Листинг 13.1. Программа Терминатор (TERM.C).
// I N C L U D E S////////////////////////////////////////////////////////////

#include
#include


// G L O B A L S /////////////////////////////////////////////////////////////

unsigned int far *clock = (unsigned int far *)0x0000046C;// pointer to internal
// 18.2 clicks/sec

//////////////////////////////////////////////////////////////////////////////

Timer(int clicks)
{
// this function uses the internal time keeper timer i.e. the one that goes
// at 18.2 clicks/sec to to a time delay. You can find a 32 bit value of
// this timer at 0000:046Ch

unsigned int now;

// get current time

now = *clock;

// wait till time has gone past current time plus the amount we eanted to
// wait. Note each click is approx. 55 milliseconds.

while(abs(*clock - now) ex) ex++;
if (px ey) ey++;
if (py
Листинг 13.1 показывает как просто сконструировать набор действий, кажущихся на вид разумными. Но на самом деле, прежде чем мы получим полноценный искусственный интеллект, эти строки программы должны претерпеть массу усовершенствований.

Уклонение

Пока мы еще не ушли слишком далеко в наших рассуждениях, продолжим нашу дискуссию разговором о явлении прямо противоположном преследованию - об уклонении. Чтобы сконструировать создание, уклоняющееся от игрока, нам нужно сделать в точности противоположное предыдущим действиям. Алгоритм 13.2 в общих чертах показывает это. Алгоритм 13.2. Алгоритм Уклонения.
// пусть (px,py) - позиция игрока и (ex,ey) - позиция противника
while (игра)
{

.....// код программы

// Вначале - горизонтальная составляющая перемещения
if ex > px then ex=ex-1
if ex py then ey=ey-1
if ey
В этом месте я еще раз хочу заострить ваше внимание на том, что игры не думают. Персонажи в них только совершают несложные эволюции в пространстве и времени, да определенным образом реагируют на окружающую обстановку и действия игрока. (Некоторые ученые считают, что люди - это не что иное, как набор действий и реакций.)

А теперь перейдем к следующей теме и обсудим такое понятие, как "шаблонные мысли".

Шаблонные мысли

На заре создания видеоигр программисты сталкивались с серьезными проблемами, пробуя нанести точки на экран. Они радовались по поводу удачной имитации тактики боя и написания набора алгоритмов, управляющих существами в их мире. Увы, они думали, что могут имитировать разумное поведение с помощью шаблонов, то есть описывая рядом цифр траектории перемещения созданий. К примеру, в игре Galaxian маленькие космические корабли делают несколько кругов, стреляют в вас некоторое время, а затем возвращаются на прежнее место в стаю своих сородичей. Посмотрим на рис.13.1. Когда они выполняют эти движения, то всего лишь следуют командам, заранее написанных шаблонов. Конструирование шаблонов - чрезвычайно легкое занятие и они нашли использование во многих сценариях. Как пример, используем шаблоны и случайные числа для моделирования "разума", который можно использовать, например, для управления небольшим космическим кораблем. Он пытается уклониться от вас, и в то же время пробует прицельно стрелять. То, что можно для э

KVEbek
Участник



Репутация: 2657190(???)
# Дата: 1 Июн 2006 01:51:51 Цитата

Искусственный интеллект
(Искусственный интеллект - by {LIS}, Просмотров: 112)
Человеческий разум представляет собой бездну, заполненную прошлым, настоящим и будущим. Он осознает свое собственное существование и является в известном сиысле всего лишь устройством с возможностью самоорганизации и способностью задавать вопросы о своем самоощущении. Вычислительная техника находится на пороге понимания механизмов мысли, памяти и сознания. Однако нам, как программистам компьютерных игр, на самом деле не нужно быть слишком искушенными в создании разумно мыслящих систем. Существа в наших играх должны только производить впечатление, что они способны мыслить самостоятельно. В этой части мы избороздим те воды, которые и до сих пор отсутствуют на картах даже самых передовых видеоигр. Мы обсудим темы, в коих область от практического до теоретического полностью изотерична. Несмотря на это, комплекс мыслящих моделей может быть получен даже с минимальными знаниями. Эти модели будут способны самостоятельно выполнять такие простейшие задачи, как сражение, поиск и уклонение.

Мы обсудим следующие темы:
- Обзор того, как мыслят видеоигры;
- Алгоритмы Преследования и Уклонения;
- Шаблонные мысли;
- Случайные передвижения;
- Автоматы с конечными состояниями;
- Вероятностные автоматы;
- Память и обучение;
- Алгоритмы Поиска;
- Теория игр.

КАК МЫСЛЯТ ВИДЕОИГРЫ: ОБЗОР

Придет тот день, когда компьютер станет таким же серьезным собеседником, как и лучшие человеческие умы. Однако сегодняшние компьютеры (по крайней мере, ПК) не обладают сложностью, необходимой для инициации мыслей и творческих процессов.Но на самом деле нас это и не должно волновать! Мы же делаем видеигры, а не андроидов. В игре у нас присутствуют некоторые создания и объекты. Все, что нам нужно сделать, это придать им видимость способности разумного мышления. Играющий может ощущать себя помещенным на короткое время в некое пространство, где он думает, что вражеская атака на корабль реальна! Для осуществления этих целей мы должны проанализировать, каким разумом мы должны наделить наши игровые объекты. Сложность этого "разума" зависит от того, какую разновидность существ мы конструируем. К примеру, создания из Pac Man большую часть своего времени тратят на преследование или убегание от вас. Будь мы теми людьми, что написали Pac Man, мы имели бы возможность загорать где-нибудь на Гавайях, но у нас в таком случае уже был бы алгоритмический инструмент для осуществления этих преследований и убеганий.

С другой стороны, если бы мы создавали видеоигры, подобные "Космическим Захватчикам", придание видимости интеллекта вряд ли потребовало бы более пары дюжин строк в программе. Псевдокод выглядел бы примерно так:

1. Продолжать движение в том направлении, в котором вы двигаетесь (вправо или влево);

2. Когда вы попадете на границу экрана, изменить направление и двигаться вдоль оси высоты;

3. перейти к п.1.

Не шибко обширный набор "интеллектуальных" функций для игры, прибыль от которой за все время ее существования составила от 50 до 100 миллионов долларов. Трехмерные видеоигры нам интересны не потому, что они "умнее" обычных "плоских" игр. Объемность дает только повышенное ощущение реальности, а алгоритмы, наделяющие персонажей разумом, в них те же, что и в двухмерных играх. К примеру, Terminator Rampage имеет действительно несложную систему искусственного интеллекта, примерно того же уровня сложности, что и в Pac Man. Однако, при наличии трехмерной графики вместе с изощренным звуком существа в ней кажутся вполне одушевленными. Итак, приведем к общему знаменателю характер большинства компьютерных игр: интеллект персонажей находится на пещерном уровне, но этот недостаток компенсируется за счет графики и звука. Разработчиков видеоигр идея искусственного интеллекта притягивает снова и снова на протяжении длительного времени, потому что игры, которые они пишут, в большинстве своем довольно агрессивны. Наша задача в этой части состоит в том, чтобы понять методы, используемые для моделирования интеллекта, и главные критерии, внутри которых существуют "мыслящие" алгоритмы. Запомните, игры не думают. Они только "делают умное лицо". Посему большую часть времени мы будем конструировать основной разумный вид деятельности вроде преследования и нападения. Как вы догадываетесь, на это большого ума не надо: обнаружить противника и уничтожить его, или, с точки зрения компьютерной программы, двигаться по направлению к врагу, взять его на мушку и открыть огонь из всех видов оружия.

АЛГОРИТМЫ ПРЕСЛЕДОВАНИЯ И УКЛОНЕНИЯ

Итак, начнем. Наиболее простыми игровыми алгоритмами искусственного интеллекта являются так называемый Алгоритм Преследования и его противоположность - Алгоритм Уклонения. В основном, они заставляют игровой объект или догонять игрока, или убегать от него. Конечно, конфигурация игрового пространства также должна учитываться, чтобы преследователь даже и не пытался пройти сквозь стены. Давайте рассмотрим процесс, моделирующий погоню некоторого существа за игроком. ,h4> Преследование
------------------------------------
Во-первых, нам необходимо знать расположение обоих объектов. У нас есть эти данные, так как мы знаем координаты игрока и игрового объекта, являющегося врагом. Во-вторых, нам необходимо сконструировать алгоритм, который будет управлять поведением врага, преследующего игрока. Алгоритм 13.1 делает именно то, что мы от него и хотим:

Алгоритм 13.1. Алгоритм Преследования.
------------------------------------

// Предположим, что px,py - координаты игрока,
// ex,ey - координаты противника

while ( игра )
{
программный код
......
......
// Вначале рассматриваем перемещение по горизонтали (ось Х)
if ex > px then ex=ex+1
if ex py then ey=ey+1
if ey
- Если враг находится справа, то есть его Х-координата больше соответствующей коондинаты игрока, преследователь уменьшает свою собственную позицию по оси Х на единицу и тем самым приближается к игроку. Если же противник находится левее игрока, он, наоборот, увеличивает свою горизонтальную координату.

- Та же самая логика применима и к перемещению по вертикали.

Используя этот алгоритм, противник преследует игрока почти столь же неумолимо, как и Т1000 из Терминатора-2. Он не остановится до тех пор, пока не поймает игрока. Мы могли бы несколько облегчить его задачу путем добавления некоторой дополнительной логики, способствующей его движению к позиции нанесения удара. Однако, перед тем, как это делать, давайте посмотрим программу, моделирующую преследование. Листинг программы 13.1 рисует 2 точки: одну голубую (вы), а другую красную(противник). Что бы вы ни предпринимали, красная точка пытается настичь вас. Для движения (или, я бы сказал, бега!) нажмите клавишу U - перемещение вверх, N - вниз, H - влево и J - вправо. Для выхода из программы нажмите Q.

Листинг 13.1. Программа Терминатор (TERM.C).
// I N C L U D E S////////////////////////////////////////////////////////////

#include
#include


// G L O B A L S /////////////////////////////////////////////////////////////

unsigned int far *clock = (unsigned int far *)0x0000046C;// pointer to internal
// 18.2 clicks/sec

//////////////////////////////////////////////////////////////////////////////

Timer(int clicks)
{
// this function uses the internal time keeper timer i.e. the one that goes
// at 18.2 clicks/sec to to a time delay. You can find a 32 bit value of
// this timer at 0000:046Ch

unsigned int now;

// get current time

now = *clock;

// wait till time has gone past current time plus the amount we eanted to
// wait. Note each click is approx. 55 milliseconds.

while(abs(*clock - now) ex) ex++;
if (px ey) ey++;
if (py
Листинг 13.1 показывает как просто сконструировать набор действий, кажущихся на вид разумными. Но на самом деле, прежде чем мы получим полноценный искусственный интеллект, эти строки программы должны претерпеть массу усовершенствований.

Уклонение

Пока мы еще не ушли слишком далеко в наших рассуждениях, продолжим нашу дискуссию разговором о явлении прямо противоположном преследованию - об уклонении. Чтобы сконструировать создание, уклоняющееся от игрока, нам нужно сделать в точности противоположное предыдущим действиям. Алгоритм 13.2 в общих чертах показывает это. Алгоритм 13.2. Алгоритм Уклонения.
// пусть (px,py) - позиция игрока и (ex,ey) - позиция противника
while (игра)
{

.....// код программы

// Вначале - горизонтальная составляющая перемещения
if ex > px then ex=ex-1
if ex py then ey=ey-1
if ey
В этом месте я еще раз хочу заострить ваше внимание на том, что игры не думают. Персонажи в них только совершают несложные эволюции в пространстве и времени, да определенным образом реагируют на окружающую обстановку и действия игрока. (Некоторые ученые считают, что люди - это не что иное, как набор действий и реакций.)

А теперь перейдем к следующей теме и обсудим такое понятие, как "шаблонные мысли".

Шаблонные мысли

На заре создания видеоигр программисты сталкивались с серьезными проблемами, пробуя нанести точки на экран. Они радовались по поводу удачной имитации тактики боя и написания набора алгоритмов, управляющих существами в их мире. Увы, они думали, что могут имитировать разумное поведение с помощью шаблонов, то есть описывая рядом цифр траектории перемещения созданий. К примеру, в игре Galaxian маленькие космические корабли делают несколько кругов, стреляют в вас некоторое время, а затем возвращаются на прежнее место в стаю своих сородичей. Посмотрим на рис.13.1. Когда они выполняют эти движения, то всего лишь следуют командам, заранее написанных шаблонов. Конструирование шаблонов - чрезвычайно легкое занятие и они нашли использование во многих сценариях. Как пример, используем шаблоны и случайные числа для моделирования "разума", который можно использовать, например, для управления небольшим космическим кораблем. Он пытается уклониться от вас, и в то же время пробует прицельно стрелять. То, что можно для э

KVEbek
Участник



Репутация: 2657190(???)
# Дата: 1 Июн 2006 01:53:52 Цитата

Искусственный интеллект
(Искусственный интеллект - by {LIS}, Просмотров: 112)
Человеческий разум представляет собой бездну, заполненную прошлым, настоящим и будущим. Он осознает свое собственное существование и является в известном сиысле всего лишь устройством с возможностью самоорганизации и способностью задавать вопросы о своем самоощущении. Вычислительная техника находится на пороге понимания механизмов мысли, памяти и сознания. Однако нам, как программистам компьютерных игр, на самом деле не нужно быть слишком искушенными в создании разумно мыслящих систем. Существа в наших играх должны только производить впечатление, что они способны мыслить самостоятельно. В этой части мы избороздим те воды, которые и до сих пор отсутствуют на картах даже самых передовых видеоигр. Мы обсудим темы, в коих область от практического до теоретического полностью изотерична. Несмотря на это, комплекс мыслящих моделей может быть получен даже с минимальными знаниями. Эти модели будут способны самостоятельно выполнять такие простейшие задачи, как сражение, поиск и уклонение.

Мы обсудим следующие темы:
- Обзор того, как мыслят видеоигры;
- Алгоритмы Преследования и Уклонения;
- Шаблонные мысли;
- Случайные передвижения;
- Автоматы с конечными состояниями;
- Вероятностные автоматы;
- Память и обучение;
- Алгоритмы Поиска;
- Теория игр.

КАК МЫСЛЯТ ВИДЕОИГРЫ: ОБЗОР

Придет тот день, когда компьютер станет таким же серьезным собеседником, как и лучшие человеческие умы. Однако сегодняшние компьютеры (по крайней мере, ПК) не обладают сложностью, необходимой для инициации мыслей и творческих процессов.Но на самом деле нас это и не должно волновать! Мы же делаем видеигры, а не андроидов. В игре у нас присутствуют некоторые создания и объекты. Все, что нам нужно сделать, это придать им видимость способности разумного мышления. Играющий может ощущать себя помещенным на короткое время в некое пространство, где он думает, что вражеская атака на корабль реальна! Для осуществления этих целей мы должны проанализировать, каким разумом мы должны наделить наши игровые объекты. Сложность этого "разума" зависит от того, какую разновидность существ мы конструируем. К примеру, создания из Pac Man большую часть своего времени тратят на преследование или убегание от вас. Будь мы теми людьми, что написали Pac Man, мы имели бы возможность загорать где-нибудь на Гавайях, но у нас в таком случае уже был бы алгоритмический инструмент для осуществления этих преследований и убеганий.

С другой стороны, если бы мы создавали видеоигры, подобные "Космическим Захватчикам", придание видимости интеллекта вряд ли потребовало бы более пары дюжин строк в программе. Псевдокод выглядел бы примерно так:

1. Продолжать движение в том направлении, в котором вы двигаетесь (вправо или влево);

2. Когда вы попадете на границу экрана, изменить направление и двигаться вдоль оси высоты;

3. перейти к п.1.

Не шибко обширный набор "интеллектуальных" функций для игры, прибыль от которой за все время ее существования составила от 50 до 100 миллионов долларов. Трехмерные видеоигры нам интересны не потому, что они "умнее" обычных "плоских" игр. Объемность дает только повышенное ощущение реальности, а алгоритмы, наделяющие персонажей разумом, в них те же, что и в двухмерных играх. К примеру, Terminator Rampage имеет действительно несложную систему искусственного интеллекта, примерно того же уровня сложности, что и в Pac Man. Однако, при наличии трехмерной графики вместе с изощренным звуком существа в ней кажутся вполне одушевленными. Итак, приведем к общему знаменателю характер большинства компьютерных игр: интеллект персонажей находится на пещерном уровне, но этот недостаток компенсируется за счет графики и звука. Разработчиков видеоигр идея искусственного интеллекта притягивает снова и снова на протяжении длительного времени, потому что игры, которые они пишут, в большинстве своем довольно агрессивны. Наша задача в этой части состоит в том, чтобы понять методы, используемые для моделирования интеллекта, и главные критерии, внутри которых существуют "мыслящие" алгоритмы. Запомните, игры не думают. Они только "делают умное лицо". Посему большую часть времени мы будем конструировать основной разумный вид деятельности вроде преследования и нападения. Как вы догадываетесь, на это большого ума не надо: обнаружить противника и уничтожить его, или, с точки зрения компьютерной программы, двигаться по направлению к врагу, взять его на мушку и открыть огонь из всех видов оружия.

АЛГОРИТМЫ ПРЕСЛЕДОВАНИЯ И УКЛОНЕНИЯ

Итак, начнем. Наиболее простыми игровыми алгоритмами искусственного интеллекта являются так называемый Алгоритм Преследования и его противоположность - Алгоритм Уклонения. В основном, они заставляют игровой объект или догонять игрока, или убегать от него. Конечно, конфигурация игрового пространства также должна учитываться, чтобы преследователь даже и не пытался пройти сквозь стены. Давайте рассмотрим процесс, моделирующий погоню некоторого существа за игроком. ,h4> Преследование
------------------------------------
Во-первых, нам необходимо знать расположение обоих объектов. У нас есть эти данные, так как мы знаем координаты игрока и игрового объекта, являющегося врагом. Во-вторых, нам необходимо сконструировать алгоритм, который будет управлять поведением врага, преследующего игрока. Алгоритм 13.1 делает именно то, что мы от него и хотим:

Алгоритм 13.1. Алгоритм Преследования.
------------------------------------

// Предположим, что px,py - координаты игрока,
// ex,ey - координаты противника

while ( игра )
{
программный код
......
......
// Вначале рассматриваем перемещение по горизонтали (ось Х)
if ex > px then ex=ex+1
if ex py then ey=ey+1
if ey
- Если враг находится справа, то есть его Х-координата больше соответствующей коондинаты игрока, преследователь уменьшает свою собственную позицию по оси Х на единицу и тем самым приближается к игроку. Если же противник находится левее игрока, он, наоборот, увеличивает свою горизонтальную координату.

- Та же самая логика применима и к перемещению по вертикали.

Используя этот алгоритм, противник преследует игрока почти столь же неумолимо, как и Т1000 из Терминатора-2. Он не остановится до тех пор, пока не поймает игрока. Мы могли бы несколько облегчить его задачу путем добавления некоторой дополнительной логики, способствующей его движению к позиции нанесения удара. Однако, перед тем, как это делать, давайте посмотрим программу, моделирующую преследование. Листинг программы 13.1 рисует 2 точки: одну голубую (вы), а другую красную(противник). Что бы вы ни предпринимали, красная точка пытается настичь вас. Для движения (или, я бы сказал, бега!) нажмите клавишу U - перемещение вверх, N - вниз, H - влево и J - вправо. Для выхода из программы нажмите Q.

Листинг 13.1. Программа Терминатор (TERM.C).
// I N C L U D E S////////////////////////////////////////////////////////////

#include
#include


// G L O B A L S /////////////////////////////////////////////////////////////

unsigned int far *clock = (unsigned int far *)0x0000046C;// pointer to internal
// 18.2 clicks/sec

//////////////////////////////////////////////////////////////////////////////

Timer(int clicks)
{
// this function uses the internal time keeper timer i.e. the one that goes
// at 18.2 clicks/sec to to a time delay. You can find a 32 bit value of
// this timer at 0000:046Ch

unsigned int now;

// get current time

now = *clock;

// wait till time has gone past current time plus the amount we eanted to
// wait. Note each click is approx. 55 milliseconds.

while(abs(*clock - now) ex) ex++;
if (px ey) ey++;
if (py
Листинг 13.1 показывает как просто сконструировать набор действий, кажущихся на вид разумными. Но на самом деле, прежде чем мы получим полноценный искусственный интеллект, эти строки программы должны претерпеть массу усовершенствований.

Уклонение

Пока мы еще не ушли слишком далеко в наших рассуждениях, продолжим нашу дискуссию разговором о явлении прямо противоположном преследованию - об уклонении. Чтобы сконструировать создание, уклоняющееся от игрока, нам нужно сделать в точности противоположное предыдущим действиям. Алгоритм 13.2 в общих чертах показывает это. Алгоритм 13.2. Алгоритм Уклонения.
// пусть (px,py) - позиция игрока и (ex,ey) - позиция противника
while (игра)
{

.....// код программы

// Вначале - горизонтальная составляющая перемещения
if ex > px then ex=ex-1
if ex py then ey=ey-1
if ey
В этом месте я еще раз хочу заострить ваше внимание на том, что игры не думают. Персонажи в них только совершают несложные эволюции в пространстве и времени, да определенным образом реагируют на окружающую обстановку и действия игрока. (Некоторые ученые считают, что люди - это не что иное, как набор действий и реакций.)

А теперь перейдем к следующей теме и обсудим такое понятие, как "шаблонные мысли".

KVEbek
Участник



Репутация: 2657190(???)
# Дата: 1 Июн 2006 01:54:13 Цитата

Шаблонные мысли

На заре создания видеоигр программисты сталкивались с серьезными проблемами, пробуя нанести точки на экран. Они радовались по поводу удачной имитации тактики боя и написания набора алгоритмов, управляющих существами в их мире. Увы, они думали, что могут имитировать разумное поведение с помощью шаблонов, то есть описывая рядом цифр траектории перемещения созданий. К примеру, в игре Galaxian маленькие космические корабли делают несколько кругов, стреляют в вас некоторое время, а затем возвращаются на прежнее место в стаю своих сородичей. Посмотрим на рис.13.1. Когда они выполняют эти движения, то всего лишь следуют командам, заранее написанных шаблонов. Конструирование шаблонов - чрезвычайно легкое занятие и они нашли использование во многих сценариях. Как пример, используем шаблоны и случайные числа для моделирования "разума", который можно использовать, например, для управления небольшим космическим кораблем. Он пытается уклониться от вас, и в то же время пробует прицельно стрелять. То, что можно для этого сделать, показано в Алгоритме 13.3.

Алгоритм 13.3. Шаблоны со случайным выбором.
// Предположим, что pattern - это массив, содержащий набор команд
// для реализации десяти различных шаблонов поведения

while (идет игра)
{

.... код программы

// Проверяем, закончена ли обработка текущего шаблона
if (если обработка команд текущего шаблона закончена)
{

// Выбираем новый шаблон
current_pattern = pattern[rand()%10];

позиция противника = старая позиция +
следующий элемент текущего шаблона

Увеличим на единицу значение индекса элементов шаблона

.... код программы

}
Алгоритм 13.3 кажется сложнее предыдущих Алгоритмов Преследования и Уклонения, но на самом деле это не так. В сущности:

- Случайным образом выбирается некоторый шаблон;

- Движение созданий в каждом проходе цикла изменяется в соответствии с направлением, указанным в шаблоне;

- Затем мы переходим к следующему элементу шаблона. Каждый шаблон может включать в себя произвольное количество элементов. Некоторые из них имеют 10 элементов, а иные - 1000.

Важно одно - когда "создание" исчерпывает набор команд, задаваемый одним шаблоном - оно переходит к другому. Наконец, мы могли бы связать выбор случайного номера шаблона с действиями на основе некой другой логики - например, описываемой Алгоритмом 13.1. Добавив к Алгоритму 13.3 последний шаг, мы придали ему некоторый аспект, который придал ему большую комплексность. Появилось подобие мыслительного процесса, состоящего из двух стадий. Случайное число подается на вход селектора шаблонов, который затем выбирает новый шаблон для игры.
+----------------------+
¦ Генератор ¦ 1-й уровень
¦ случайных чисел ¦ (мыслительный)
+-----------+----------+
+--------+---------+
¦ Выбор шаблонов ¦
+------------------+


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

+-----------+ +-----------+ +------------+ 2-й уровень
¦ ¦ ¦ ¦ ¦ ¦ (функции моторики)
¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ... ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦
+-----------+ +-----------+ +------------+
Шаблон 1 Шаблон 2 Шаблон N
Рис.13.2. Использование случайных чисел для выбора шаблона.

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

Для усовершенствования тактики можно добавить измерение расстояния до игрока: если существо находится за пределами некоторого радиуса, используется Алгоритм Преследования, однако, когда оно оказывается достаточно близко, то начинает перемещаться по шаблонным траекториям, выбирая их случайным образом. Эта идея применена в Алгоритме 13.4.

Алгоритм 13.4. Преследование и Танец.
while (идет игра)
{
....код программы

if (игрок вне круга с радиусом 50 точек) then преследуем его
else
выбираем случайный шаблон и реализуем его

.... код программы
}
Для демонстрации использования шаблонов я переработал программу из Листинга 13.1 и привел ее в соответствие с Алгоритмом 13.4. Новая программа показана в Листинге 13.2. Когда враг приближается к игроку, он выбирает один из трех шаблонов и выполняет его до завершения. Далее, в зависимости от расстояния до игрока, противник либо преследует игрока, либо выбирает другой шаблон.

Листинг 13.2. Муха (FLY.C).
// I N C L U D E S////////////////////////////////////////////////////////////

#include
#include
#include

// G L O B A L S /////////////////////////////////////////////////////////////

unsigned int far *clock = (unsigned int far *)0x0000046C; // pointer to internal
// 18.2 clicks/sec


// the x and y components of the patterns that will be played, I just made
// them up

int patterns_x[3][20]= { 1,1,1,1,1,2,2,-1,-2,-3,-1,0,0,1,2,2,-2,-2,-1,0,
0,0,1,2,3,4,5,4,3,2,1,3,3,3,3,2,1,-2,-2,-1,
0,-1,-2,-3,-3,-2,-2,0,0,0,0,0,0,1,0,0,0,1,0,1 };



int patterns_y[3][20] = { 0,0,0,0,-1,-1,-1,-1,-1,0,0,0,0,0,2,2,2,2,2,2,
1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,0,0,0,0,
1,1,1,2,2,-1,-1,-1,-2,-2,-1,-1,0,0,0,1,1,1,1,1 };


//////////////////////////////////////////////////////////////////////////////

Timer(int clicks)
{
// this function uses the internal time keeper timer i.e. the one that goes
// at 18.2 clicks/sec to to a time delay. You can find a 32 bit value of
// this timer at 0000:046Ch

unsigned int now;

// get current time

now = *clock;

// wait till time has gone past current time plus the amount we eanted to
// wait. Note each click is approx. 55 milliseconds.

while(abs(*clock - now) ex) ex++;
if (px ey) ey++;
if (py
Когда вы запустите программу из Листинга 13.2, то поймете, почему я назвал ее "Муха". Точка, бегающая по экрану и в самом деле напоминает муху. Она приближается к вам и вдруг начинает быстро летать вокруг. И такое поведение персонажа воплощено всего в нескольких строках программы с применением описанных выше алгоритмов. (Гм, так как вы думаете, может быть люди - это и в самом деле комплекс действий и реакций?) Теперь рассмотрим случайные передвижения.

Случайные передвижения

Что я понимаю под случайным передвижением? Это выполнение персонажем какого-нибудь совершенно непредсказуемого действия. Нечто подобное мы уже сделали в программе из Листинга 13.2. Однако, мы можем расширить эту концепцию не только выбирая способ реагирования, но и определяя, нужна ли реакция как таковая. Почему бы нам не добавить еще один тип поведения нашей "Мухе" - случайное предвижение.

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

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

К примеру, когда вы сталкиваетесь с решением некоторого вопроса, такого как обход препятствия, возникшего на вашем пути, вы попытаетесь избежать встречи с ним, двигаясь направо или налево. Если все варианты равны между собой и одинаково возможны, решение, скорее, случайно и, следовательно, является "неявным решением". Если бы кто-нибудь спросил вас, например, почему вы решили обойти столб справа, а не слева, то вряд ли вы сумели бы внятно объяснить мотивы своего поведения. В другом случае мы можем использовать случайные переменные для выбора направления движения нашей маленькой "Мухи". Алгоритм 13.5 создает маленькую точку, которой теперь полагается летать, двигаясь в случайном направлении.

Алгоритм 13.5. Случайное передвижение.
while (идет игра)
{
... код программы

if (перемещение точки по текущей траектории закончено) then
{
выбор новой траектории, иными словами,
выбираем новый фактор преобразования координат
}
двигаем точку несколько раз по новой траектории
... код программы
}
Алгоритм 13.5 моделирует "грубый разум", который выбирает направление дальнейшего движения случайным образом. Напишем программу, которая создает одиноко летящую точку в пространстве с помощью этого алгоритма. Посмотрим, как это работает, на примере программы из Листинга 13.3.

Листинг 13.3. Одинокая муха. (DFLY.C).
// I N C L U D E S////////////////////////////////////////////////////////////

#include
#include
#include

// G L O B A L S /////////////////////////////////////////////////////////////

unsigned int far *clock = (unsigned int far *)0x0000046C; // pointer to internal
// 18.2 clicks/sec


//////////////////////////////////////////////////////////////////////////////

Timer(int clicks)
{
// this function uses the internal time keeper timer i.e. the one that goes
// at 18.2 clicks/sec to to a time delay. You can find a 32 bit value of
// this timer at 0000:046Ch

unsigned int now;

// get current time

now = *clock;

// wait till time has gone past current time plus the amount we eanted to
// wait. Note each click is approx. 55 milliseconds.

while(abs(*clock - now) 319

KVEbek
Участник



Репутация: 2657190(???)
# Дата: 1 Июн 2006 01:54:56 Цитата

Шаблонные мысли

На заре создания видеоигр программисты сталкивались с серьезными проблемами, пробуя нанести точки на экран. Они радовались по поводу удачной имитации тактики боя и написания набора алгоритмов, управляющих существами в их мире. Увы, они думали, что могут имитировать разумное поведение с помощью шаблонов, то есть описывая рядом цифр траектории перемещения созданий. К примеру, в игре Galaxian маленькие космические корабли делают несколько кругов, стреляют в вас некоторое время, а затем возвращаются на прежнее место в стаю своих сородичей. Посмотрим на рис.13.1. Когда они выполняют эти движения, то всего лишь следуют командам, заранее написанных шаблонов. Конструирование шаблонов - чрезвычайно легкое занятие и они нашли использование во многих сценариях. Как пример, используем шаблоны и случайные числа для моделирования "разума", который можно использовать, например, для управления небольшим космическим кораблем. Он пытается уклониться от вас, и в то же время пробует прицельно стрелять. То, что можно для этого сделать, показано в Алгоритме 13.3.

Алгоритм 13.3. Шаблоны со случайным выбором.
// Предположим, что pattern - это массив, содержащий набор команд
// для реализации десяти различных шаблонов поведения

while (идет игра)
{

.... код программы

// Проверяем, закончена ли обработка текущего шаблона
if (если обработка команд текущего шаблона закончена)
{

// Выбираем новый шаблон
current_pattern = pattern[rand()%10];

позиция противника = старая позиция +
следующий элемент текущего шаблона

Увеличим на единицу значение индекса элементов шаблона

.... код программы

}
Алгоритм 13.3 кажется сложнее предыдущих Алгоритмов Преследования и Уклонения, но на самом деле это не так. В сущности:

- Случайным образом выбирается некоторый шаблон;

- Движение созданий в каждом проходе цикла изменяется в соответствии с направлением, указанным в шаблоне;

- Затем мы переходим к следующему элементу шаблона. Каждый шаблон может включать в себя произвольное количество элементов. Некоторые из них имеют 10 элементов, а иные - 1000.

Важно одно - когда "создание" исчерпывает набор команд, задаваемый одним шаблоном - оно переходит к другому. Наконец, мы могли бы связать выбор случайного номера шаблона с действиями на основе некой другой логики - например, описываемой Алгоритмом 13.1. Добавив к Алгоритму 13.3 последний шаг, мы придали ему некоторый аспект, который придал ему большую комплексность. Появилось подобие мыслительного процесса, состоящего из двух стадий. Случайное число подается на вход селектора шаблонов, который затем выбирает новый шаблон для игры.
+----------------------+
¦ Генератор ¦ 1-й уровень
¦ случайных чисел ¦ (мыслительный)
+-----------+----------+
+--------+---------+
¦ Выбор шаблонов ¦
+------------------+


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

+-----------+ +-----------+ +------------+ 2-й уровень
¦ ¦ ¦ ¦ ¦ ¦ (функции моторики)
¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ... ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ ¦ ¦
+-----------+ +-----------+ +------------+
Шаблон 1 Шаблон 2 Шаблон N
Рис.13.2. Использование случайных чисел для выбора шаблона.

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

Для усовершенствования тактики можно добавить измерение расстояния до игрока: если существо находится за пределами некоторого радиуса, используется Алгоритм Преследования, однако, когда оно оказывается достаточно близко, то начинает перемещаться по шаблонным траекториям, выбирая их случайным образом. Эта идея применена в Алгоритме 13.4.

Алгоритм 13.4. Преследование и Танец.
while (идет игра)
{
....код программы

if (игрок вне круга с радиусом 50 точек) then преследуем его
else
выбираем случайный шаблон и реализуем его

.... код программы
}
Для демонстрации использования шаблонов я переработал программу из Листинга 13.1 и привел ее в соответствие с Алгоритмом 13.4. Новая программа показана в Листинге 13.2. Когда враг приближается к игроку, он выбирает один из трех шаблонов и выполняет его до завершения. Далее, в зависимости от расстояния до игрока, противник либо преследует игрока, либо выбирает другой шаблон.

Листинг 13.2. Муха (FLY.C).
// I N C L U D E S////////////////////////////////////////////////////////////

#include
#include
#include

// G L O B A L S /////////////////////////////////////////////////////////////

unsigned int far *clock = (unsigned int far *)0x0000046C; // pointer to internal
// 18.2 clicks/sec


// the x and y components of the patterns that will be played, I just made
// them up

int patterns_x[3][20]= { 1,1,1,1,1,2,2,-1,-2,-3,-1,0,0,1,2,2,-2,-2,-1,0,
0,0,1,2,3,4,5,4,3,2,1,3,3,3,3,2,1,-2,-2,-1,
0,-1,-2,-3,-3,-2,-2,0,0,0,0,0,0,1,0,0,0,1,0,1 };



int patterns_y[3][20] = { 0,0,0,0,-1,-1,-1,-1,-1,0,0,0,0,0,2,2,2,2,2,2,
1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,0,0,0,0,
1,1,1,2,2,-1,-1,-1,-2,-2,-1,-1,0,0,0,1,1,1,1,1 };


//////////////////////////////////////////////////////////////////////////////

Timer(int clicks)
{
// this function uses the internal time keeper timer i.e. the one that goes
// at 18.2 clicks/sec to to a time delay. You can find a 32 bit value of
// this timer at 0000:046Ch

unsigned int now;

// get current time

now = *clock;

// wait till time has gone past current time plus the amount we eanted to
// wait. Note each click is approx. 55 milliseconds.

while(abs(*clock - now) ex) ex++;
if (px ey) ey++;
if (py
Когда вы запустите программу из Листинга 13.2, то поймете, почему я назвал ее "Муха". Точка, бегающая по экрану и в самом деле напоминает муху. Она приближается к вам и вдруг начинает быстро летать вокруг. И такое поведение персонажа воплощено всего в нескольких строках программы с применением описанных выше алгоритмов. (Гм, так как вы думаете, может быть люди - это и в самом деле комплекс действий и реакций?) Теперь рассмотрим случайные передвижения.

Случайные передвижения

Что я понимаю под случайным передвижением? Это выполнение персонажем какого-нибудь совершенно непредсказуемого действия. Нечто подобное мы уже сделали в программе из Листинга 13.2. Однако, мы можем расширить эту концепцию не только выбирая способ реагирования, но и определяя, нужна ли реакция как таковая. Почему бы нам не добавить еще один тип поведения нашей "Мухе" - случайное предвижение.

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

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

К примеру, когда вы сталкиваетесь с решением некоторого вопроса, такого как обход препятствия, возникшего на вашем пути, вы попытаетесь избежать встречи с ним, двигаясь направо или налево. Если все варианты равны между собой и одинаково возможны, решение, скорее, случайно и, следовательно, является "неявным решением". Если бы кто-нибудь спросил вас, например, почему вы решили обойти столб справа, а не слева, то вряд ли вы сумели бы внятно объяснить мотивы своего поведения. В другом случае мы можем использовать случайные переменные для выбора направления движения нашей маленькой "Мухи". Алгоритм 13.5 создает маленькую точку, которой теперь полагается летать, двигаясь в случайном направлении.

Алгоритм 13.5. Случайное передвижение.
while (идет игра)
{
... код программы

if (перемещение точки по текущей траектории закончено) then
{
выбор новой траектории, иными словами,
выбираем новый фактор преобразования координат
}
двигаем точку несколько раз по новой траектории
... код программы
}
Алгоритм 13.5 моделирует "грубый разум", который выбирает направление дальнейшего движения случайным образом. Напишем программу, которая создает одиноко летящую точку в пространстве с помощью этого алгоритма. Посмотрим, как это работает, на примере программы из Листинга 13.3.

Листинг 13.3. Одинокая муха. (DFLY.C).
// I N C L U D E S////////////////////////////////////////////////////////////

#include
#include
#include

// G L O B A L S /////////////////////////////////////////////////////////////

unsigned int far *clock = (unsigned int far *)0x0000046C; // pointer to internal
// 18.2 clicks/sec


//////////////////////////////////////////////////////////////////////////////

Timer(int clicks)
{
// this function uses the internal time keeper timer i.e. the one that goes
// at 18.2 clicks/sec to to a time delay. You can find a 32 bit value of
// this timer at 0000:046Ch

unsigned int now;

// get current time

now = *clock;

// wait till time has gone past current time plus the amount we eanted to
// wait. Note each click is approx. 55 milliseconds.

KVEbek
Участник



Репутация: 2657190(???)
# Дата: 1 Июн 2006 01:55:59 Цитата

while(abs(*clock - now) 319) ex=0;
if (ex199) ey=0;
if (ey
Думаю, после запуска программы вы согласитесь с тем, что мы, наконец, получили все необходимое для моделирования летающего "разумного существа". Несколько простых правил, шаблоны и случайные числа помогли нам создать довольно правдоподобную имитацию полета насекомого. Это просто чудесно!

Теперь настало время поговорить о конечных автоматах.
КОНЕЧНЫЕ АВТОМАТЫ

Конечные автоматы (КА) - близкие друзья самых разнообразных механизмов. Они царствуют в виртуальном пространстве компьютеров. КА используются в разработке аппаратного и программного обеспечения. Поскольку мы коснулись этой темы, скажу, что КА - это программно моделируемая машина, которая движется от состояния к состоянию, основываясь на входных данных. Кроме того, КА обычно запоминает все состояния, в которых он побывал. Посмотрите на рис 13.3, на котором изображена диаграмма простейшего КА. (Что именно этот КА делает - не имеет никакого значения).

Как видите, КА имеет набор состояний, представленных кружками и объединенных дугами переходов от состояния к состоянию. Эти дуги показывают правила, по которым происходят переходы из одного состояния в другое. КА могут быть использованы в видеоиграх как один из методов высокоуровневого управления логикой, с помощью которого передаются команды "низкоуровневой " логике.

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

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

Теперь у нас есть набор решений, чтобы ответить на вопросы:

- Какая причина заставит КА изменить свое состояние?

- Как заставить КА выбрать следующее состояние?

Это хорошие вопросы - посмотрим, как выглядят видеоигры изнутри.

Конечный автомат, управляемый окружающей средой

Теперь наступает приятная часть. Мы можем создать КА, в котором состояния перехода представлены рядом переменных. Другими словами, мы управляем конечным автоматом с помощью самой игровой среды, в которой он находится, так же, как наш собственный мозг реагирует на окружающую обстановку.

Начнем создавать КА с того, что он будет случайным образом выбирать одно из нижеперечисленных состояний:

- преследование;

- уклонение;

- случайное;

- шаблон.

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

- Если игрок близко, КА переключается в состояние Шаблон;

- Если игрок далеко, можно заставить ПК охотиться за ним, используя состояние Преследование;

- Если игрок обрушил на наше маленькое создание шквальный огонь, КА моментально переходит в состояние Уклонение;

- Наконец, при любой иной ситуации КА отрабатывает состояние Случайное.

Перейдем к программной реализации описанного КА. Мы не станем создавать сложное игровое пространство. Для демонстрации нам достаточно иметь чистый экран с парой точек, изображающих игрока и противника. Чтобы понять суть, этого вполне достаточно. Программа из Листинга 13.4 моделирует полет действительно назойливой мухи, которая буквально заедает игрока.

Листинг 13.4. Умная "Муха" (BFLY.C).
// I N C L U D E S////////////////////////////////////////////////////////////

#include
#include
#include

// D E F I N E S ////////////////////////////////////////////////////////////

#define STATE_CHASE 1
#define STATE_RANDOM 2
#define STATE_EVADE 3
#define STATE_PATTERN 4

// G L O B A L S /////////////////////////////////////////////////////////////

unsigned int far *clock = (unsigned int far *)0x0000046C; // pointer to internal
// 18.2 clicks/sec


// the x and y components of the patterns that will be played, I just made
// them up

int patterns_x[3][20]= { 1,1,1,1,1,2,2,-1,-2,-3,-1,0,0,1,2,2,-2,-2,-1,0,
0,0,1,2,3,4,5,4,3,2,1,3,3,3,3,2,1,-2,-2,-1,
0,-1,-2,-3,-3,-2,-2,0,0,0,0,0,0,1,0,0,0,1,0,1 };



int patterns_y[3][20] = { 0,0,0,0,-1,-1,-1,-1,-1,0,0,0,0,0,2,2,2,2,2,2,
1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,0,0,0,0,
1,1,1,2,2,-1,-1,-1,-2,-2,-1,-1,0,0,0,1,1,1,1,1 };


//////////////////////////////////////////////////////////////////////////////

Timer(int clicks)
{
// this function uses the internal time keeper timer i.e. the one that goes
// at 18.2 clicks/sec to to a time delay. You can find a 32 bit value of
// this timer at 0000:046Ch

unsigned int now;

// get current time

now = *clock;

// wait till time has gone past current time plus the amount we eanted to
// wait. Note each click is approx. 55 milliseconds.

while(abs(*clock - now) ex) ex++;
if (px ey) ey++;
if (py ex) ex--;
if (px ey) ey--;
if (py 5 && distance 25 && distance 30 && rand()%2==1)
{
clicks=10;
fly_state = STATE_RANDOM;

curr_xv = -5 + rand()%10; // -5 to +5
curr_yv = -5 + rand()%10; // -5 to +5

} // end if random
else
{
clicks=5;
fly_state = STATE_RANDOM;

curr_xv = -5 + rand()%10; // -5 to +5
curr_yv = -5 + rand()%10; // -5 to +5

} // end else

// reset need another state flag

select_state=0;

} // end if we need to change to another state

// make sure fly stays on paper

if (ex>319) ex=0;
if (ex199) ey=0;
if (ey
Запустив программу, вы наверняка обратите внимание на кажущуюся сложность поведения "Мухи". А ведь для получения такого результата использована весьма простая схема! Возможно, и вы заметите то, что увидел я - чуть ли не человеческую способность мыслить.

Управление приоритетным состоянием

Можно еще усовершенствовать наш КА, если ввести управление сменой состояний с помощью некоторых переменных и функций. На практике это означает возможность изменения текущего режима, не дожидаясь полного завершения программы, отвечающей за его выполнение.

В имитаторе движения "Мухи" каждое состояние выполнялось до полного завершения. Но если включить в программу проверку выполнения или невыполнения некоторых условий, это позволило бы КА "выпрыгнуть" из состояния, не дожидаясь окончания его "отработки".

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

Вероятностные автоматы

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

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

Это можно было бы реализовать изменением диапазона случайных чисел во всех строках программы, где выбираются состояния "мухи". Но такой подход будет очень грубым. Мы пойдем другим путем - путем создания общего метода управления характером персонажей, основанного на вероятности.

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

Но у меня также есть друзья, которые более спокойны и предпочитают сначала думать, а потом действовать. Скорее всего, мошеннику удалось бы как-то с ними договориться. То, что мы видим на данном примере, и является "индивидуальностью".

Каким именно способом это будет достигнуто, не принципиально, важен конечный результат.

В видеоиграх мы могли бы иметь несколько противников, которые постоянно преследуют нас, пока другие в это время неподвижны и стреляют. Третьи трусливы и предпочитают убегать, а не сражаться. Анализируя ситуацию, мы видим, что имеется все тот же набор состояний, но вероятности перехода в них различны для каждого состояния. Для моделирования этого процесса мы могли бы сослаться на "таблицу вероятностей" в той части программы, которая выбирает новое состояние. Эта таблица могла бы содержать различные степени вероятности переходов существ в то или иное состояние. К примеру, взгляните на табл.13.1, в которой перечислены соотношения вероятностей для трех различных существ в одной игре.

<< . 1 .  . 3 . >>   Версия для печати . Вверх

ОСТАВЛЯТЬ СООБЩЕНИЯ МОГУТ ТОЛЬКО ЗАРЕГИСТРИРОВАННЫЕ ПОЛЬЗОВАТЕЛИ!

Администрация форума: editors@civru.com
Rambler's Top100
XML [?]