Van Damm
wait... what?
offline
Опыт:
22,268Активность: |
Создание AI для карт типа Hero Arena
Эта статья является переводом статьи Blade.dk с сайта WC3Jass.com. Перевод сделан мной (Van Damm)
Этот обучающий материал позволит вам добавить простой, но прикольный AI в карты типа арена. AI, с созданием которого вы познакомитесь, не будет идеальным. Мы создадим AI, который будет атаковать других героев, подбирать вещи, учить и использовать заклинания, но не будет настолько эффективен, как человек. Тем не менее, когда вы изучите основы, то сможете самостоятельно его улучшить. Требуется: Знание JASS - это руководство на JASS, поэтому вам понадобиться знать JASS чтобы написать AI. В принципе, это может быть сделано с помощью GUI, но я не рекомендую этого делать из-за утечек памяти, тонн ненужного кода и невозможности использовать RB и систем, основанных на игровом кэше, через GUI. Если вы не знаете JASS, вы можете почитать Руководство по JASS в библиотеке XGM. Также вам будет необходимо знание того, что такое код (rawcode), узнать об этом можно где-то в другом месте. Система, основанная на игровом кэше и RB - это может быть SCV от Sergey, Local Handle Variables от KaTTaNa или модуль CSCache от Vexorian (часть Caster System). В этом руководстве я буду использовать CSCache. Присоединённая карта - маленькая карта, созданная мной (Blade.dk), показывает простой AI, который мы здесь сделаем. Важно чтобы у вас была эта карта, так как руководство часто ссылается на неё Заметки: - AI, который мы сделаем, не будет играть настолько хорошо, как человек, но это лучше, чем ничего. А когда вы изучите основы, то сможете самостоятельно его улучшить. - много номеров (например номера игроков) начинаются с 1 в GUI, хотя в JASS они начинаются с 0. Это это руководство на JASS, поэтому здесь они начинаются с 0. - Вы не обязаны делать всё в точности так, как это делаю я; я делаю это по-своему, но если по-вашему лучше, или вам просто так удобнее, - делайте по-своему. Я не идеален, и это руководство не идеально, но надеюсь, что оно кому-то поможет. - вы можете использовать AI из моей карты, не создавая своего собственного (если вы сделаете так, укажите Blade.dk в кредитах), но я предлагаю сделать ваш собственный, так как карты могут очень отличаться и потому что вы чему-то научитесь от этого. - демо карта, возможно, не лишена багов, и также не самая весёлая. Помните, что эту карту я создал только для того, чтобы показать AI. - хочу сказать особое спасибо Vexorian за то, что он дал мне силы написать первый AI для моей карты, за советы по его созданию и за то, что он показал мне свой AI, что помогло улучшить мой. Инициализация: В первую очередь создайте триггер под названием "AI" с событием "Игрок - Игрок 1 (Красный) покидает игру". Преобразуйте его в JASS. Этот триггер потребуется нам для определения выхода игрока из игры, чтобы запустить AI для него. Сейчас зарегистрировано только событие, когда игрок 0 покидает игру, поэтому мы используем цикл, чтобы зарегистрировать это событие для всех игроков от 0-11. Мы хотим, чтобы AI использовал способности. Это может звучать сложно, но это не так. Нам только нужно дать команду героям изучить способности, и они будут использовать их сами. Примечание: ситуация, когда управляемый компьютером герой будет использовать заклинаниевсегда такая же, как и для заклинания, на котором оно основано. Например, если у вас есть своё заклинание, основаное на заклинании "Молчание", оно будет использоваться в ситуациях, когда оно кастуется в melee-играх. Никогда не используйте способность "Канал" как основу для ваших заклинаний, потому что AI никогда их не использует. Чтобы знать, какие спеллы у героев, мы создаём кэш, в котором будем их хранить. В карте-образце я создал кэш при инициализации карты и сохранил его в глобальную переменную udg_GameCache. Заметьте, что кэш обязан быть инициализирован до того, как мы начнём его использовать, поэтому я сделаю это в первой функции InitTrig моей карты. В карте я создаю функцию "SetupSkills". В функции InitTrig триггера AI я использую ExecuteFunc, чтобы вызвать эту функцию из другого потока. Это делается для того, чтобы предотвратить поток инициализации карты от крушения. Функция SetupSkills Код:
Функция InitTrig_AI: Код:
Запускаем AI для героя: Чтобы контролировать AI, я создам таймер. Я создам функцию под названием "StartAI", которая берёт один аргумент - герой. Эта функция просто создаёт таймер, присоединяет к нему героя и запускает (создайте сейчас функцию "AILoop", которая будет выполняться при окончании отсчёта таймером, но не пишите в неё никакого кода - мы добавим его позднее, но она нужна сейчас чтобы не получить ошибок при компиляции) Функця AILoop: Код:
Функция StartAI из карты-примера: Код:
Заметьте, что я стартую таймер как одноразовый (мы вернёмся к этому позднее). Теперь просто сделайте, чтобы ваша система выбора героев вызывала эту функцию, когда компьютерный игрок выбирает героя и переходите к функции, которая вызывается когда игрок выходит из игры. Проверьте, есть ли у игрока герой, и если у него/неё есть герой, вызовите функцию, которая запускает AI для этого героя. Например: Код:
Заставляем AI что-то делать: Есть несколько вещей, которые нужно сделать, когда таймер заканчивает отсчёт: · Если герой мёртв, подождать пока он/она воскресится. · Если герой близок к сметри, приказать ему/ей двигаться к фонтану в центре. · Если у героя всё нормально с жизнями, проверить, есть ли поблизости враг. Если есть, приказать герою его атаковать, в противном случае проверить, есть ли возле героя вещи, если есть, дать ему/ей приказ "smart" чтобы он/она подобрал её, если нет, просто приказать герою патрулировать случайное место на карте. · Если герой жив и у него есть неиспользованые очки умений, выучить заклинание. Начнём с объявления всех переменных. Обратите внимание на переменную 'e' в моей функции, он определяетсколько времени пройдёт до того, как таймер закончит отсчёт снова, так что мы можем ждать меньше, если герой мёртв, или дольше, если он/она атакует. Этапеременная инициализируется со значением 5. Объявляем локальные переменные: Код:
Мы начинаем с проверки, мёртв ли герой. Если это так, присваиваем 'е' зачение 1.5 (так как ждать 5 секунд после воскрешения - это слишком много, мы этого не хотим). Если жизнь героя (переменная 'l') меньше или равна 0, присваиваем 'е' зачение 1.5 чтобы сделать проверку по таймеру более частой до тех пор, пока герой не воскресится. Код:
Далее, если жизни у героя менее 20% приказываю ему идти к фонтану в центре и присваиваю 'е' зачение 3 Код:
Если у героя всё в порядке со здоровьем, проверяем, стандартный ли у него/неё приказ (чтобы не прерывать чтение заклинаний). Если приказ стандартный, проверяем, есть ли враги в радиусе 500 от героя. Если есть, и это другой герой, просто дайм приказ атаковать (переменную 'e' не изменяем) Код:
Если вргов не найдено, проверяем, есть ли поблизости вещи. Если вещь найдена и это не руна, проверяем, есть ли у героя свободные слоты инвентаря, и приказываем её подобрать. Код:
Если у героя заняты все слоты инвентаря или рядом вещей нет, приказать ему/ей патрулировать случайную точку на карте в поиске новых целей. Код:
Теперь давайте проверим, есть ли у героя неиспользованые очки навыков (сделаем это отдельно от блока атаки/подбора вещи/патрулирования) Если есть, вызываем функцию, которая учит заклинание герою. Я использовал функцию, сохраняющую, сколько раз она уже выучила способность герою, чтобы придерживаться определённой последовательности при изучении навыков: Код:
Теперь просто заставляем таймер закончить отсчёт вновь через 'e' секунд: Код:
В конце нужно обнулить локальные переменные: Код:
Последние замечания: Это - основы, AI может быть намного лучше, но это должно помочь вам начать. Это не должно быть сложным, но если вы только что в первый раз прочитали это обучение, у вас может сложться такое впечатление. Карта была сделана как наглядный пример, так что рекомендую её посмотреть. Что вы можете добавить для улучшения AI: - Попробуйте заставить его находить самого слабого врага из всех ближайших. - Попробуйте заставить несколько разных AI игроков работать вместе для убийстваопределённого юнита. - Когда основные битвы концентрируются у фонтана, заставьте героя убегать оттуда если у него мало жизней. - Заставьте AI писать сообщения согласно ситуации (представьте себе AI игрока, говорящего вам "Сдохни, #¤%ный #¤%!" перед тем как вас убить) Я надеюсь это кому-то поможет! |
21.12.2005, 00:59 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
МяУт
Eva01
offline
Опыт:
1,921Активность: |
Van Damm
Респект, Ван=) Может патом где нить применю) |
22.12.2005, 15:53 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
exploder
iOS zealot
offline
Опыт:
19,394Активность: |
Van Damm
Скока там на WC3Jass.com еще статей осталось... может мы тоже чо нить преведем :) exploder добавил: Как я понял Blade.dk использовал этот же код в своей AAA... |
22.12.2005, 16:14 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Van Damm
wait... what?
offline
Опыт:
22,268Активность: |
exploder да, только очень усовершенствованный. единственный проблем - что он ААА обфускатором прогнал, такой гемор код заново восстанавливать...
|
23.12.2005, 00:07 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
exploder
iOS zealot
offline
Опыт:
19,394Активность: |
Я же не говорил что собираюсь ее вскрывать... |
23.12.2005, 16:16 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Van Damm
wait... what?
offline
Опыт:
22,268Активность: |
exploder а я хотел посмотреть, интересно всё-таки. особенно одевающиеся шмотки прикольно сделаны
|
24.12.2005, 01:16 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Mefist
Is it cocktail hour yet?
offline
Опыт:
98,240Активность: |
http://xgm.guru/articles.php?id=260
+1000 експы |
29.01.2006, 00:43 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
TiM
Старичок
offline
Опыт:
8,594Активность: |
Респект однозначно. Статья действительно полезная, в отличие от... гм... некоторых ;) |
29.01.2006, 02:39 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Maroder
Вредитель...
offline
Опыт:
1,209Активность: |
Но для новичков эта статья слишком сложная. Кто хочет создать AI триггерно и очень просто - всем сюда http://xgm.guru/forum/showthread.php?t=4737&page=1&pp=20
|
08.06.2006, 11:24 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Vedun
offline
Опыт:
2,809Активность: |
Maroder, новички не начиют изучение едитора с создания AI (А если и начинают, то это неправильные новички! :) ). Ты об этом подумал?
|
08.06.2006, 11:42 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Maroder
Вредитель...
offline
Опыт:
1,209Активность: |
Но когда новички решают создать Arenu, то им нужен AI, а в джазе они, допустим, нефига не рулят. И что им делать??? Правильно! Почитать мою статью. |
08.06.2006, 18:36 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Vedun
offline
Опыт:
2,809Активность: |
Во первых: из твоей статьи новички узнают что-то новое, только если в War3 никогда не играли.
Во вторых: новички, как я уже говорил, не начинают свою с ИИ. А когда новички решают создать ИИ, они знают гораздо больше, чем описано в твоей статье! Всё, забили на эту тему. |
08.06.2006, 19:29 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|