XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Результаты опроса: Хотите ли вы принять участие в турнире AOS AI (в первом посте почти вся инфа)
Да (устраивают условия) 26 52.00%
Условия не устраивают (хочу другой турнир AI, например по другому жанру и тд.) 12 24.00%
Вообще не хочу туринир AI 12 24.00%
Голосовавшие: 50. Вы еще не голосовали в этом опросе

Ответ
 
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
bee, че значит "это скажеться на решение жюри"? всеравно опять же жюри придется проверять все это, а потом тебе скажут "ты забыл что вот так нельзя, поэтому твой AI хакерский".. еще раз говорю: я тебе же легче делаю, тебе не нужно будет думать что тебе разрешено - все уже есть!
Старый 26.07.2010, 00:32
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
я не хочу вспоминать при работе что могу делать. в моем распоряжении должны быть все функции говорю тебе, что за идиотизм??
Старый 26.07.2010, 00:36
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
bee, ОК, специально для тебя - используй все функции, но если когда будем проверять твой AI, окажется что не учел какие-либо правила, которые выложу, вылетаеш из турнира, Согласен?? Тогда можеш даже не смотреть правила - придумывай свои.. ты просто придумаеш все тоже самое что я напишу в правилах, хотя можеш чего-то не учесть.. но если добавиш что-то свое - я не против, твой же AI, главное чтобы в общие правила входил
Старый 26.07.2010, 00:38
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Мне вот что непонятно. Значит я себя должен вести честно, и проверять каждого юнита на видимость ? А если где нибудь забуду, то потом опять код править ? Мне эта идея не нравится.
Мое предложение: давайте не будетм друг друга мучать, и сделам следующее: можно пользоваться любыми жасс функциями, за исключением тех, которые непосредственно влияют на параметры игроков и окружения (здоровье, мана, золото итд). Все будут иметь равные возможности ?
Старый 26.07.2010, 00:38
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
PlayerDark, ну так и надо ваще

bee добавил:
Цитата:
Сообщение от Alex_Hell
~bee, ОК, специально для тебя - используй все функции, но если когда будем проверять твой AI, окажется что не учел какие-либо правила, которые выложу, вылетаеш из турнира, Согласен?? Тогда можеш даже не смотреть правила - придумывай свои.. ты просто придумаеш все тоже самое что я напишу в правилах, хотя можеш чего-то не учесть.. но если добавиш что-то свое - я не против, твой же AI, главное чтобы в общие правила входил

пшел ты. идиотские правила ты придумываеш
Старый 26.07.2010, 00:48
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
bee, какую часть моего сообщения ты имеешь в виду ?
Старый 26.07.2010, 00:48
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
PlayerDark, ты смотрел предварительный список того, что разрешено в первом посте? там как раз и написан список всего этого, никаких дополнительных проверок кроме видимости юнита-цели с тебя не придется.. все статически, тоесть если ты хочеш отдать приказ - ты можеш его отдавать только своему герою, и приказывать изучить способность тоже только своего героя.. но вот когда отдаеш приказ на цель-врага должен проверить его видимость, иначе побежиш за ним - а он не видим.. хотя как я уже сказал автоматически проверяется видимость каждую секунду: сначала цель героя запоминается, а потом как только она стала невидима - обнуляется и твой герой получит приказ "STOP".
Могу как сказал сразу сделать общую функцию отдачи приказа, которая сразу при отдаче проверяет видимость и если цель не видима - приказ не будет отдан, но тут же она возвращает Boolean - отдан приказ или нет - не на много проще тебе будет, если вдруг забудеш проверить видимость, потому что приказ не отдастся а ты если код возврата не провериш - будет плохо))
Еще нужно проверять видимость при получении характеристик юнитов типа здоровья, маны, атрибутов героя (сила, ловк. и тд.), предметов... но и для этого могу сделать функцию типа GetUnitProperty(Unit, Property), которая вернет (-1) например если цель не видима, но и тут тебе будет худо если не провериш код возврата, а будеш использовать (-1) как атрибут кол-ва маны героя, думая что у него маны нет, а на самом деле он просто не видим.. тоесть тебе придется всеравно сначала видимость проверить - для своего же блага..
А если разрешать получать характеристики даже невидимого воина - это плохо всем, тк. пока герой дерется с крипами в лесу и у него даже меньше ХП и маны чем у тебя, да и скиллы он на них применил например - побежал на него нападать - а он хоть это увидит и будет убегать, но всеравно ты бы его если не хакерил не видел - а он бы с малым кол-вом здоровья этих крипов добил, а тут ты со своим хаком видимости
Alex_Hell добавил:
bee, ОК можеш не участвовать! А если будеш, можем использовать мое поседнее предложение по поводу автоматической проверки видимости во всех функция фреймворка, но тут опять таки ты не будеш использовать JASS на прямую, а будеш вызывать мои функции, которые всю лишнюю проверку видимости будут делать за тебя, а ты только их вызовеш, ну и код возврата провериш..
Разрешать видимость всех юнитов на карте - вот это точно тупо, этого не будет!
Старый 26.07.2010, 00:53
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Alex_Hell, > А если разрешать получать характеристики даже невидимого воина - это плохо всем, тк. пока герой дерется с крипами в лесу - побежал на него нападать - а он хоть это увидит и будет убегать, но всеравно ты бы его если не хакерил не видел - а он бы с малым кол-вом здоровья этих крипов добил, а тут ты со своим хаком видимости
ну, так обратное правило тоже действует.
В любом случае, ты делаешь функции, если тебе так дорога эта видимость, Я слежу за тем, что бы мой АИ работал, и не забочусь, что бы он случайно не читанул.
Старый 26.07.2010, 00:55
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
PlayerDark, Значит ты за тот вариант, что я делаю фреймворк функций, которые ты будеш вызывать, многие JASS-функции вообще будут запрещены, некоторые разрешено, но вот те которые спорные и пришлось бы делать проверки тебе - они будут в фреймворке и проверки делаются уже там... они код возврата отдают и если ты его не проверил - твои проблемы, но читерства не будет уже точно..
Старый 26.07.2010, 00:58
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Alex_Hell, Как то так. Придется, конечно, много из старого кода перепиливать.
Старый 26.07.2010, 01:03
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
PlayerDark, какого старого кода? У тебя уже есть готовый AI?
Старый 26.07.2010, 01:03
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Есть наработки, я хотел бы их использовать, если подойдут.
Старый 26.07.2010, 01:05
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Чето народ вообще не отписывается, голосовали в опросе дофига...
В принципе можно сделать всю карту открытой, чтобы не было лишних проверок видимости (это равноценно убрать правило, чтобы юнит был видим при отдаче на него приказа или получения характеристик), но по-мне так это плохо, тк. тактическая составляющая еще в том, чтобы видеть только часть карты а не всю карту.. и действовать по обстоятельствам увидев врага рядом с собой, а не следить за ним пока он бежит от базы и нападает на тебя))
Старый 26.07.2010, 01:16
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Не не не, давайте сделаем всю карту открытой. Я и сам пока до конца не решил, буду я что то делать или нет. А множество правил отбивает желание осваивать сисетму.
Старый 26.07.2010, 01:26
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
PlayerDark, не понял о каком множестве правил идет речь, есть список разрешенных функций, такие как: действия со своими триггерами, отдача приказов своему герою, и тд. они или полностью разрешены или частично в пределах разумного - приказ можно отдать своему герою а не вражескому или крипу))
из ограничений только проверка видимости..
если открыть карту - это убирает или снижает такие возможноти как иллюзия, невидимость, телепорт (телепортнешся и враги увидят куда - побегут за тобой), да и вообще постоянно будут преследовать врага с малым кол-вом здоровья чтобы добить, на крипах в лесу качаться будет невозможно, не гангнеш вражеского героя, вобщем пропадает эффект неожиданности, а это в картах жанра AOS очень много!
и все это только из-за того, что кто-то не хочет написать 1 лишнюю строку кода в своем скрипте))
основная часть AI будет 100% у всех - периодическая функция, внутри нужно анализировать врагов в радиусе от героя, ну или например в каких-то областях на карте, ну так вот получить список видимых врагов вокруг себя как я писал можно простой функцией из моего каркаса, а уж с ними делай все проверки на тип юнита, на кол-во здоровья, предметы и тд. ни в чем не ограничен ты, только должен вызывать 1 функцию и все!
конечно по-другому дело обстоит если ты сохранил юнита в гобалку, и периодически к нему будеш обращаться.. в какой-то момент он может стать невидимым, чтобы не нарушать правил ты просто еще 1 проверку добавляеш, что именно сохраненный юнит периодически если хочешь использовать его характеристики - проверяеш сначала видимость, а потом все остальное..
... итого 2 функции с каждого, которые вызвать - не составит никакого труда.. а о том, что "вдруг я забуду проверить юнита на видимость" - это очень маленькая вероятность, тк. я уже сказал когда нужно вручную проверять - когда ты сохранил его в глобалку и периодически к этой глобалке обращаешся..
примерно вот так может выглядеть периодическая функция AI:
globals
	integer	      udg_ALEXHELL_PlayerID		// индекс игрока-владельца AI
	unit array		udg_ALEXHELL_NearHero		// массив ближайших героев
	integer	      udg_ALEXHELL_NearHeroCount = 0	// массив ближайших героев
endglobals

// Периодическая функция AI
function ALEXHELL_PeriodicFunc takes nothing returns nothing
    local unit me = udg_Hero[udg_ALEXHELL_PlayerID]	// мой герой
    local group gr_enemy
    local group gr_ally
    local real life
    local real mana
    local boolean target_exist = false
    local integer i = 0
    local integer n
    local boolean b

    // Проверяем ранее сохраненных героев
    loop
        exitwhen i == udg_ALEXHELL_NearHeroCount

        // если герой в массиве видимый
        if (GamePlay_IsVisible(udg_ALEXHELL_PlayerID, udg_ALEXHELL_NearHero[i]) then

            // легко получаем его здоровье и ману
            set life = GetUnitState(udg_ALEXHELL_NearHero[i], UNIT_STATE_LIFE)
            set mana = GetUnitState(udg_ALEXHELL_NearHero[i], UNIT_STATE_MANA)

        // если герой в массиве не видимый
        else

            // сдвигаем всех героев в массиве
            set n = i
            loop
                exitwhen n == udg_ALEXHELL_NearHeroCount - 1
                set udg_ALEXHELL_NearHero[n] = udg_ALEXHELL_NearHero[n + 1] 
                set n = n + 1
            endloop

            // очищаем последнюю ячейку
            set udg_ALEXHELL_NearHero[udg_ALEXHELL_NearHeroCount] = null
            set udg_ALEXHELL_NearHeroCount = udg_ALEXHELL_NearHeroCount - 1

            // таким образом невидимый герой был исключен из массива, а его характеристики не были проверены - все по правилам!

        endif

        set i = i + 1
    endloop

    set gr_enemy = GamePlay_GetEnemyInRange(me, 1000)	// группа видимых врагов в радиусе от героя
    set gr_ally = GamePlay_GetAllyInRange(me, 1000)	// группа союзников в радиусе от героя

    // Выбираем новую цель для атаки / магии
    loop
        set u = FirstOfGroup(gr_enemy)
        exitwhen u == null

        // Если это герой или иллюзия
        if (IsUnitType(u, UNIT_TYPE_HERO) or IsUnitIllusion(u)) then

            // легко получаем его здоровье и ману, тк. он видим!
            set life = GetUnitState(u, UNIT_STATE_LIFE)
            set mana = GetUnitState(u, UNIT_STATE_MANA)

            // проверяем, есть ли герой уже в нашем массиве
            set b = false
            set n = 0
            loop
                exitwhen n == udg_ALEXHELL_NearHeroCount

                if (u == udg_ALEXHELL_NearHero[n]) then
                    set b = true
                    exitwhen true
                endif

                set n = n + 1
            endloop

            // если его в массиве еще нет - добавляем!
            if (not b) then
                set udg_ALEXHELL_NearHero[udg_ALEXHELL_NearHeroCount] = u
                set udg_ALEXHELL_NearHeroCount = udg_ALEXHELL_NearHeroCount + 1
            endif

            // если цель еще не задана
            if (not target_exist) then

                // отдаем приказ атаковать, тк. он видим!
                if (life < 200 and mana < 200) then
                    set target_exist = true
                    call IssueTargetOrder(me, "attack", u)
                endif
            endif
        endif

        call GroupRemoveUnit(gr_enemy, u)
        set u = null
    endloop

    // дальше можем найти цель для применения "Благодати" на союзного героя из группы [gr_ally]
    if (not target_exist) then
        // ...
    endif

    call DestroyGroup(gr_enemy)
    call DestroyGroup(gr_ally)
endfunction
Таким куском кода, который я написал за пол часа, я получаю список видимых вражескоих воинов, ищу среди них новую цель для атаки, а также запоминаю всех вражеских героев в массив udg_ALEXHELL_NearHero... в этой же функции в начале я прохожу по списку героев в массиве udg_ALEXHELL_NearHero и если находу там видимого - могу проверять его характеристики, использовать в качестве цели и тд. а если он невидим - просто удялаю из масива - все правила соблюдены!
че правда сложно? можете кто хочет использовать этот кусок кода, доработав его.. вот и каркас для периодической функции AI, ограничений по сути тут очень мало!
Старый 26.07.2010, 14:48
silumin

offline
Опыт: 11,153
Активность:
Alex_Hell, вот ты за 30 мин написал такой функциональный код. Короткий, понятный, в 1 функцию. Ну а то что нарисовал я, пока было желание учавствовать, больше смахивает на кошмар программиста. У меня на тот момент было где-то 5-6 функций вызываемые через таймер, которые отвечают за разные состояния героя: поиск цели, движение к цели, бой, саппорт аллийному герою, возврат к фонтану, переход на другую линию... Только и всего. Ещё не сделана покупка предметов, не реализована адекватная реакция на атаку подконтрольного героя, не написал тактическую функцию манёвров под защищаемой структорой, без понятия как сделать реакцию на "крик о помощи" союзного героя. А в довесок ещё вызываемое существо... нет, целых 5 на выбор, туча предметов.
Ты, профессиональный программер, предлагаешь тягаться с тобой рядовым джассерам "на твоём поле" (условиях). Относительно меня вопрос стоит не в том, чтобы сделать адекватного АИ, а чтобы его вообще сделать под такой арсенал (скиллы, итемы, саммоны).
Таких как я не один человек, поэтому в начале темы я неоднократно акцентировал внимание на необходимости упрощения условий.
Старый 26.07.2010, 23:31
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Alex_Hell, еще раз напоминаю, условия надо упростить. Тепер ьнас уже трое.
Старый 27.07.2010, 00:22
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
silumin, теперь уточни что именно нужно упростить?
блин совсем забыл сказать - вызываемых существ не будет! за место них обычные спеллы - ульты..
я в своем коде хотел только показать как реализовываются несколько ограничений которые в правилах написаны.. на самом деле они довольно простые, и показано как их придерживаться..
а на счет того, чтобы тягаться со мной - я может и программист нормальный, но предметная область такая как AI For Warcraft - я тут нефига не умею))
тут как бы 2 составляющие для успеха:
  1. уметь составить алгоритм - без разницы для чего - с этим у меня норм
  2. знать предметную область - тут хуже, я варом то редко занимаюсь.. а вот у вас может быть наоборот..
отпишись по поводу того, что я предложил сделать общие функции, которые вы должны будете вызывать, к примеру: получить видимых врагов вокруг своего воина и тд. - это уже писал.. вам это ничего не усложняет а наоборот помогает придерживаться правил честного AI..
по-сути кодировать можно на чем угодно, вот вам набор функций - кодируйте с их использованием, а алгоритм поведения AI - у каждого свой!
silumin, что по поводу скиллов - уже договорились что будет 5 на выбор у каждого - так ты сам выбираеш и пишеш под них интеллект.. ну вот можеш конечно написать реакции на разные скиллы врага, но это уже для более сильного бота..
а предметы - тоже никто не заставляет тебя все их использовать, можно ограничиться некоторым универсальным по твоему мнению набором - он есть всегда в AOS, в той же самой доте))
Alex_Hell добавил:
PlayerDark, не понятна твоя позиция, тот код который я привел - тебе он норм? справишся с правилами видимости - сделав по подобию моего кода?
Старый 27.07.2010, 00:29
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Alex_Hell, надо будет - сделаю, но идею не одобряю.
Старый 27.07.2010, 00:35
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
PlayerDark, тоесть тебе не нравится что придется проводить пару проверок видимости? если это не делать - уже писал - тактические возможности сильно скоращаются, на открытой карте в AOS не играют..
silumin, а ты как относишся к этому? тоже хочешь играть на открытой карте?
Если проверка видимости не единственное, что смущает - пишите сразу, не молчите.. турнир еще не начали - так что есть время поменять.. но не надо в таком роде "упростить то, не знаю что" - конкретнее!
Старый 27.07.2010, 01:06
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 09:57.