Как стать автором
Обновить

Комментарии 34

Читаю и все подходы прямо по игре supcom: youtu.be/Egsb6Fsz2kI

— харрас рабочих (экономики) противника;
— заманивание сил противника;
— определенная экономика для определенной местности и определенного удара по времени игры (для многих карт билды (стратегии) рассчитаны вплоть до 25-30 минут игры, т.е. зерграш или late game)
— победы достигаются через наглые тактики или фейлы противника и реже через давление лоб в лоб;
— использование ландшафта;
— абьюз механик игры (в supcome это строительство зданий на пути противника, требует сильного микроконтроля или взрыв ядерной ракеты об летающие самолеты)

Да во всех киберспортивных стратегиях так, возьмите ту же доту — всё это есть и там.

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


Накидал в фотошопе пример

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

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

А лечить лучников не кто не пробывал? И сколько за такт лечит один строить?

Пробовали. У меня раненный лучник отбегает к ближайшему рабу для лечения. Лечит 1 хп за тик. А у Recar-а более продвинутое лечение, у него вроде даже медики есть на поле боя, специально бегают в паре с лучниками…
Смысла в полноценных медиках вообще нет никакого, разве что пара штук на всю армию. Если идёт чистый размен, то 1 хп позволяет пережить лишний выстрел. А дальше лечить нет смысла, ибо разницы между 1 и 5 хп нет, как и между 6 и 10. А тратить 4 лишних хода явно не нужно, за это время и покопать или дойти куда-нибудь можно.
Все правильно, лечение обычно до 6 хп. И учитывая, что лучники дорогие, когда их много — то это того стоит.

Насчет медиков, ну вот как у меня было с Recar-ом. Допустим 2 в 2, но рядом с одним из его лучников стоит медик. Мои вообще это никак не учитывают и стреляют в того, кто рядом с медиком. В итоге его лучник выживает с 1 хп, а мой один погибает. Т.е. если бот недостаточно умный, чтобы учитывать такие вещи, то может быть очень больно.

В целом согласен насчет того, чтобы иметь не более 1 — 2 в гуще боевых действий.
Но бывают разные ситуации, например, когда бот защищается, и рабочие уже рядом, то они могут естественным образом выступать в роли медиков, тогда не сильно накладно.
Лечение же происходит после атаки. Разве может лучник выжить, если в него стреляют два других лучника?
Возможно приврал… Но что-то подобное видел, когда просматривал повторы.
А можете сказать, как движок вообще обсчитывает последовательность действий? Есть ли приоритеты у определённого типа? К примеру, можно ли просто «уворачиваться» от стрел или же атаки просчитаются раньше? Или как повезёт с очередью(При равном приоритете)?
Сначала происходит атака всеми юнитами одновременно, потом ремонт, потом перемещение. То есть увернуться не получится.
Вначале атаки, потом ремонт, а потом движение. Так что увернуться никак… Но более подробно описано на сайте в правилах.
В этом случае на следующем ходе недополучим 1 единицу ресурса из-за движения рабочего сверху, но уже на второй ход будем добывать 2, таким образом в перспективе выигрывается 1 единица ресурса.

Может я не так считаю, но почему выигрывается 1 единица ресурса? Если не отходить, то добыча по ходам будет [1, 1, 2, 2, ...]. А если подвинуться, то [0, 2, 2, 2, ...]. Вроде бы сумма одинаковая.

Это, конечно, не отменяет того, что подвинуться может быть выгодно по другим причинам (например, чтобы меньше стоять на проходе).

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

Да похоже тут я ошибся в расчетах в уме :)

Более того, если НЕ отходить, первую единицу еды получаешь на один ход быстрее, что хоть и небольшая, но выгода.

Статья неплохая, читается хорошо. Но мне кажется надо было найти пару геймеров-помошников, которые бы недельку поиграли в эту игрушку друг с другом. Думаю нашлось бы много интересных трюков :), а также минусов конкретных тактик/стратегий. Плюс их помощь в тестировании самого бота. Вспоминая варкрафт были приколные тактики — построить базу около чужой добычи золота и потихоньку тырить ресурсы, или башни у противника на базе, или камикадзе (уводит противника в тупики, засады или на чужую базу, но умирает), поставить пару рабочих на ремонт вышки на чужой базе и тп :)

Тут, к сожалению, игра не очень пригодна для людей. Там механика когда все юниты всех сторон ходят одновременно в случайном порядке, согласно заданным командам. В такое человеку сложно играть. Ну и количество сущностей великовато.
Приходилось все тактики либо кодить чтобы отработать, либо искать стратегию, которая так делает и смотреть свои игры против неё.
Решение состояло в том, чтобы при помощи Graal VM скомпилировать jar-ник бота в exe, со всеми выполненными оптимизациями во время статической компиляции.

Kotlin Native не пробовали? Получается экзешник без танцев в GraalVM.

Я был уверен, что в финале победят рашеры, 50% лучников и 20% мечников просто раздавят противника, пока он набирает строителей.
У меня лучники при больших потерях переходили в оборону, и выстраивались стенами вокруг базы. В обычном режиме делились на команды застрельщиков, рашеров и диверсантов. Работало все криво, со стандартным поиском пути, выдохся и не сделал нормального микроконтроля.


Самые большие минусы соревнования:


  • никакой баланс
  • победа всяких рандомов на первых этапах (иногда совсем тупые болванчики неделю стояли вровень с умным микроконтролем)
  • запрет работать с диском (У нас вроде соревнование ИИ? Больше похоже на соревнование любителей бахнуть побольше IF-ELSE и велосипедных эвристик)
Сколько времени вы тратили в день на конкурс? Я с другом тратили по два часа в день, нехватило даже на футболку (макс занимали 120 место).
Пробовали ли, стратегию с «мешающей жопой»? При некоторых условиях можно было добежать строителем до базы противники и заблокировать возможность строительства крупных зданий. Правда условия на пределе возможного.
Такую стратегию не пробовал, но думал об этом. Еще можно было бы ставить мещающие стены (не достраивая их).
Тратил ооочень много времени, думаю часов по 5 в день это минимум. Ну там много времени еще уходит на прогон тестов. Бывает, хочешь попробовать несколько фич, но пока одну не протестируешь, к другой не хочется приступать.
Спасибо за подробный PM. Долго думал как сделать подобные координации войска и рабочих, но так и не придумал, очень уж не хотелось делать полные переборы и симуляцию битвы. В итоге остановился на некоторой реализии потенциальных полей с нулевой глубиной оценки. Работало это все заметно хуже, но на финал хватило.

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

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

Вот несколько доработок, которые у меня возникли по ходу чтения статьи:
1. Усовершенствования алгоритма поиска пути с помощью JPS (Jump Point Searche), для «перегонов» юнитов, то есть когда наверняка известно, что противника на территории нет. По идее это сильно ускорит вычисления, ибо нет нужды просчитывать каждую отдельную клетку (Но опять же, работает на расстояниях 10 клеток и более, иначе можно столкнуться с собственными юнитами)
2. Можно добавить каждой клетке массив, где будет прописываться через сколько клетка будет заниматься каким-либо юнитом и пользоваться этим при поиске пути. Понятно, что в основном это происходит у ресурсов рабочими, либо в толпе боевых юнитов и групповое взаимодействие вполне себе решает эту проблему, но вот просто в узких местах (Между бараками или лесом) тратятся лишние ходы + теоретически это можно применить и для групп, разменяв кол-во проверок на память просто (Хотя не уверен, если честно, нужно проверять на практике:) ).
3. В стратегиях типо FAF выгодной тактикой на картах с ограниченными доп ресурсами (Так называемым «реклеймом») добывать рабочими в обратную сторону (От противника к базе), и она очень хорошо сочетается с аналогом «прокси барак». Понятно, что тут это будет работать немного по другому и применять её нужно лишь там, где точно известно, что до конца партии все ресурсы будут выработаны. С одной стороны из-за этого можно просесть по ресурсам вначале партии, но с другой стороны — в конечном счёте получается большая выработка, ибо вам достаётся большая часть карты, и к моменту, когда вражеские рабочие дойдут до центра, там уже ничего не будет, а около Вашей базы ресурсы ещё будут.
4. Как по мне, если делать резервацию ресурсов на постройки юнитов или бараков, то без предсказания экономики обойтись нельзя. То есть считаем сколько в текущий момент добывается за ход и резервируем с этим учётом. То есть нужно оставлять на счету не 500+, к примеру, а 460, если у вас доход 50 в тик, к примеру. Можно дальше расширять это не на один ход, а на несколько.
5. Продолжая тематику предсказания по доходу, нужно смотреть на окупаемость рабочих в реальном времени, а не «примерно нужно держать 60 и не больше», а так же на время, которое осталось до конца раунда. То есть в конце партии нет никакого смысла их достраивать, а построить побольше боевых юнитов и пойти в размен с целью убить рабочих или их ресурсы.
6. Размер рабочими, сочетается с п.3. В определённых ситуациях выгоднее убить рабочего об противника или устроить «заманиловку», где нужно бежать просто как можно дальше от базы и оттаскивать боевые юниты, а после построить нового, чтобы потом не тащить его через всю карту.

Пока что большего с ходу не пришло.
1. Это для DFS, я так понимаю? У меня он в целом отнимал не так много времени. Львиная доля была за BFS.
2. Commandos вроде делал нечто подобное…
3. Это будет автолуз, т.к. слишком большое проседание по ресусрам вначале.
4. У меня было предсказание только для текущего хода. Типа если есть N рабов восле ресурсов, то скорее всего за этот тик насобираем N единиц ресурсов, следовательно для строительства можно использовать эту информацию, как будто сейчас не X а X + N, ресурсов. На более дальние дистанции уже не прогнозировал, но вообще да, есть смысл.
5. Тоже думал как-то считать окупаемость, но это очень сложно и много нюансов, а факторов может быть очень много. Так что остановился на описанной схеме. Но вообще интересно, как другие игроки это делали.
6. Мои диверсанты всегда бежали не просто к ближайшему рабочему, а к ближайшему скоплению, поэтому против моего бота это бы не сработало. А вообще, при отступлении у меня в приоритете были те клетки, которые ближе к моим войскам и турелям.
1. А для BFS уже нужно использовать различные структуры, из самого простого, AABB-дерево или его аналоги, тут уже по ситуации как лучше подходит. А вообще, даже если DFS при A* и не жрёт много ресурсов, то всё равно не грех заюзать JPS, ибо там разница почти на порядок)
3. До меня просто не сразу дошло, что барак с рабочими нельзя построить, поэтому да, получается, что смысл примерно нулевой
5. Да нет, можно ограничится при желании вообще коэффициентом «стабильности». У Вас же под конец рабы умели определять расстояние до противника и насколько они вообще в опасности (То есть смогут ли их защитить свои юниты). Тогда просто смотрим сколько рабочих в безопасности и прочность леса(от этого зависит через сколько ходов они будут ехать к следующему и тратить время), который они добывают. И получается некий аналог дисперсии, по которому смотрим наихудшее значение(Ну или какое захочется:) ).
6. То есть отбившегося рабочего он просто проигнорирует что ли?
6. Как повезет, но может и проигнорировать, если в другой стороне куча рабочих добывающих ресурсы

Классно написано


Кстати, непонятно всё же, почему мечники совсем бесполезны. Вот например в SCBW чисто гидралиски довольно слабы против зилотов, и зерглинги тоже быстро кончаются, но их сочетание оказывается весьма эффективно, потому что пока зерглинги дохнут, гидралиски наносят серьёзный урон.
Здесь тоже можно было бы добавить мечников, чтобы они собирали вражеский огонь на себя, а лучники бы нанесли основной урон. Так не получится?

Думаю потому что за тик можно сделать одно действие только: бежать или атаковать. Таким образом 2 лучника гарантированно убивают мечника. И атакуют они на дистанции в 5, а мечнику нужно подойти впритык и ещё 2 тика потратить на атаку. Короче, получается, что при n мечников n+1 лучников могут «кайтить» хоть до посинения при наличии большого поля.
Если бы сделали мечникам персональную механику, что в один ход можно и идти и атаковать, то получилось бы сбалансировано, но организаторы не подумали в баланс…
Не получится, т.к. лучникам можно просто выставить прироритет атаки по лучникам. Т.е. если в радиусе атаки есть и лучники и мечники, то атакуем и размениваемся с лучниками, и мечники оказываются как бы не у дел.
Статья очень классная, спасибо )

Кстати ни у кого из топов не видел варианта подождать, пока рабы наберут побольше ресов, если у соперников безнадежная ситуация. Все почему-то нападали всеми своими силами на один бедный оставшийся домик, хотя времени зачастую оставалось тиков 200, а ресов было чуть ли не четверть карты. Хотя может такие ситуации очень редки в финале )
Рад что понравилась)
Ситуация очень редкая, и программировать на неё бота — ну, это мало на что повлияет. Лучше уделить внимание тем вещам, которые бывают в каждой игре.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории