Обучи ИИ в WC3

Published

Начало

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

Что надо делать?

— Минимальный набор действий это: скачать карту, запустить на ~30+ минут. Ввести слово "save". Дождаться появления файла по пути ./save/GA_test_01/Cod.txt. Скинуть. Лучший найденный скидывается вам обратно. И так несколько раз =)

Кратко об ии

— Каждый объект представляет собой кольцевую цепочку команд. Каждая команда является точкой на отрезке. Проекция дерева решений на отрезок однозначно соотносит точку и конкретное решение.
» Примерный список команд
  • Сравнить
    • Число
    • Юнит (случайный, ближайший, дохлый)
      • Жизнь
      • Дистанция
      • Количество
    • Зомби (...)
      • Жизнь
      • Дистанция
      • Количество
    • Я
      • Жизнь
      • Отклонение времени
      • Отклонение времени2
    • Кольцо
      • Положение
      • Дистанция
    • Центр
      • Дистанция
  • Сделать
    • Я
      • Остановится
      • Инвиз
    • Юнит (...)
      • Бежать
      • Атаковать
      • Проколоть
    • Зомби (...)
      • Бежать
      • Атаковать
      • Проколоть
    • Зона
      • К
      • От
      • Вправо
      • Влево
    • Пространство
      • Наверх
      • Вниз
      • Направо
      • Налево
» Другие вопросы
Как сохранить ИИ?
Для сохранения лучшего экземпляра введите слово "save". Файл кода будет лежать в папке варкрафта ./save/GA_test_01/Cod.txt
Могу я сохранить понравившийся ии?
Да, для этого нажмите на юнита и введите слово "s save". Код сохранится, даже если юнит умрет до конца условного раунда.
Можно загрузить сохраненный ии?
Да, введите слово "download". В начале следующего раунда он будет загружен и подключен.

Ехало

Первое видео
Задача - прожить как можно дольше
Приветствую вырезки интересного поведения, а также предложения по улучшению обучающей среды и внутренних механизмов.
Скачать:
v02 Динамичное кольцо:
03 KodG3_king of the mountain.w3x оцениваются убийства и количество выживших
Можете улучшить готовый вариант или собрать свой с нуля Cod.txt
v01 Статичное кольцо:
02 KodG3_kill_and_life.w3x оцениваются убийства и жизни
01 KodG3_only_kill.w3x оцениваются только убийства
Пишите, какую разницу в поведении юнитов обучаемых разным способом вы заметили.


Views: 690

» Лучшие комментарии


dondonchakka #1 - 3 months ago 1
Голосов: +1 / -0
не понятно что по этому текстовику можно загрузить ии в карту и он будет играть в карту как ты?
Vlod #2 - 3 months ago (изм. ) 1
Голосов: +1 / -0
Здравствуй, мы сохраняем его в файл, чтобы потом иметь возможность пользоваться сразу готовым или продолжить обучение
dondonchakka #4 - 3 months ago 2
Голосов: +2 / -0
не понятно ничего вышел вот такой маленький код который к ии не относится)
Прикрепленные файлы
Vlod #5 - 3 months ago 1
Голосов: +1 / -0
Спасибо! Если не очень понятно что это и зачем, можете посмотреть видео. Архитектура и принцип работы почти такой же
dondonchakka #6 - 3 months ago 1
Голосов: +1 / -0
Vlod:
Спасибо! Если не очень понятно что это и зачем, можете посмотреть видео. Архитектура и принцип работы почти такой же
ну могего мозга для этого не хватит я привык как в доте за красивые глазки)
ScorpioT1000 #7 - 3 months ago 1
Голосов: +1 / -0
Это back propagation или генетический алгоритм? Больше бы конкретики
Vlod #8 - 3 months ago 1
Голосов: +1 / -0
ГА, back propagation обучает классификаторы, а тут экземпляр ии это цепочка команд
ScorpioT1000 #9 - 3 months ago 1
Голосов: +1 / -0
Так ты сколько будешь обучать на такой скорости их? Там надо десятки тыщ итераций хотябы

Нужен speed multiplier
Vlod #10 - 3 months ago 1
Голосов: +1 / -0
Да не сцы, в прошлый раз нейронка максимум за пару часов обучалась. Лучше скажи, почему ресурс твой лайк дропнул(
ScorpioT1000 #11 - 3 months ago (изм. ) 2
Голосов: +2 / -0
Лучше скажи, почему ресурс твой лайк дропнул

В тему: интересный канал www.youtube.com/c/PrimerLearning/videos
Они тренируют именно генетические алгоритмы с крутой визуализацией
IIIНекромантIII #12 - 3 months ago 1
Голосов: +1 / -0

Не особо понял что к чему, но после часа работы вместо бессмысленного мордобоя все начали заниматься бессмысленным бегом по кругу( при чем одни по часовой стрелке, а другие против часовой).
Прикрепленные файлы
dondonchakka #13 - 3 months ago 1
Голосов: +1 / -0
лол што что у меня что у него одинаковый код чем это поможет?
Vlod #14 - 3 months ago 1
Голосов: +1 / -0
dondonchakka, межпопуляционный отбор имеет более широкий охват решений

IIIНекромантIII, все верно. Для сохранения жизни и в условиях бесконечного спавна зомби избегание боя является эффективной стратегией. Учитывая, что зомби достаточно мало и их скорость низка

ScorpioT1000, да, визуализация крутая конечно
Bergi_Bear #15 - 3 months ago (изм. ) 1
Голосов: +1 / -0
Так я запустил, пока что ничего не понимаю, сижу читаю и сразу вопрос... помните, в нативном редакторе ИИ (который для Мили) можно было увеличивать скорость, если ли какие -то варианты изпользовать эту скорость для таких вот ИИ? и для тестов вообще?
Замахи выглядят ужасно, когда стоят друг на против друга и походу приказ атаки очень часто отдаётся

Что значит сохранить понравившийся ИИ?
на карте бегают безымянные крестьяне, только крестьяни игрока, при клике показано рандомное число, но врядли оно как то привязано к ИИ
Как я могу узнать что мне кто-то понравился, если они живут по 30 сек?
Да, для этого нажмите на юнита и введите слово "s save".
0.346 save
это от ошибка или номер ИИ?
bifurcated #16 - 3 months ago 2
Голосов: +2 / -0
На карте kill and life в начале они просто ходили кругом и использовали невидимость по кд, пытаясь выжить, потом вдруг это им надоело они начали использовать стан способность только по зомбакам, но потом начали её использовать и по рабочим вроде тоже по кд, а может когда у них меньше здоровья. Итог по золоту 250.
На карте kill они используют стан только по зомби, как я понял, а между собой только на кулаках. Невидимость почему-то перестали использовать, но это наверно ненадолго. Итог по золоту 500.
Всё же на карте kill and life они более развились под конец исследования. Обе карты запускал в одно время.
Прикрепленные файлы
Bergi_Bear #17 - 3 months ago 2
Голосов: +2 / -0
KodG3_kill_and_life - полтора часа
Но поведении ИИ не менялось примерно уже с 10 минуты, они бегали по широкому кругу, дергались при атаке, давали импалу по кд
Прикрепленные файлы
IIIНекромантIII #18 - 3 months ago (изм. ) 0
Голосов: +0 / -0
все верно. Для сохранения жизни и в условиях бесконечного спавна зомби избегание боя является эффективной стратегией. Учитывая, что зомби достаточно мало и их скорость низка
Ну, если это всё на что этот ии способен, то у меня плохие новости для тебя... Vlod, они бессмысленны и бесполезны, хотя может ты просто хочешь сделать что-то более грандиозное, но на данном этапе наблюдать за ботами все равно что смотреть на инфузорий в микроскоп - большинству будет скучно.

Вот если б это была арена где ИИ-шки дрались за жизнь или какая-нибудь командная соревновательная игра, чтоб ИИ учился драться в команде не прибегая ни к какой коммуникации, тогда да, было бы в разы интересней. А так я смотрю за тем как болванчики учатся бегать по кругу. И каждый раз они будут приходить к этому решению, что просто лишает смысла весь этот ИИ, ведь результат будет одинаков, но вот если бы они каждый раз по новому адаптировались или стратегии странные придумывали, но нет они просто будут бегать по кругу...
А хотелось бы чего-то большего.
Vlod #19 - 3 months ago (изм. ) 1
Голосов: +1 / -0
IIIНекромантIII, для того чтобы тестировать ботов на арене ее нужно сначала написать)
По поводу оригинальности решения, ну кто ж знал, что беспрерывно бегать - наилучший вариант увернуться от всех атак стандартного ии, а бегать по кругу это всего 1 команда, куда проще. В таком случае предлагаю придумать усложнение задачи ботам

Bergi_Bear,
Да, бот выдает решение каждые 0.33 и вар сбивает приказ, даже если цель одна и та же. Увеличу скорость атаки, чтобы удар проходил
Сохранить понравившегося можно, если за эти 30 секунд написать s save)
Число при клике это JobEnd[] - оценка юнита за предыдущий раунд. Если его пересоздали, то она 0
IIIНекромантIII #20 - 3 months ago 0
Голосов: +0 / -0
Vlod, если честно, то вот к данному примеру никакого усложнения не придумывается, но есть другая мысль - поменять задачу.

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

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

Усё.На этом наше творческое,того этого, окончено.
Vlod #21 - 3 months ago (изм. ) 0
Голосов: +0 / -0
bifurcated, спасибо за развернутое описание. Они могут использовать или не использовать что то, и это зависит от начального рандома. Как повлиял тот или иной фактор иногда вычленить очень сложно. Как я заметил, если при определении родителя учитывать остаточное количество жизни (kill and life), то особи в популяции получаются в среднем менее агрессивными к своим сородичам
Vlod #22 - 3 months ago 0
Голосов: +0 / -0

Обновление
  • Локация с сужающимся кольцом;
  • Полноценная система раундов;
  • Теперь приоритеты поощрения зависят от убийств и от числа выживших.
IIIНекромантIII #23 - 3 months ago 1
Голосов: +1 / -0
Прикрепленные файлы
bifurcated #24 - 3 months ago 1
Голосов: +1 / -0
Динамическое кольцо: Жёлтый работник придерживается тактики самоубийства (выходит за круг), остальные движутся в центр используя способности (этот интеллект не может понять, что атака из-под невидимости наносит больше урона и что можно использовать шипы примерно там, где работник исчез? Да и обычно под невидимостью они стоят на месте, иногда идут чуть ближе к дереву). Зомби не выживают. Итог по золоту 1100.
Прикрепленные файлы
Bergi_Bear #25 - 3 months ago 0
Голосов: +0 / -0
Кстати по поводу атаки из невидимости, если мне не изменяет память ии не способен совершить атаку из инвиза
Yagosha #26 - 3 months ago 0
Голосов: +0 / -0
Образовалась одна интересная особь, чьё поведение заметно отличается и выглядит умнее остальных) Все сначала сразу бегут в центр, сбиваются в одну кучу с зомбаками, и начинают применять шипы, пока не перебьют всех зомби, задевая друг друга, после чего продолжают болтаться возле дерева, уходя в инвиз, но друг к другу агрессии не проявляют. А этот предпочитает остаться в стороне, а когда в центре перебьют всех зомби, подбегает и осторожно пытается добить выживших, ударил, отбежал, ударил, отбежал.
Прикрепленные файлы
Vlod #27 - 3 months ago 0
Голосов: +0 / -0
IIIНекромантIII, спасибо! Про усложнение, удерживать флаг от кого, от зомби?) Просто бегать и стоять возле рандомных флагов легкая задача. Отмечу, что хоть мы и видим много юнитов, на самом деле мы обучаем одного. Если требуется два типа, то нужно создать две группы, одной сказать защищать, а другой нападать, тогда получатся кери и хиллеры, к примеру. С другой стороны мы обучаем группу, поэтому можно не разделять, кто то случайно станет хиллером, а кто то кери, а мы будем брать детей от двух случайных выживших, но в таком случае желательны более жесткие условия выживания и больший размер популяции.
Esea #28 - 3 months ago (изм. ) 2
Голосов: +2 / -0
Хм... у меня частые забеги за кольцо, при том бывает достаточно забавная ситуация когда один бежит за другим а тот бежит за кольцо.
Vlod #29 - 3 months ago (изм. ) 0
Голосов: +0 / -0
bifurcated, придерживается тактики самоубийства - звучит забавно) 1) Урон от инвиза я убрал см. РО 2) Все команды no target - указание в виде области или точки. По этому он физически не может никого ударить из инвиза, ему не дает вакрафт. Да таргет система в управлении стара как мы, по этому хотелось уйти от нее. Но спасибо за наводку, кажется я понял откуда дерганья у стандартной атаки. Сейчас ии как может узнать что он в инвизе? Нажать на инвиз и получить в ответ false. Не слишком удобный способ) Логично добавить ему флаг проверки на бафф, пока систему команд не трогал для совместимости Cod.txt между картами. Сам список команд добавил в описание. Спасибо!

Bergi_Bear, из инвиза да, только impale пустить.
Возможно, дерганья были из за отдачи кучи команд атаки в точку в один тик. Попробую сменить это на цель-объект и проверить.
function action_who_attack takes integer ind, unit tu returns boolean
  return IssuePointOrderById(Men[ind], 851983, GetUnitX(tu), GetUnitY(tu))
endfunction

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

Esea, бывает и паровозик из трех) Помните, что каждый кон один из слабых заменяется на абсолютно рандомного. А те, что имеют ауру меткости - либо дети двух случайных лучших, либо тоже два рандома
Esea #30 - 3 months ago 3
Голосов: +3 / -0
Первый мой сейв (статическое кольцо убийства и жизни). Даже не знаю что сказать. Заметил 2 интересных персонажей: коричневый который то бегал на небольшое расстояние туда сюда рядом с деревом то вообще убегал за кольцо, и красный который один раз наматывал круги рядом с кольцом, но умер забежав за него (видимо его беговой круг расширялся). Ну и еще не могу смотреть на бесполезные инвизы и неравноценные размены ударами.
Прикрепленные файлы
IIIНекромантIII #32 - 3 months ago 0
Голосов: +0 / -0
удерживать флаг от кого, от зомби
Друг от друга.

Ну, я не особо понимаю чему можно научить такую штучку, да и есть ли смысл учить чему-то, кроме как для собственного удовольствия.
Yagosha #33 - 3 months ago 1
Голосов: +1 / -0
Я оставил на ночь несчастных ботов развиваться в их бессмысленном мире. Теперь уже они пытаются в первую очередь убить друг друга, а не зомби и, что самое главное, научились уверенно бить киркой, без сброса приказа!

Прикрепленные файлы
Vlod #34 - 3 months ago 2
Голосов: +2 / -0
Esea, движение по кругу оказывается движением по спирали из за погрешности, поэтому юниты, которые не учитывают дистанцию до кольца, будут нещадно уничтожены)
Смотри, пользоваться инвизом по кд явно лучше, чем вообще им не пользоваться, а поиск правильного условия задача более сложная. Сначала ребенок учится двигать ногами, а потом уже бегать кросс, тут то же самое

IIIНекромантIII, в целом идея понятна. Надо будет увеличить количество ботов как минимум вдвое. Надеюсь вар справится.
Такую штуку можно научить чему угодно: строить города, сажать деревья, искать ягоды, драться, эмулировать спрос и предложение - рынок. Все зависит от доступных команд. Наш ии предназначен для управления одним или группой однотипных юнитов и делать может только то, что заложено в его самые команды)

Yagosha, воо, похоже ваши боты развились дальше всех! Это очень важно, так как ранее некоторые ссылались на дерганья киркой во время удара. Хотя со временем ГА легко оптимизирует положение команд.
На этой карте бонусы даются за убийства и за малое число выживших работников. Интересно, что с течением времени вторая задача перетягивает первую
Yagosha #35 - 3 months ago 0
Голосов: +0 / -0
Vlod, вы только посмотрите на красного чемпика в видео, как он держит дистанцию и маневрирует, ни разу не подставился, и ему не хватило буквально секунды чтобы добрать синего. Он доминировал ещё парочку раундов, а потом в его голове что-то щёлкнуло и, к моему огорчению он почему-то решил самоликвидироваться и целенаправленно убежал за круг в самом начале :(
Vlod #36 - 3 months ago (изм. ) 0
Голосов: +0 / -0
» оценочная таблица двух раундов из видео
раунд_1раунд_2
10_451 7_403
7_369 10_397
5_366 4_346
4_352 1_345
2_348 5_336
0_294 2_325
9_275 0_318
1_256 9_258
11_084 3_044
3_077 11_038
8_000 8_000
Yagosha, так как этот чемпик красного цвета, то имеет индекс 0. Как видно из таблицы, он имеет рейтинг ниже среднего. Возможно, это связано с низким количеством убийств.
Все, кто попадают в последнюю четверку, будут перезаписаны. Скорее всего, это с ним и произошло. Как раз для таких случаев была создана команда s save)
ScorpioT1000 #37 - 3 months ago (изм. ) 0
Голосов: +0 / -0
Помните, что каждый кон один из слабых заменяется на абсолютно рандомного. А те, что имеют ауру меткости - либо дети двух случайных лучших, либо тоже два рандома
Жесть, ты еще и умышленно замедлил скорость эволюции) рекомендую почитать материалы по теме

В целом интересно выходит, но надо докидать лейеров и скорости апнуть, пока все это очень не научно и тратите своё время цпу
Desgul #38 - 3 months ago 0
Голосов: +0 / -0
Можно добавить возможность заключать союзы между собой
Уменьшать зомби по 1 каждые 3-5 раунда и сделать в конце концов 1 зомби с большем количеством хп и атаки, так же добавить возможность лечение рабочим, сделать возможность выбора типа класса танк маг лекарь дд, будут ли они выбирать правильно что бы убить сильного зомби, вот что то подобное, возможно я что то не то предлагаю=)
Vlod #39 - 3 months ago 0
Голосов: +0 / -0
ScorpioT1000, ускорил на пару порядков за счет введения дополнительных генетических операторов. Если есть конкретные предложения, пиши)

Desgul, можно дать им возможность общаться для заключения союза, по типу голосового чата, но как они его будут использовать... вопрос
будут ли они выбирать правильно что бы убить сильного зомби
Тут лучше сравнить с реальной ситуацией в игре, если ты видишь, что мало танков, берешь танка, но этот выбор делается единожды в начале игры и не особо влияет на то, как ты умеешь отыгрывать за танков. Виду к тому, что мы можем одного ии научить хорошо играть за разных персонажей, это да, хотя и эффективнее будет обучать индивидуально. Но заниматься подбором правильной комбинацией персонажей должен заниматься отдельный алгоритм (задача лидера)
Desgul #40 - 3 months ago 0
Голосов: +0 / -0
Vlod, а что если им дать например голосование за кого кто будет играть по истечению нескольких раундов, то есть не сразу, например 1 из юнитов оставался последним живым вот и ии должны выбрать его в роле танка
МрачныйВорон #41 - 3 months ago (изм. ) 1
Голосов: +1 / -0
Vlod, сделай задачу поинтереснее. знаешь карту Necris? там есть три базы: Альянса, Орды, Эльфов. Каждая расположены по углам. На них иногда нападает нежить. То посылают по одному, то всем скопом. Вроде играл часто в сингле, и приходилось одному бегать одним героем и помогать ботам-союзникам отбиваться. Игра не сложная. Но одному там просто не выжить, в начале ты слаб, а в конце толпа нежити просто окружает героя, и он мрет. Но интереснее так, бегать там, там. Надо успевать помогать.
Там сложность только прокачаться вначале, но со временем и Нежить становится сильнее. Пробовал играть в мультиплеере, и скажу, что чем больше игроков тем легче играется, тк крипов становится меньше. И интерес теряется. Тк бот нежити туповат
Иногда думал добавить ИИ больше интеллекта. К примеру как окружить героя-одиночку, вышедшего погулять, или раздербанить базу союзника - без баз герои-одиночки ничего не смогут сделать.
у эльфов 3-4 прохода, база огорожена деревьями
у альянса 2 прохода, база огорожена клиффами, удобно пристроились
орки 3 прохода окружена скалами
Сколько проходов, а дурачки-скелетосы прутся через основной. Им не хватает мозгов действовать неординарно. Они всегда идут по короткому пути. И брать всякие тактики. Нападать скопом в менее защищенные точки, отвлекать, атаковать/херачить воздухом, катапультами. Но и с защитой у ИИ нежити проблема. у нежити много производных здании, и для ослабления натиска нежити нужно их сносить. Но не всегда защищает.

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

а еще помню эту тему кстати у меня есть наработка, где рабочие ходят сами косят, копают, сеют семена, собирают. Хотел сделать систему, чтобы они сами все делали после отдачи указании. Это даже интереснее получилось
Vlod #42 - 3 months ago (изм. ) 0
Голосов: +0 / -0
МрачныйВорон, я тебя понял. Смотри, сейчас 10 юнитов могут атаковать, убегать, лечить друг друга - действовать слаженно, но они будут вести себя так, как если бы ими управляли 10 различных игроков. Если нужна скоординированная атака с разных сторон нескольких групп юнитов, то ими желательно должен управлять один ии. То есть это не управление юнитом, а управление армией. Представим список его команд: разделить на два отряда, разделить на три, отделить летающе войска, послать вторую группу к первому проходу, начать строительство юнита, группы юнитов. Тут работы непочатый край, да и вопрос к реализациям некоторых команд) Если есть идеи команд и конкретная карта для тестирования, то могу помочь с реализацией. А этот ии планировался для выполнения задач типа: разбойники нападают на караван/деревню, где решения убегать нападать принимаются либо лидером, либо голосованием, о чем упоминал Desgul, или наемник взял квест убить медведя и пошел на его поиски -- симуляция естественных процессов каждой личности отдельно.

С его помощью можно изменить поведение монстров, которые обычно тупо стоят или патрулируют в РПГ данжах на более разнообразное
ScorpioT1000 #43 - 3 months ago 0
Голосов: +0 / -0
В NPC было бы круто поддерживать самообучение в процессе самой игры, но генетиками это врятли добиться (разве что в fps и жанрах, где боты учатся с каждым раундом)
Vlod #44 - 3 months ago 0
Голосов: +0 / -0
А как тогда развивались бактерии, насекомые, растения, люди, если не в процессе самой жизни
ScorpioT1000 #45 - 3 months ago (изм. ) 0
Голосов: +0 / -0
Vlod, игра на миллионы лет?)
тут бы помогло обучение с подкреплением, а не отбором лучших результатов с каждой генерацией
по аналогии метода проб и ошибок, здесь и приходит back propagation (изменение весов градиентным спуском)
Vlod #46 - 3 months ago (изм. ) 0
Голосов: +0 / -0
ScorpioT1000, откуда у вас такие цифры, мы же не людей создаем.
Причем тут back propagation и представленный код-геном, где цепочка команд, как днк, а не веса нейросети. Какое обучение с подкреплением, откуда мы знаем, какое поведение лучше, а какое не лучше. Если необходимое поведение известно заранее, то не проще ли его вбить сразу и не париться с самообучением?
pro100master #47 - 2 months ago 0
Голосов: +0 / -0
ну создаете нейроный сеть и популяции 100 человек за 1 час они станут богом в игре.
habr.com/ru/post/336612 Я тоже его применяю в игре не варкрафте а другом месте.
Vlod #48 - 1 month ago 0
Голосов: +0 / -0
pro100master, работу с ии типа классификатор описывал тут Хотелось бы, но на jass 100 сетей игру сильно грузят
Vlod #49 - 4 weeks ago 0
Голосов: +0 / -0

Челлендж завершен, всем спасибо!

PS Добавил комментарии в KodG3_king of the mountain для тех, кто хочет разобраться в том, как всё работает