Команды дота 2 лобби как сделать бота


Читы для практики [В лобби] тактика Dota 2

Я думаю у всех дотеров иногда появляется желание проверить, как работает та или иная способность героя или, например, как гармонируют те или иные предметы. Именно для этого обычно запускается одиночная игра в лобби. Приведу себя в качестве примера. Экспериментируя в лобби, я узнал, например, что ульт Shadow Demon убивает курьера, а SunStrike инвокера нет. Хотя и первая способность, и вторая - чистый урон. Именно в лобби, я убедился, например, что маленький сатир, которого все так обходят стороной, снимает, скажем,  Repel Omniknight'a. 

Как говориться, лучше один раз увидеть, чем сто раз услышать. Лучше один раз проверить в лобби, как хорошо сочетается Yey of Skadi с Satanic'ом, чем пытаться вспомнить в бою, что вам когда-то рассказывал ваш товарищ. В этом руководстве я собрал все известные мне читы для практики, которые могут быть полезны дотеру. Я надеюсь каждый из вас после прочтения, откроет для себя что-то новое. Поехали!

Лень читать? Предлагаю ознакомиться с моим видео-руководством по читам Dota 2. Приятного просмотра!

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

-gold [число] (без скобок)

Пишите gold, пробел число. Число - это то сколько золота вам нужно. Сильно много не заказывайте. Во-первых 99999 - это максимальное количество денег, которое может у вас быть на руках. Во-вторых, если вы напишите слишкои много, то денег вам не дадут вообще. Еще есть такая фишка, иногда нужно отнять золото у своего героя, тогда необходимо прописать после "-gold" знак "минус" и число. если мы пишем "-gold -625", отнимется 625 золотых

-lvlup [число] (без скобок)

После "lvlup" пишем число, на которое хотим увеличить свой уровень. Например, если у нас четвертый уровень, а нам нужен седьмой, то пишем "-lvlup 3".

-respawn

Эта команда возрождает героя на фонтане. Выглядит это так, как будто наш герой только что вышел из таверны.

-item [название предмета] (без скобок)

Вы можете дать своему герою любой существующий артефакт. Например, вы хотите купить себе радик, но в потойную лавку для этого идти очень долго. Открываем чат и пишем "-item item_radiance". Не всегда все так просто. Например, если вы хотите получить буризу, вы наверное пропишите "-item item_daedalus". Вот тут вас будет ждать разочарование. Для некоторых артефактов не подходят их стандартные названия. А вот как все-таки получить свой заветный Daedalus - пишем "-item item_greater_crit". В конце этого руководства вы найдете полный список артефактов с их "читерскими" названиями.

-createhero [название героя] (без скобок)

Эта команда позволяет вам создать юнита или героя. Например, мы хотим создать героя Lina, Для этого необходимо прописать в чате "-createhero Lina". Герой появится в том месте, где находится ваш курсор. Если вы хотите создать вражеского героя, то в конце необходимо прописать слово enemy через пробел. Например, пишем "-createhero huskar enemy" и появится Хускар во вражеской команде, которого мы можем контроллировать. Команда позволяет также создавать нейтральных крипов, рошана и даже постройки. Если, мы хотим создать нейтрального юнита, то в конце чита необходимо прописать через пробел слово "neutral". Например "-createhero satyr_soulstealer neutral". Созданного сатира нельзя будет контроллироватьи он будет привязан к точке респауна. Небольшое замечание. Не всех героев можно создать, используя их стандартные имена, которые им дали в Dota 2. Например, чтобы создать Outworld Devourer'а, необходимо прописать в чат "-createhero obsidian_destroyer", а чтобы например создать тимбера "-createhero shredder". Поэтому в конце гайда, я приложу список героев и юнитов вместе с их читерскими именами.

-levelbots [число] (без скобок)

По аналогии с командой "-lvlup" увеличивает уровень, только на этот раз не вашего героя, а всех созданных вами ботов.

-refresh

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

-givebots [название предмета] (без скобок)

По аналогии с читом "-item", этот чит дает любой артефакт всем присутствующим на карте ботам. Как я говорил выше, полный список предметов, вы найдете в конце этого руководства

-wtf

При вводе в чат включается так называемый "WTF-mode". Этот чит убирает перезарядку у способностей, не позволяет зарядам способностей заканчиваться. При этом если вы используете способность или артефакт, то не будете тратить свою ману. 

-unwtf

Отключает "WTF-mode".

-disablecreepspawn

Останавливает автоматическое возрождение крипов. Что я имею ввиду, обычно, значит в доте как... Крипы сил света и тьмы появляются каждые 30 секунд рядом с бараками и идут в сторону врага по тропинкам. Нейтральные крипы появляются раз в минуту. Этот чит делает так, что крипы сил света, тьмы и нейтральные крипы перестают возрождаться.

-enablecreepspawn

Отменяет предыдущую команду и включает автоматический respawn крипов.

-allvision

Если прописать этот чит, то вы будете видеть не только от лица своей команды, но также и от лица команды вражеской. Этот эффект будет распространяться как на большую карту, так и на миникарту.

-normalvision

Собственно, команда отключает чит "-allvision". Вы снова получаете стандартную видимость от лица своей команды.

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

-clearwards

Команда убирает все Observer Ward, расставленные вами по карте. Все желтые!

-killwards

Команда убирает все Observer Ward и Sentry Ward, расставленные вами по карте. Все Желтые и Синие варды.

-spawnneutrals

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

-spawnrune

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

-startgame

Этот чит можно использовать в начале игры, чтобы мгновенно перемотать таймер до 00:00. При этом появятся первые руны и крипы побегут по тропинкам. 

Здесь я приведу 2 чита. Что первый, что второй чит, работают только в локальном лобби, только если в консоли предварительно прописать команду "sv_cheats 1". Прописывать их необходимо также в консоль, а не в чат, как все предыдущие читы.

dota_range_display [число] (без скобок)

Чит включает отображение окружности, центром которой, является ваш герой. Радиус окружности вы указываете сами. "Для чего нужен этот чит?" - Спросите вы. С его помощью можно быстро привыкнуть, например к дальности действия той или иной способности, или к дальности атаки героя дальнего типа атаки. Команда может быть полезна, чтобы научиться хорошо чувствовать зону получения опыта, например, если вы много играете на героях-хардлайнерах.

dota_camera_distance [число] (без скобок)

Регулирует расстояние камеры до героя. По умолчанию стоит 1134. Попробуйте, пропишите, например 1500. Повторюсь, оба этих чита будут работать, только в локальном лобби и только, если вы пропишите в консоль "sv_cheats 1".

 Radiant

 Dire

 Radiant

 Dire

 Radiant

 Dire

Рошан:

- roshan

Кобольды:

 - kobold

 - kobold_tunneler

 - kobold_taskmaster

Гноллы:

 - gnoll_assassin

Кентавры:

 - centaur_outrunner

 - centaur_khan

Призраки:

 - ghost

 - fel_beast

Урсы:

 - polar_furbolg_champion

 - polar_furbolg_ursa_warrior

Огры:

 - ogre_mauler

 - neutral_ogre_magi

Волки:

 - giant_wolf

 - alpha_wolf

Совы:

 - wildkin

 - enraged_wildkin

Сатиры:

 - satyr_soulstealer

 - satyr_hellcaller

 - satyr_trickster

Глиняные големы:

 - rock_golem

Тролли:

 - dark_troll

 - dark_troll_warlord

Маленькие тролли:

 - forest_troll_berserker

 - forest_troll_high_priest

Гарпии:

 - harpy_scout

 - harpy_storm

Древние ящеры:

 - big_thunder_lizard

 - small_thunder_lizard

Древние драконы:

 - black_dragon

 - black_drake

Древние големы:

 - granite_golem

 - rock_golem

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

РАСХОДУЕМЫЕ

╚═══════════════════════════════════════════════════════════════════╝

clarity.jpg  - item_clarity

enchanted_mango.jpg  - item_enchanted_mango

tango.jpg  - item_tango (item_tango_single)

healing_salve.jpg  - item_flask

smoke_of_deceit.jpg  - item_smoke_of_deceit

town_portal_scroll.jpg  - item_tpscroll

dust_of_appearance.jpg  - item_dust

animal_courier.jpg  - item_courier

flying_courier.jpg - item_flying_courier

observer_ward.jpg  - item_ward_observer

sentry_ward.jpg  - item_ward_sentry

bottle.jpg  - item_bottle

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

АТРИБУТЫ

╚═══════════════════════════════════════════════════════════════════╝

iron_branch.jpg  - item_branches

gauntlets_of_strength.jpg  - item_gauntlets

slippers_of_agility.jpg  - item_slippers

mantle_of_intelligence.jpg  - item_mantle

circlet.jpg  - item_circlet

belt_of_strength.jpg  - item_belt_of_strength

band_of_elvenskin.jpg  - item_boots_of_elves

robe_of_the_magi.jpg  - item_robe

ogre_club.jpg - item_ogre_axe

blade_of_alacrity.jpg  - item_blade_of_alacrity

staff_of_wizardry.jpg  - item_staff_of_wizardry

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

ВООРУЖЕНИЕ

╚═══════════════════════════════════════════════════════════════════╝

ring_of_protection.jpg  - item_ring_of_protection

stout_shield.jpg - item_stout_shield

quelling_blade.jpg  - item_quelling_blade

orb_of_venom.jpg  - item_orb_of_venom

blades_of_attack.jpg  - item_blades_of_attack

chainmail.jpg  - item_chainmail

quarterstaff.jpg  - item_quarterstaff

helm_of_iron_will.jpg  - item_helm_of_iron_will

broadsword.jpg  - item_broadsword

claymore.jpg  - item_claymore

javelin.jpg  - item_javelin

mithril_hammer.jpg  - item_mithril_hammer

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

МАГИЯ

╚═══════════════════════════════════════════════════════════════════╝

magic_stick.jpg  - item_magic_stick

sages_mask.jpg  - item_sobi_mask

ring_of_regen.jpg  - item_ring_of_regen

boots_of_speed.jpg  - item_boots

gloves_of_haste.jpg  - item_gloves

cloak.jpg  - item_cloak

ring_of_health.jpg  - item_ring_of_health

void_stone.jpg  - item_void_stone

gem_of_true_sight.jpg  - item_gem

morbid_mask.jpg  - item_lifesteal

shadow_amulet.jpg  - item_shadow_amulet

ghost_scepter.jpg  - item_ghost

blink_dagger.jpg  - item_blink

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

ОБЩЕЕ

╚═══════════════════════════════════════════════════════════════════╝

magic_wand.jpg  - item_magic_wand

null_talisman.jpg  - item_null_talisman

wraith_band.jpg  - item_wraith_band

poor_mans_shield.jpg  - item_poor_mans_shield

bracer.jpg  - item_bracer

soul_ring.jpg  - item_soul_ring

phase_boots.jpg  - item_phase_boots

power_treads.jpg  - item_power_treads

oblivion_staff.jpg  - item_oblivion_staff

perseverance.jpg  - item_pers

hand_of_midas.jpg  - item_hand_of_midas

boots_of_travel.jpg  - item_travel_boots

moon_shard.jpg  - item_moon_shard

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

ПОДДЕРЖКА

╚═══════════════════════════════════════════════════════════════════╝

ring_of_basilius.jpg  - item_ring_of_basilius

headdress.jpg  - item_headdress

buckler.jpg  - item_buckler

urn_of_shadows.jpg  - item_urn_of_shadows

tranquil_boots.jpg  - item_tranquil_boots

ring_of_aquila.jpg  - item_ring_of_aquila

medallion_of_courage.jpg  - item_medallion_of_courage

arcane_boots.jpg  - item_arcane_boots

drum_of_endurance.jpg  - item_ancient_janggo

mekansm.jpg  - item_mekansm

vladmirs_offering.jpg  - item_vladmir

pipe_of_insight.jpg  - item_pipe

guardian_greaves.jpg  - item_guardian_greaves

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

МАГИЯ

╚═══════════════════════════════════════════════════════════════════╝

glimmer_cape.jpg  - item_glimmer_cape

force_staff.jpg  - item_force_staff

veil_of_discord.jpg  - item_veil_of_discord

necronomicon.jpg  - item_necronomicon

 - item_necronomicon_2

 - item_necronomicon_3

dagon.jpg  - item_dagon

 - item_dagon_2

 - item_dagon_3

 - item_dagon_4

 - item_dagon_5

euls_scepter_of_divinity.jpg  - item_cyclone

solar_crest.jpg  - item_solar_crest

rod_of_atos.jpg  - item_rod_of_atos

orchid_malevolence.jpg  - item_orchid

aghanims_scepter.jpg  - item_ultimate_scepter

refresher_orb.jpg  - item_refresher

scythe_of_vyse.jpg  - item_sheepstick

octarine_core.jpg  - item_octarine_core

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

ОРУЖИЕ

╚═══════════════════════════════════════════════════════════════════╝

crystalys.jpg  - item_lesser_crit

armlet_of_mordiggian.jpg  - item_armlet

shadow_blade.jpg  - item_invis_sword

skull_basher.jpg  - item_basher

battle_fury.jpg  - item_bfury

ethereal_blade.jpg  - item_ethereal_blade

silver_edge.jpg  - item_silver_edge

radiance.jpg  - item_radiance

monkey_king_bar.jpg  - item_monkey_king_bar

daedalus.jpg  - item_greater_crit

butterfly.jpg  - item_butterfly

divine_rapier.jpg  - item_rapier

abyssal_blade.jpg  - item_abyssal_blade

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

БРОНЯ

╚═══════════════════════════════════════════════════════════════════╝

hood_of_defiance.jpg  - item_hood_of_defiance

vanguard.jpg  - item_vanguard

blade_mail.jpg  - item_blade_mail

soul_booster.jpg  - item_soul_booster

crimson_guard.jpg  - item_crimson_guard

black_king_bar.jpg  - item_black_king_bar

lotus_orb.jpg  - item_lotus_orb

shivas_guard.jpg  - item_shivas_guard

bloodstone.jpg  - item_bloodstone

manta_style.jpg  - item_manta

linkens_sphere.jpg  - item_sphere

assault_cuirass.jpg  - item_assault

heart_of_tarrasque.jpg  - item_heart

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

АРТЕФАКТЫ

╚═══════════════════════════════════════════════════════════════════╝

mask_of_madness.jpg  - item_mask_of_madness

helm_of_the_dominator.jpg  - item_helm_of_the_dominator

sange.jpg  - item_sange

yasha.jpg  - item_yasha

maelstrom.jpg  - item_maelstrom

diffusal_blade.jpg  - item_diffusal_blade

 - item_diffusal_blade_2

desolator.jpg  - item_desolator

heavens_halberd.jpg  - item_heavens_halberd

sange_and_yasha.jpg  - item_sange_and_yasha

eye_of_skadi.jpg  - item_skadi

mjollnir.jpg  - item_mjollnir

satanic.jpg  - item_satanic

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

ПОТАЙНАЯ ЛАВКА

╚═══════════════════════════════════════════════════════════════════╝

energy_booster_lg.png - item_energy_booster

point_booster_lg.png - item_point_booster

vitality_booster_lg.png - item_vitality_booster

platemail_lg.png - item_platemail

talisman_of_evasion_lg.png - item_talisman_of_evasion

hyperstone_lg.png - item_hyperstone

ultimate_orb_lg.png - item_ultimate_orb

demon_edge_lg.png - item_ultimate_orb

mystic_staff_lg.png - item_mystic_staff

reaver_lg.png - item_reaver

eagle_lg.png - item_eagle

relic_lg.png - item_relic

Спойлер:

╔═══════════════════════════════════════════════════════════════════╗

АЕГИС/СЫР

╚═══════════════════════════════════════════════════════════════════╝

 - item_aegis

 - item_cheese

-createhero [hero]
-createhero [neutral]
-item, -givebots

Возможно тебя также заинтересуют другие мои руководства на сайте Dota2.Ru

Гайды по героям:

 - Манта, башер - катка наша! Anti-Mage (6.85) [Guide]

 - Звезда смерти IO (6.85) [Guide]

 - Толстый и славный Lone Druid (6.85) [Guide]

 - Лунный бархат, нежный шелк luna (6.85) [Guide]

  - Crystal Maiden [Гайд] - С НОВЫМ ГОДОМ! (6.86)

  - Chaos Knight [Гайд] – АПОФЕОЗ РАНДОМА

  - Treant Protector [Гайд] – РОЖДЕННЫЙ БАОБАБОМ

  - bristleback [Гайд] - ЕЖИДЗЕ

Руководства по микроконтролю в Dota 2:

Основы микроконтроля

Продвинутый микроконтроль

Другие руководства:

Читы для практики [В лобби]

Как фармить крипов под башней?

Мгновенный закуп - Покупка любого артефакта в 2 кнопки (+скрипт)

Понравилось руководство? Узнал что-то новое?
Поставь, лайк! Это продвинет гайд в топ, а также вдохновит меня делать больше хороших руководств!

Коды на

- Dota 2 Вики

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

Помимо этого, игрок также может включить читы через консоль с помощью команды sv_cheats 1 . Многие консольные команды требуют этой команды перед работой, даже если игрок включил читы в настройках лобби.

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

Чит-команды

При включении читов в настройках лобби игроки могут использовать эти команды чата. Все эти команды также имеют эквивалент консольных команд, многие из которых можно использовать только после того, как хост включил sv_cheats .

-lvlup # dota_dev hero_level # Повышает уровень героя пользователя на #.Уровни забирать нельзя.
-уровневые боты # dota_bot_give_level # Повышает уровень героев всех ботов на #. Уровни забирать нельзя.
-lvlmax или

-уровень макс.

dota_dev hero_maxlevel Повышает уровень героя пользователя и все его способности до максимума.
-золото # dota_dev player_givegold # Предоставляет пользователю # unrel
.

сушков / Dota2LobbyBot: Бот для создания лобби в игре Dota2

перейти к содержанию Зарегистрироваться
  • Почему именно GitHub? Особенности →
    • Обзор кода
    • Управление проектами
    • Интеграции
    • Действия
    • Пакеты
    • Безопасность
    • Управление командой
    • Хостинг
    • мобильный
    • Истории клиентов →
    • Безопасность →
  • команда
  • предприятие
  • Проводить исследования
.

Создание бота DotA2 с использованием машинного обучения. Проблема | Мусаши Шредер

Разработка ресурсоэффективного алгоритма машинного обучения

Состав ботов

В декабре 2018 года создатели AI Sports провели презентацию и представили школе соревнование по искусственному интеллекту DotA2. DotA (Defense of the Ancients) - это игра, в которую играют две команды, каждая из которых состоит из пяти игроков, которые могут выбирать из более чем сотни разных героев. Цель игры - уничтожить базу противников, защищая при этом свою.Каждый герой имеет доступ как минимум к четырем уникальным способностям и может покупать предметы, которые также имеют разные способности. Предметы покупаются за золото, полученное за разрушение построек противника или за победу над игроками или крипами, юнитами NPC (неигровыми персонажами), которые появляются, чтобы помочь защищать и атаковать базы.

Сложность игры определяется не только составом персонажей, но и постоянно меняющимся состоянием карты. В играх с полной информацией, таких как шахматы или го, от игроков не утаивают никакой информации, что позволяет им видеть все возможные действия на доске в любой момент времени.Карта DotA включает в себя «туман войны», который скрывает любую часть карты, которую не видит игрок или его товарищи по команде. Способности каждого героя также имеют «кулдауны» - после того, как игрок использует способность, он не может использовать ее снова в течение определенного времени - и используют ману в качестве ресурса. Хотя игрок имеет доступ к этой информации о своих союзниках, он не имеет этой информации о противнике и должен принимать ее во внимание при участии в боях.

Правила соревнований заключались в том, чтобы запрограммировать полную команду из пяти ботов для игры в Captain’s Mode.Captain’s Mode устанавливает одного члена каждой команды в качестве капитана, давая им возможность выбирать героев для остальной команды, а также «запрещать» или выбирать героев, которых команда противника не может использовать. Чтобы избежать бана всех наших персонажей, нам нужно было запрограммировать как минимум шестнадцать из них. Наше ограничение, установленное Морисом, сотрудником 42 из Кремниевой долины, заключалось в том, что мы не могли использовать встроенные «желания», систему, обеспечивающую поведение по умолчанию для выполнения бота, предоставленную Valve. Вместо использования поведения ботов по умолчанию нам было поручено написать код снизу вверх.API для DotA2 написан на Lua и позволяет игрокам создавать собственных ботов. Первоначально соревнование было разработано для использования C ++ API, написанного

. Обзор поля битвы DotA с метками, изображение из https://dota2.gamepedia.com/Map

создателей AI Sports, но из-за «сложностей» наша команда вместо этого использовала Lua.

Изучение Lua и API

Чтобы создать бота, мы сначала прочитали API и искали другие примеры, созданные пользователями.API DotA был доступен в начале 2016 года, хотя не получал каких-либо значимых обновлений примерно с октября 2017 года. Первым ресурсом, который мы использовали, было руководство по началу работы, написанное RuoyuSon. RuoyuSon объяснил, где найти другие ресурсы и как запускать игры, а также рассказал о полезных консольных командах для процесса тестирования. Valve также предоставляет небольшие примеры сценариев ботов в каталоге игр, которые можно использовать для начала работы. С помощью API и других примеров мы наивно полагали, что сможем создать бота и получить грубую рабочую версию кода в течение недели.

Первым испытанием было выбрать героев, которых мы хотели использовать, и начать игру. В то время мы не знали, что если код для выбора героя содержит ошибку, вся игра вылетит, ничего не отображая. Пример, предоставленный Valve, можно использовать для быстрого создания кода выбора героя для режима All Pick, но его нельзя использовать для режима Captain’s Mode. Чтобы выбрать героев, мы читаем другие примеры кода. Хотя наша текущая версия бота позволяет игрокам-людям играть против него и вместе с ним, первоначальная версия предназначалась только для игры против другого бота в Captain’s Mode.Наконец, получение простой версии выбора героя заняло чуть больше недели, но с тех пор была изменена для поддержки режима All Pick и игроков-людей.

После запуска игры мы начали экспериментировать, заставляя героев ходить к локациям на карте. Мы быстро узнали, что незнание языка Lua затрудняло написание и понимание других примеров кода. Хотя мы могли заставить ботов ходить в определенные места или покупать предметы, мы часто допускали синтаксические ошибки, и поиск ошибок в коде занимал значительное время.После разочаровывающих двух недель нам потребовалось время, чтобы выучить язык, прежде чем снова приступить к работе с API.

Пока приближался турнир, мы все еще разбирались в Lua и боролись за понимание API. Наши герои переместились в правильные места, и они могли сражаться с вражескими миньонами и противниками, хотя и плохо, но они никогда не отступали, что приводило к смерти за смертью. Даже против самого простого бота по умолчанию, пассивного, мы не смогли победить. Мы реализовали грубую функцию отступления - просто приказывали ботам бежать на свою базу, если они получили слишком большой урон - это помогло, но оставляло желать лучшего.Нам удавалось постоянно побеждать пассивного бота, но обычно заканчивали игру с почти 100 смертельными случаями на нашей стороне, и нам посчастливилось увидеть две смерти на противниках.

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

Конечный автомат

До этого момента весь код был написан как предопределенные действия для выполнения каждым ботом. Сложность DotA постепенно делала все труднее и труднее различать, какие действия предпринимать и когда.Сражаться в этом случае или убегать? Когда нам следует сосредоточиться на борьбе с крипами? Хотя нам удавалось последовательно преодолевать пассивный уровень сложности, мы понимали, что легкий будет серьезным препятствием. Мы начали обсуждать возможные варианты и остановились на Государственном автомате.

Пример конечного автомата

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

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

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

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

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

Во время тестирования патентованных ботов Valve нам часто приходилось перезапускать игры из-за проблем совместимости с их ботом и Captain’s Mode.Мы решили сделать собственный режим подбора для двух команд, чтобы ускорить процесс и сократить количество ненужных перезапусков. Мы выделили ботов соперника случайную команду из пяти человек и использовали эту команду на протяжении большей части нашего тестирования. В то время мы не знали, что это вернется, чтобы укусить нас позже.

Наша команда продолжила работу с State Machine, добавляя новые варианты поведения, которые мы не могли реализовать раньше. По мере того, как поведение увеличивалось, мы также стали замечать улучшения в наших матчах с ботом Valve.После победы над Easy, в течение 24 часов мы смогли обыграть Medium, а на следующий день победили Hard и Unfair подряд. Мы были в восторге, не ожидая победить Unfair намного позже, но когда мы решили присмотреться к ботам противника поближе, у нас отвисла челюсть. Два бота нашего оппонента не покупали предметы, а один не использовал никаких способностей. Хотя мы смогли победить, что само по себе было подвигом, это не была настоящая победа над ботом Unfair.

Мы не знали, что Valve реализовала использование определенных навыков и покупку предметов только для 46 ботов.Мы изменили состав соперника на пять таких ботов, и хотя мы могли хорошо бороться с Hard и выигрывать примерно в сорока процентах случаев, мы редко выигрывали у Unfair. Мы начали больше обсуждать, что мы можем сделать, чтобы увеличить наш винрейт, что привело к первому изменению нашего состава. Посмотрев на героев, которых мы реализовали, а на тот момент их было всего пять, мы решили заменить героев, которые, будем надеяться, лучше впишутся в наш общий план игры. Сразу же мы увидели рост, и, хотя мы и привязались к героям, которых выбрали использовать, мы начали рассматривать замену героев как вариант, продолжая программировать.

Сбор данных

Мы продолжали внедрять больше вариантов поведения в конечный автомат, добавляли больше функций и, как и мы, наблюдали медленное, но неуклонное повышение производительности в наших матчах. Чтобы увидеть, насколько хорошо мы справились с добавлением чего-то нового, нам нужно было посмотреть полную игру, чтобы увидеть конкретное поведение и узнать, выиграли ли мы матч. Все веса бота были настроены вручную, и любые изменения, которые мы внесли, могли быть невидимы в рамках одной игры. Даже в ускоренном режиме игра длилась от десяти до пятнадцати минут.Чтобы собрать какие-либо значимые данные, мы могли бы часами просто наблюдать. Чтобы ускорить этот процесс и убедиться, что любое добавленное нами изменение было значимым, с помощью Python, языка программирования Go и Docker мы начали создавать способ сбора данных по сотням игр.

Морис дал нам доступ к пятнадцати компьютерам, на которых мы могли запускать игры и собирать данные. На этом этапе мы исследовали «безголовый» режим для DotA; мы могли запускать игры без графики, что ускоряло сами игры и позволяло запускать несколько экземпляров игры без использования графического процессора.Используя Docker, мы настроили соединение клиента с сервером, что позволило нам использовать виртуальные машины на четырнадцати из этих компьютеров. Мы подсчитали, что можем оптимально запустить до четырех игр на одном компьютере, поэтому четыре виртуальные машины запускались с шестикратной скоростью. В целом мы смогли запустить игры примерно в 300 раз быстрее, чем изначально.

Каждая игра может длиться от пятнадцати до восьмидесяти минут. Docker Swarm равномерно распространил общее количество запрошенных игр на все наши рабочие компьютеры.Если бы мы запускали менее 56 игр, это решение было бы хорошо, но что-то большее было бы неоптимальным. Первоначально мы пытались выполнить развертывание с помощью Docker Swarm, но для нас было разумнее создать собственное решение. Он должен быть настраиваемым, хорошо работать в распределенной сети и иметь поддержку простого параллелизма. Мы решили использовать Go, потому что он соответствовал нашим критериям и был прост в сборке и развертывании. Наконец, Python был использован для построения графиков и иллюстрации наших результатов данных в виде гистограмм и линейных графиков.

Данные, показывающие выигрыши и проигрыши во времени

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

В последние недели мы поиграли с идеей включения генетического алгоритма. Все веса конечного автомата были настроены вручную и основаны на наших наблюдениях.В частности, наши веса «Ферма», «Охота» и «Отступление» были настолько тесно связаны друг с другом, что, изменив значение одного, мы увидели бы резкие различия в их способах игры, и их процент побед в целом уменьшился бы. Мы знали, что они в хорошем состоянии, но были уверены, что они не оптимальны, особенно учитывая, что разные персонажи играли по-разному, и использование одинаковых весов заставляло их всех играть более или менее одинаково. Использование генетического алгоритма будет использовать машинное обучение для настройки каждого веса, давая нам самые идеальные числа, чтобы победить ботов по умолчанию и, надеюсь, наших оппонентов в турнире.Амбициозной целью было создать разные гены для каждого персонажа, тем самым дать каждому из них свой уникальный стиль игры, но мы знали, что без дополнительного времени и вычислительных мощностей нам придется обходиться вручную настроенными весами.

За неделю до соревнований мы отошли от добавления основных функций, включив лишь небольшие изменения, которые, как убедительно доказали наши данные, увеличивают процент побед. В конце концов, с помощью State Machine мы смогли добиться стабильного выигрыша выше 98% против ботов Valve.Готовый к участию в конкурсе, Морис написал нам, что в очередной раз конкурс был продлен еще на месяц.

Генетический алгоритм

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

Блок-схема генетического алгоритма, от arwn

Чтобы заставить генетический алгоритм работать, нам нужно было запустить несколько итераций нашего бота.На основе этих итераций мы брали гены пяти лучших героев и «скрещивали» их, перемешивая, усредняя и соединяя вместе. Следующее поколение будет состоять из слегка модифицированных версий (с использованием 10% вероятности мутации, чтобы выбрать, какие гены изменить, и 10% вероятности мутации, чтобы изменить каждый ген на соответствующую величину), по которым мы затем будем собирать данные, повторяя процесс. до начала конкурса. Наш план состоял в том, чтобы заменить текущие гены, настроенные вручную, на наши новые гены с машинным обучением.

Нашим первым шагом было убедиться, что мы можем запустить генетический алгоритм с помощью Go и Docker и одновременно изменить сценарий Lua. Ген каждого бота представлял собой Lua-файл, содержащий значения, которые мы хотели изменить с помощью генетического алгоритма. Мы использовали Go для чтения файла гена, мутации значений и вывода нового гена с использованием шаблона гена. Затем новые гены использовались для последующих итераций.

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

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

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

В конце концов, примерно через четыре дня после запуска и остановки генетического алгоритма, он наконец заработал. Запустив генетический алгоритм и убедившись, что он работает, мы решили изменить состав нашей команды в пользу того, который, по нашему мнению, может повысить наш процент побед.Когда мы начали запускать генетический алгоритм и настроили гены, которыми мы хотели манипулировать, как команда, мы просмотрели их и скорректировали их до чисел, которые, по нашему мнению, имели смысл для запуска генетического алгоритма. В то время мы решили манипулировать примерно 25 компонентами и условиями, «генами» из наших весов Farm, Hunt и Retreat. Это изменение в сочетании с новым выбором героев, который мы использовали для команды противника, снизило наш процент побед с 98% до 80%. В то время как генетический алгоритм медленно повышал процент побед, мы поговорили как команда и решили, что, если мы сможем повысить его, переключая или добавляя героев на ранней стадии, его стоит протестировать.После переключения начальные 80% приблизились к 90%.

Пока мы наблюдали за ботом, мы знали, что время истекает и он недостаточно быстро растет. Хотя это было рискованное решение, которое могло привести к потенциально резкому снижению процента побед, мы решили скорректировать скорость изменения с 10% вероятности мутации и 10% частоты мутации до 15% и 25% соответственно. Мы подсчитали, что в самой идеальной ситуации для того, чтобы избавиться от бесполезного гена, потребуется не менее тридцати поколений или не менее одной недели.Мы хотели уменьшить это число и полагали, что если мы увеличим его вдвое, то увидим более высокие темпы изменений, к лучшему или к худшему. После нескольких дней наблюдения за результатами наш риск окупился, и бот увидел более быстрое и последовательное увеличение числа побед.

Рост приспособленности с течением времени

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

.

Смотрите также