Седьмого ноября официально стартовала неделя бета-теста Russian Ai Cup 2017. Чемпионат ежегодный, и в этом году мы решили предложить участникам проект под названием CodeWars — конкурс по программированию ботов для игры, которую сами участники сходу окрестили «симулятором игрока в RTS». Бета-тест подошел к концу, чемпионат официально стартовал, и под катом мы хотели бы отчитаться, поделиться новостями о том, что же мы теперь можем предложить. Ну и еще раз зазвать всех поучаствовать, не без этого конечно.
Коротко о чемпионате
На всякий случай, коротко о соревновании для тех, кто не в курсе — немножко правил в свободной форме. Каждый год мы пишем игру определенного жанра, даём всем желающим написать для этой игры бота с определенной стратегией поведения внутри, и запускаем этого бота в песочницу, где он время от времени бьется с другими такими же. Правила игры постепенно усложняются, после отбора лучших стратегий среди них проводится серия раундов «каждый-с-каждым». В результате самые крутые получают призы (2 макбука, умные часы, айпад, вот это всё). Не самые крутые тоже получают довольно много ништяков — майки, толстовки с нашей символикой, почет и уважение. Сами бои можно как смотреть прямо на сайте, так и запускать в дебажном режиме локального визуализатора, который мы предоставляем.
Ну а в этом году у нас подобие RTS. Есть карта конечных размеров, на этой карте в каждом углу зеркально расположены 500 юнитов техники разного типа:
- Танк и БМП — наземные юниты, первый эффективен против наземных же, второй — против атаки с воздуха;
- Вертолет и Истребитель — воздушные юниты, первый для обстрела наземных, второй для воздушных боев;
- БРЭМ — ремонтная бригада. Иными словами, «доктор».
Конечно, юниты отличаются довольно сильно по целому ряду параметров — скорость, радиус атаки, радиус разведки, атака, защита и так далее. Карта же, помимо прочего, размечена разными типами местности и погодой (местность влияет на скорость передвижения и видимость на земле, погода — в воздухе). Задача на первый взгляд довольно проста — уничтожить всех юнитов соперника, выжить самому. Отличие управления от традиционных RTS здесь в том, что практически отсутствует микроменеджмент:
- Юниты атакуют друг друга автоматически при сближении, и каждый из них сам выбирает для себя цель. Назначить цель атаки отдельному юниту вручную нельзя.
- У стратегии игрока есть возможность отдать приказ группе юнитов каждые N тиков (всего игра длится 20000 тиков). Всё остальное время войска выполняют данные ранее приказы. Таким образом, выбирать отдельный юнит и отправлять куда-либо по сложной траектории довольно расточительно.
Все эти ограничения были введены нами специально, чтобы увидеть военно-стратегическое планирование, а не серию микробоёв. В целом, получилось отлично, об этом дальше.
Результаты тестирования, или что мы теперь умеем
Традиционно, Russian AI Cup всегда начинается неделей бета-теста: участники пробуют что-то наваять на предоставленном нами API, нахваливают или ругают как механику игры, так и это самое API. Чаще ругают, конечно, у нас свои традиции — «раньше было лучше», «сейчас так себе» и «всё слишком сложно».
Мы же, в свою очередь, спешно извиняемся за найденные баги, правим их, стараемся поменять баланс так, чтобы стало действительно интересно, и добавляем в поддержку новые языки программирования. Кроме того, зачастую на этом этапе мы, наряду с правками баланса, добавляем в механику игры какое-то количество новых фич. Этот год не стал исключением.
Увеличение количества действий в секунду
С самого начала мы слегка промахнулись с количеством CPS, разрешенным для участников. На старте бета-теста мы давали стратегиям 6 действий в секунду (изначально было три типа действий: выделение группы, движение её по вектору или поворот вокруг заданной точки). Оказалось, что этого совершенно недостаточно для построения сколько-нибудь грамотной стратегии для нападения или обороны. Всё, что участники успевали сделать до первого выстрела — это либо отправить истребители в атаку, либо тоскливо сжаться в ожидании удара. В итоге мы уменьшили кулдаун в два раза, чуть понерфили скорость истребителей, стало гораздо лучше. По крайней мере, появились осмысленные построения.
Четвертый тип действия — SCALE
Поскольку у юнитов нет своей реализации поиска пути, для первопроходцев было совершенно невозможно построить смешанный отряд из разных типов юнитов, они просто упирались друг в друга и не желали двигаться дальше. Эту проблему мы решили введением нового типа действия — SCALE. Грубо говоря, берем отряд юнитов и приказываем им «отмасштабироваться» на заданный коэффициент — либо сомкнуть ряды, либо наоборот, разомкнуть. Таким образом, у участников появилась возможность взять два любых отряда, приказать каждому из них «немного разойтись» и составить из них одну смешанную дивизию (танки + вертолеты, БМП + истребители, да всё, что угодно).
Получающиеся в результате отряды участники сходу окрестили «бутербродом».
AOE — Nuclear Strike!
Когда мы планировали будущие бои, мы представляли себе что-то вроде серии игр Total War, StarCraft, C&C и иже с ними — умную тактическую битву стройных рядов техники, отход-наступление и прочие красоты подобных игр. Реальность в самом начале бета-теста нас слегка обломала: топовой стратегией оказалось просто смешать всё, что есть у игрока, в одну большую кучу (из небольшой комбинации MOVE и ROTATE) и отправить получившийся «ком» валить всё, до чего он дотянется. Честно говоря, ни нас, ни первых участников это совершенно не устраивало — хотелось красивого ИИ и разнообразия тактик. В результате появился ядерный удар — берём одного из юнитов, назначаем наводчиком ракетного удара, и пока этот юнит жив, можем бить по площади в радиусе видимости от него.
Конечно, на это действие есть довольно большой кулдаун, да и урона оно наносит не так много. Но, тем не менее, завалить противника просто захардкоженой кучей юнитов больше нельзя — нужно обучать ИИ новым приемам — разведка, запуск наводчиков, расстредоточение в случае опасности. Короче, стало намного веселее, бои стали интереснее, а стратегии участников — разнообразнее.
Эволюция стратегий
Чтобы иметь более-менее наглядное представление, что и как у нас пишут, вот небольшая подборка того, чему ребята успели обучить свои стратегии на данный момент. В почти хронологическом порядке.
Просто бежим вперед
Это то, что писалось в самом начале, так сказать осваивание управления (ну и засылка тестовой стратегии, которую мы предоставляем сами).
Как видите, толку особо никакого.
Ком ярости
В определенный момент, еще до введения дополнительных типов действий и увеличения общего их количества, участники поняли, что можно несколько раз рандомно повернуть изначальные отряды, двинуть их друг к другу и сформировать вот такой мини-смерч:
До введения ядерного удара он неплохо рулил. В некоторых вариациях (с более умным построением и передвижением) рулит и сейчас.
Бутерброд
SCALE позволил строить более умные дивизии из замиксованных друг к другу разных типов войск. Например, вот такие:
Вариантов построения масса, на любой вкус и цвет. Эффективность таких штук, естественно, нужно считать. Зачастую она (эффективность) напрямую зависит от того, что успел построить противник.
А вот, кстати, успешная битва хорошо поставленного строя против кучи, с взятием кучи в клещи с двух флангов.
Наводка ядерного удара
Выглядит это довольно впечатляюще:
Пока одна из стратегий строится, вторая уже формирует отряд «наводчиков» и буквально через пару секунд прилетает первый истребитель, наводящий на строящуюся формацию «ядерный удар». Тактика защиты здесь может быть самая разная, от перехвата до мгновенного разделения на несколько формаций.
Вот бой, где один истребитель таким образом постепенно выносит всю формацию противника.
Рой
Довольно красивый тип тактики, жаль gif не может в полной мере передать красоту такого построения:
По миникарте четко видно, что стратегия успешно управляет целой ордой разрозненных отрядов, путая и изматывая единственную формацию противника как обычной атакой, так и ядерными ударами. Управление таким количеством отдельных отрядов при существующих ограничениях требует неплохой алгоритмической подготовки. Впрочем, потенциал у таких тактик, кажется, неплох.
Партизанский бой
Очень остроумное использование SCALE — наводняем всю карту «партизанскими» одиночными отрядами (видно по миникарте), и каждый из них может быть наводчиком для ядерного удара.
Передвижение дивизии противника превращается в ходьбу по минному полю, с соответствующим результатом. Впрочем, кажется, что это должно элементарно перебиваться простейшей разведкой — одиночные юниты гибнут почти мгновенно.
На самом деле различных стратегий атаки и защиты намного больше, но подавляющее их большинство невозможно нормально показать гифками (да и пост и так уже довольно тяжелый). Можно просто полистать игры топов здесь.
Бета кончилась — а что теперь?
А теперь всё серьёзно!
Бета-тест чемпионата прошёл вполне успешно, рейтинг в песочнице был сброшен, теперь участникам предстоит каждому написать ИИ, способный вырваться вперёд и поучаствовать в следующих раундах.
Раунд 1
Через 9 дней 1080 лучших стратегий будут отобраны для участия в первом раунде. Победители раунда получат возможность попасть в раунд 2 и в финал. Кстати, лучшие 60 из оставшихся в песочнице, все равно попадут во второй раунд — шанс должен быть всегда.
После первого раунда в игре появятся здания. Захватывая их, можно будет либо производить технику по выбору игрока, либо увеличивать количество действий, доступных в игре.
Раунд 2
Эта серия боёв состоится 9-10 декабря, и в неё попадут лучшие 300 стратегий из первого раунда и лучшие 60 стратегий из песочницы. Битвы будут за возможность попасть в финал. Те, кто не не выйдет из второго раунда, все равно будут иметь шанс, если займут первые 10 мест в песочнице.
Все участники второго раунда получают майки с нашей символикой. После второго раунда в игре появится туман войны. Придется учить ИИ таким действиям как разведка и отлов шпионов.
Финал
16-17 декабря лучшие 50 из раунда 2 и лучшие 10 из песочницы будут биться за финальные призы — MacBook Pro, MacBook Air, Apple iPad, Samsung Gear s3, WD My Cloud 6TB, WD My Passport Ultra 4TB. Кстати, TOP-6 песочницы, не победившие в финале, получат WD My Passport Ultra 2TB. Кроме того, все участники финала получают толстовки с нашей символикой.
О поддерживаемых языках
Стараемся включать всё, до чего дотянемся (и всё, что нам присылают сами участники). Начинали мы с таким набором: C#, C++, Java, Python2, Python3, Pascal, Ruby.
Во время бета-теста добавили: D.
Сейчас добавлены дополнительно: Kotlin, Scala.
На очереди: Swift, Go, Rust, Nim.
Похоже, список будет пополняться. Кроме того, сегодня мы рассчитываем поддержать еще один язык — английский. В том смысле, что правила почти переведены, и скоро будут выложены на сайт в англоязычной редакции.
А я еще успею поучаствовать?
Ну а зачем бы я тут всё это писал? Официальная часть чемпионата только-только началась, она продлится вплоть до середины декабря и присоединяться можно на любом этапе. Зарегистрироваться можно здесь, там же элементарно ищутся полные правила, гайды, стартовые стратегии, форум, языковые пакеты и многое другое.
Чемпионат очень активный, в Telegram можно найти официальный чат, официальный канал и неофициальный канал, организованный самими участниками (от них же кстати есть неофициальный визуализатор и куча других инструментов, за что им огромное спасибо). В ВК есть группа по всем нашим чемпионатам.
Короче, го к нам, у нас тут интересно. Без поддержки не останетесь — всегда можно задать вопрос мне лично как организатору соревнования — sat2707 во всех официальных и неофициальных чатах/группах/где угодно.
P.S. Было бы не правильно не выразить благодарность сообществу за поддержку и помощь (и за многие картинки в этом посте). Парни, вы огонь, так держать!
Комментарии (83)
Imp5
15.11.2017 15:10Когда мы планировали будущие бои, мы представляли себе что-то вроде серии игр Total War, StarCraft, C&C и иже с ними — умную тактическую битву стройных рядов техники, отход-наступление и прочие красоты подобных игр.
Если бы в Total War, StarCraft, C&C и иже с ними юниты упирались в другие и никуда после этого не ехали, то там никаких красот тоже не было бы.sat2707 Автор
15.11.2017 16:40Это так. Не учли. Но исправили, на сколько смогли :)
Сейчас битвы вполне себе интересные
vesper-bot
15.11.2017 17:45Теперь я знаю, про кого на баше цитата про ядерный удар :)
Интересно, кстати, кто-нибудь сумеет написать самообучающийся алгоритм? Молодцы организаторы, вполне себе интересный варгейм :)sat2707 Автор
15.11.2017 18:41Спасибо напр добром слове :)
Для самообучения у нас, к сожалению, довольно скудный инструментарий. В следующей серии http://aicups.ru/ хотим это исправить — давно просится задачка специально под сетки
third112
15.11.2017 19:31Тут бы хоть какой-то успеть написать! В языковом пакте 1-2 (м.б. больше) бага, про которые сообщали, но исправлять их не торопятся. Мануал — полный ребус, а на вопросы официальный сайт не отвечает. В прошлой теме сказали, что очень заняты. И я занят, и все время на разгадывание невнятных мануалов тратить не могу — у меня еще другие работы. Пока вижу, что элементарные действия выполнить очень не просто. Какое уж тут самообучение :(
sat2707 Автор
15.11.2017 21:46А что именно вы имеете в виду? Дайте ссылочку или протицируйте, если вам не сложно — разберемся
third112
16.11.2017 08:221) См.:
«У вас косяк в пакете под паскаль в FacilityControl.pas Ругается на эту строчку constructor TFacility.Create(const facility: TFacility); overload; Я в принципе локально у себя поправил. Ранер успешно запускается и конектится к эмулятору, но не уверен будет ли работать оно у вас»
У меня та же штука в D-7. Стер Overload -работает. Но это не по правилам — править можно только свою стратегию.
2) См.:
“Теперь напишем более сложный код”. Этот 2й пример только на Яве :( ИМХО в руководстве он должен быть переведен на все поддерживаемые языковые пакеты, иначе они будут в неравных условиях.
3) См.:
Как вообще на Паскале выделить 10 юнитов, нпр., танков и послать их в точку с заданными координатами? Пробовал по разному — не работает. Может баг? А можно 10 танков послать в 10 разных точек за 1 тик? Мануалу явно не хватает примеров таких элементарных действий. Описание API слишком формальное, много второстепенных методов и добраться до основных за ограниченное время представляется проблематичным.
third112
16.11.2017 08:33PS Also Local runner:
4) См.:
Прикольно было бы легенду выводить со значками/цветами. Хотя наверное и к этому можно привыкнуть.
5) См.:
ОБЯЗАТЕЛЬНО! Нужна легенда: цвет танка, вертолета и т.д. игрока и противника и у каждого число — сколько осталось.
6) См.:
А цифры потерь можно сделать более крупным шрифтом? Трудно следить за боем когда на цифру елочка накладывается. Было бы лучше сделать отдельно информационное окошко и легенду там дать — какого цвета какие юниты и сколько их осталось.
SladeThe
16.11.2017 17:05456) Все виды техники имеют своё схематичное изображение. Понять тип техники относительно несложно. Разумеется, у каждого участника есть свой большой список хотелок, что и как должно быть изображено, но мы не можем включить всё это в официальный рендерер. Именно поэтому вместе с утилитой Local runner распространяется также и специальный плагин для отображения любой нужной вам информации поверх имеющейся картинки. Если по какой-то причине вам неудобно им пользоваться, есть также неофициальный рендерер, разработанный в сообществе участников AI Cup.
third112
16.11.2017 20:58Все виды техники имеют своё схематичное изображение.
В Local runner виды техники обозначены маленькими кружками разного цвета. Но какой цвет какому виду соответствует — остается только гадать!
есть также неофициальный рендерер, разработанный в сообществе участников AI Cup.
А ссылку можно,pls?SladeThe
16.11.2017 21:22Неофициальный рендерер github.com/kswaldemar/rewind-viewer
В Local runner это всё же не просто кружочки, если приблизить, то видно, что они по-разному нарисованы.
third112
16.11.2017 21:00Именно поэтому вместе с утилитой Local runner распространяется также и специальный плагин для отображения любой нужной вам информации поверх имеющейся картинки.
Как зовут этот плагин? Как его подключать? Где про него написано?SladeThe
16.11.2017 21:25Качается вместе с Local runner и находится в папке plugins. Нужно поправить код, чтобы рисовать то, что вам нужно и перекомпилировать его. Также в настройках Local runner'а включить плагины. У всех настроек есть комментарии, найти будет несложно.
third112
16.11.2017 21:29Спасибо. Нечто «Качается вместе с Local runner и находится в папке plugins» — А как зовут это нечто?
Нужно поправить код,
Как? — Я не знаю Явы.
перекомпилировать его
Как?
SladeThe
16.11.2017 16:571) Мы не обнаружили проблем с компиляцией пакета на Pascal. При локальном тестировании вы можете использовать любой компилятор, но мы можем гарантировать правильную работу только с версией, указанной в разделе сайта «Языковые пакеты».
2) Код на Java не имеет сложных конструкций и макросов, похож на другие популярные языки и поэтому легко читается всеми программистами. Переписывание «Быстрого старта» на другие языки займёт значительное время и скорее всего просто приведёт к сокращению списка языков, поддерживаемых из коробки.
3) В Песочнице чемпионата есть участники, пишущие стратегию на Pascal. Значит в нём нет какого-либо крупного бага, приводящего к частичной или полной неработоспособности стратегии. В мануале довольно подробно описаны возможные действия стратегии. Достаточно внимательно прочитать его и осмыслить. В любом случае, наше соревнование рассчитано на длительное участие, а сколько времени на него выделять, это уже ваше решение.third112
16.11.2017 21:21Мы не обнаружили проблем с компиляцией пакета на Pascal.
Как интересно! Два пользователя обнаружили, а Вы — нет! Под каким Pascal Вы компилировали?
Код на Java не имеет сложных конструкций и макросов, похож на другие популярные языки и поэтому легко читается всеми программистами.
А я вот Явы совсем не знаю и мне это на Pascal перевести сложно:
for (VehicleUpdate vehicleUpdate : world.getVehicleUpdates()) {
long vehicleId = vehicleUpdate.getId();
И это:
double x = streamVehicles(
Ownership.ALLY, vehicleType
).mapToDouble(Vehicle::getX).average().orElse(Double.NaN);
NaN — это Not-a-Number? А почему это как метод? В Pascal такого метода нет.
stream = stream.filter(vehicle -> vehicle.getPlayerId() == me.getId());
В D-7 есть разные stream, но как тут перевести?
А это как переводить — совсем непонятно:
private enum Ownership {
ANY,
ALLY,
ENEMY
}
}
В мануале довольно подробно описаны возможные действия стратегии.
Где? Укажите страницу, pls!
В любом случае, наше соревнование рассчитано на длительное участие, а сколько времени на него выделять, это уже ваше решение.
Т.е. если не знаю Яву, нужно как минимум времени, чтобы выучить Яву?SladeThe
16.11.2017 21:43Если бы вы внимательно прочитали мой комментарий, то поняли, где можно посмотреть версию компилятора. Если бы вы внимательно читали правила, то сейчас не спрашивали у меня страницу. Для чтения приведённых вами участков кода достаточно иметь базовые навыки программирования, а также знать английский, вот и всё.
Обычно, когда человек заявляет, что он не понял ничего, значит он и не хотел разбираться. В таком случае я ничем не могу помочь.third112
16.11.2017 22:00Если бы вы внимательно прочитали мой комментарий, то поняли, где можно посмотреть версию компилятора.
Wow! Ребусы продолжаются!
Вы написали:
При локальном тестировании вы можете использовать любой компилятор, но мы можем гарантировать правильную работу только с версией, указанной в разделе сайта «Языковые пакеты».
Смотрим, что написано в разделе сайта «Языковые пакеты»:
Pascal Free Pascal 3.0+ [Delphi mode]
А Delphi mode какой версии?
Если бы вы внимательно читали правила, то сейчас не спрашивали у меня страницу.
Ну тупой я! Ну подскажите!
Для чтения приведённых вами участков кода достаточно иметь базовые навыки программирования, а также знать английский, вот и всё.
Что все?
ANY,
ALLY,
ENEMY
Переводчик гугл переводит:
ЛЮБЫЕ,
ЭЛЛИ,
ВРАГ
И как такое знание английского поможет перевести на Pascal? ;)
BTW А что значит ALLY? Гугл предлагает: союзник, помощник, пособник, но и
мраморный шарик.
И еще мне интересно: это конкурс на создание ИИ-стратегии или на знание языков (английского, явы)?SladeThe
16.11.2017 22:25Вот ссылка на правила. Все действия стратегии описаны в пункте 2.6 Управление (страницы 12-13). Но в любом случае нужно минимум всю вторую главу прочитать для понимания правил игры.
third112
17.11.2017 00:041) Так какая версия Дельфи подходит? Я так и не получил ответа!
2)Все действия стратегии описаны в пункте 2.6 Управление (страницы 12-13).
Читаю:
CLEAR_AND_SELECT. Стандартное выделение дружественных юнитов рамкой
Для такого выделения надо знать координаты каждого унита. Как мне их узнавать? А иное выделение возможно? (по номеру юнита)
3) что у Вас значит «ALLY»?
SladeThe
16.11.2017 22:33К сожалению или к счастью, но сейчас нет популярных языков программирования с русским синтаксисом, за исключением, наверное, 1С. Так что знание технического английского является обязательным требованием для любого программиста. А то, что Гугл странно переводит, давно известный факт.
third112
17.11.2017 00:08У меня нет проблем с английским (и не только с техническим), но есть проблемы с некоторыми именами в API данной игры. В частности, что значит «ALLY»?
SladeThe
17.11.2017 00:15ANY, ALLY, ENEMY — любой, союзник, враг. Принадлежность юнита.
Это перечисление не является частью API игры и присутствует только в примере. В вашей стратегии его может не быть.third112
17.11.2017 00:32ANY, ALLY, ENEMY — любой, союзник, враг. Принадлежность юнита.
Спасибо. А кто союзник в данной игре? Или союзник=свой?
MiXei4
17.11.2017 00:17Если нет проблем с английским, то я не понимаю как можно не понять, что значит ALLY, тем более когда речь про войнушку и есть всего 3 значения — Любой, Враг и Ally.
third112
17.11.2017 00:42Появились сомнения: ALLY это свой? Значений могло быть и больше: Любой, Свой, Чужой, Неизвестный, Пленник, Ранен и т.д.Некоторые из таких значений могли быть просто не перечислены. Свой = не Враг и т.д. В некоторых играх и не такое бывает.
SladeThe
16.11.2017 22:39А Delphi mode какой версии?
Не понял вопроса. Стратегия компилируется примерно вот так (вырезано из compile-fpc.bat, входящего в состав pascal-cgdk):
fpc.exe -Cs67107839 -Mdelphi -XS -vm3018 Runner.dpr -oMyStrategy.exe
Free Pascal указанной версии с ключиком Delphi.
third112
17.11.2017 00:21вырезано из compile-fpc.bat, входящего в состав pascal-cgdk
А еще там есть compile-dpr.bat, в котором:
if "%DELPHI7_HOME%" == "" (
dcc32 -Q -cc Runner.dpr 1>compilation.log
) else (
"%DELPHI7_HOME%\Bin\dcc32" -Q "-U%DELPHI7_HOME%\Bin" "-I%DELPHI7_HOME%\Bin" -cc Runner.dpr 1>compilation.log
)
third112
17.11.2017 01:18О! За вопросы по игре минусы дают! Если это делают организаторы, значит слишком много участников. А если делают участники, то это попытка убрать конкурентов? :)
Не спортивно!
Stecenko
16.11.2017 21:58Чуточку Явы, прошу прощения, если где-то накосячил1)Первое — просто цикл Для каждого элемента коллекции.
В java название класса (тип переменной) с заглавной буквы, название переменной — с маленькой. Исключение — примитивы (long, int, double etc.) с маленькой буквы.
т.е. vehicleUpdate — ссылка на текущий элемент в коллекции, полученной от объекта world.
А потом просто получаем id в переменную vehicleId.
2)Далее идут фишки Java 8, обработка коллекций как потоков, стримы, замена циклов. Если не ошибаюсь, читать как «выбрать из всех объектов только своих, нужного типа, получить от выбранных координату х, представить ввиде списка, для этого списка посчитать среднее арифметическое, или вернуть объект Double.NaN (это именно объект, не метод, у всех методов есть круглые скобки, как например me.getId(),)
3) Снова стримы — создать стрим, который содержит только те элементы старого стрима, которые отвечают условию „танк принадлежит мне“.
4) просто специальный класс — перечисление, с тремя экземплярами класса, любой, свой, враг. Такая замена констант, уменьшающая число способов выстрелить себе в ногу, используя неверное значение.
5) Действие стратегии — присвоить полям экземпляра класса Move нужные параметры, прежде всего тип действий, остальные поля — в зависимости от типа. Типы действий в руководстве на странице 24.
Укажете неверно или не все — действие будет проигнорировано.third112
16.11.2017 22:15Для каждого элемента коллекции
Большое спасибо за Ваше желание помочь! Я слышал, что в Яве есть коллекции, но в Дельфи-7 их в таком виде нет.И как переводить?
Мне писали, что за пару часов возможно перевести. Предположим, что всего участников будет 1000, а из них на Яве 200, т.о. 800 будут переводить и каждый потратит 2 часа, получим 1600 часов. А если организаторы переведут на 9 языков, то потратят всего 18 часов.
5) Действие стратегии
Тут совсем непонятно.
private enum Ownership {
ANY,
ANY — это вызов функции? В Яве запятая м.б. разделителем меду операторами?
А enum что значит?Stecenko
16.11.2017 22:204) enum — это перечисление, специальный класс, здесь класс Ownership, принадлежность. ANY, ALLY, ENEMY — его объекты, не функции. Если другой класс имеет поле класса Ownership, его значением может быть только один из указанных здесь объектов.
private enum Ownership {...} — объявление этого перечисления
По поводу коллекций — откройте стартовый пакет в Вашей IDE. Возможно, нужная функция возвращает массив, список, или другую структуру, которая есть в Вашем языке, и которую можно обойти циклом.third112
16.11.2017 23:01enum — это перечисление, специальный класс, здесь класс Ownership, принадлежность. ANY, ALLY, ENEMY — его объекты, не функции.
В-о-о-о-т мы и уперлись в различные трактовки ООП в разных языках.
Согласно википедии:
Класс — абстрактный тип данных в объектно-ориентированном программировании, задающий общее поведение для группы объектов; модель объекта.
Объект — это экземпляр класса. А Вы говорите, что в классе enum уже есть объекты (ANY, ALLY, ENEMY). Это с ходу не понять.
Если другой класс имеет поле класса Ownership, его значением может быть только один из указанных здесь объектов.
Если я правильно понял это скалярный тип Виртовского Паскаля:
type Ownership=(ANY, ALLY, ENEMY);
По поводу коллекций — откройте стартовый пакет в Вашей IDE. Возможно, нужная функция возвращает массив, список, или другую структуру, которая есть в Вашем языке, и которую можно обойти циклом.
Вот видите как все не просто и неоднозначно! Одним из лучших классических мануалов когда-то считался Macintosh Inside. Он был двуязычный Паскаль и Си. Там удалось предусмотреть все несовпадения этих языков. А в нашем случае ребус.
MiXei4
16.11.2017 22:21Это по сути просто тип — множество неких значений. Кажется в паскале есть нечто подобное — SET.
На самом деле переводить этот код на свой язык не имеет большого смысла. Я сначала перевёл, потом всё снёс.MiXei4
16.11.2017 22:26Реально полезная функция там — initializeTick. Она каждый тик актуализирует массив vehicleById, в котором хранится полная информация обо всех юнитах. Дальше уже с этим массивом можно работать как хочется.
third112
16.11.2017 23:47Реально полезная функция там — initializeTick. Она каждый тик актуализирует массив vehicleById, в котором хранится полная информация обо всех юнитах.
Это одномерный массив-вектор? А какой интервал индекса этого массива? От нуля до? Он не сортирован? Все юниты (танки, вертолеты и т.д.) вперемешку? Если юнит гибнет из vehicleById он убирается?MiXei4
17.11.2017 00:11Как реализовать этот массив зависит от языка. В примере это не массив, а HashMap, но можно сделать и обычный динамический массив.
Главное, что у вас есть метод world.getNewVehicles() и world.getVehicleUpdates()
Первый каждый тик даёт информацию о новых юнитах на карте, второй об изменившихся юнитах.
Совместив эти два «массива» можно получить полный список всех юнитов и дальше уже работать с ним — сортировать, фильтровать и тп.
В идеале в апи конечно должен был быть метод world.getVehicles() сразу возвращающий полный список всех юнитов, но так решили не делать, чтобы не грузить каждый тик полный список, чтобы всё работало быстрее.
Разбор примераfor (Vehicle vehicle : world.getNewVehicles()) { // Сначала цикл по всем новым юнитам vehicleById.put(vehicle.getId(), vehicle); // добавляем новый юнит (переменная vehicle) в массив updateTickByVehicleId.put(vehicle.getId(), world.getTickIndex()); // Это пока лишняя информация } for (VehicleUpdate vehicleUpdate : world.getVehicleUpdates()) { // Цикл по обновлённым юнитам, то есть юнитам, у которых изменились какие-то свойства. long vehicleId = vehicleUpdate.getId(); // getId() - возвращает уникальный ID юнита if (vehicleUpdate.getDurability() == 0) { // Если у юнита не осталось здоровья vehicleById.remove(vehicleId); // Удаляем его из массива updateTickByVehicleId.remove(vehicleId); // Пока лишняя инфа } else { vehicleById.put(vehicleId, new Vehicle(vehicleById.get(vehicleId), vehicleUpdate)); // Обновляем старый юнит. updateTickByVehicleId.put(vehicleId, world.getTickIndex()); // Лишнее } }
third112
17.11.2017 00:28// Сначала цикл по всем новым юнитам
На Паскале я могу написать цикл:
for i:=a to b do
Как мне определить a, b?
third112
16.11.2017 23:43Кажется в паскале есть нечто подобное — SET.
Да:
type Ownership=(ANY, ALLY, ENEMY); TSet = set of Ownership; var i : Ownership; aSet : TSet; begin aSet := [ALLY, ENEMY]; for i:= ANY to ENEMY do if i in aSet then writeln (ord(i));
Это то самое?
На самом деле переводить этот код на свой язык не имеет большого смысла
Понятно, что практического смысла нет. Но как еще понять принципы организации элементарных действий, если в мануале об этом не сказано?
AllexIn
15.11.2017 20:20Была мысль потратить немного совего времени и поучаствовать. Рад, что не стал.
Делаешь ИИ, продумываешь, находишь годные решения… Только для того, чтобы организаторы изменили правила так, чтобы твои решения перестали работать.sat2707 Автор
15.11.2017 21:45Очень жаль! А что Вы имеете в виду?
AllexIn
15.11.2017 21:48Я уж слишком резко выразился. Понятно, что бета тест на то и бета тест, чтобы баланс поправить.
Но ведь судя по статье — все сильные решения, которые участники придумали организаторы исключили введя правки, которые сделали эти решения неудачными.
По факту, лучшее поведение участника во время бета теста — это молчать, если придумал выигрышную стратегию. А то её выпилят в релизе.
В итоге ваши участники по сути два раза участвуют в конкурсе. Сначала в его бета версии, потом второй раз в релизной.
P.S>
Пример: Вы говорите что ввели ядерную бомбу, потому что тупое «выделить кучу и послать» — рулило. Но потом сами же показываете варианты, когда правильные тактики(клещи), легко заруливают тупое выделение, без всякиз бомб. Но имбу в виде ядерной бомбы все равно ввели. Зачем?sat2707 Автор
16.11.2017 01:03Так она не имба. Ввели потому, что иначе никакого стимула развивать стратегию, хотелось разнообразия. Да и участники сами просили, на том же форуме и в чате можно посмотреть :)
У нас же нет задачи придушить слишком сильные тактики, наша цель — дать выбор и вариации :)
SladeThe
16.11.2017 01:05Для человека, который вообще не участвует в конкурсе, вы слишком легко рассуждаете об игровом балансе. Это — имба, а эту тактику убили вот такой правкой.
Применение ядерного удара имеет свои ограничения и уж точно не является имбой. Да, это нововведение ускорит вымирание простых стратегий, но они в любом случае стали бы менее эффективны со временем. АОЕ стало дополнительным элементом геймплея, улучшило игровой баланс. С этим согласна не только команда разработчиков, но и большинство участников.
Жаловаться на изменения во время бета-теста вообще странно. Кажется, у вас просто превратное понимание о целях его проведения. Он нужен не для того, чтобы кто-то из участников пораньше начал писать стратегию и получил тем самым преимущество. Он нужен в первую очередь для разработчиков. Выявить и исправить баги, сделать игру лучше. От этого выйграют все.AllexIn
16.11.2017 07:56вы слишком легко рассуждаете об игровом балансе.
Для этого не нужно быть участником конкурса — вполне достаточно вдумчивого прочтения статьи.
они в любом случае стали бы менее эффективны со временем
Ну если в любом случае стали бы — зачем вообще вмешиваться?
улучшило игровой баланс
Камень-ножницы-бумага имеет идеальный игровой баланс. Но это же не повод регулировать баланс, пока он не станет похож на эту игру?
С этим согласна не только команда разработчиков, но и большинство участников.
В любом конкурсе есть согласные и не согласные. Но согласие не означает правильность. Впрочем, и моё мнение не является чем-то выделяющимся и также не влияет на правильность.
erwins22
16.11.2017 13:50Камень ножницы бумага ящерица Спок
Идеальный вариант… если нет особенностей местности и т д
В этой игре можно было бы с туманом войны обойтись только одним контактником(бойцом ближнего боя).
Стремление сделать разнообразие техники под «камень ножницы бумага» — плохая идея.
Например в старе балансны были комбинации первых 2х юнитов. Пулеметчики+огнеметчики вс герлинги+гидры вс зелоты+драгуны.
Что общего? радиус стрельбы+у всех мили+рандж.
А тут вы намутили. Ваш подход не плохой, но слишком шаблонный для карточных игр.AllexIn
16.11.2017 13:53Я имел ввиду буквально камень-ножницы-бумагу.
Когда единственное что может сделать ИИ — выбрать случайное значение из трёх и всё.
Все в равных условиях, идеальный баланс. Но бред.
Потому что требуется, чтобы ИИ на что-то влиял. То есть по сути — задача разработчика найти идеальную стратегию и научит ею ИИ. Но, это противоречит концепции баланса! Потому что баланс — это когда идеальной стратегии просто нет!
MiXei4
16.11.2017 09:46Участники участвуют не два раза, если уж на то пошло, а каждый день, постоянно улучшая своё «решение». Некоторые успевают за время проведения отправить более 100 версий. А ещё в конкурсе три раунда по сути по разным правилам и очень мало кто пишет сразу стратегию подо все раунды сразу. Сначала задача пройти в 300 лучших в первом раунде. Тем, кто хорошо научился, управлять тупой кучей с этим практически уже справились, не смотря на бомбу. Так что у них в любом случае уже есть почти месяц, чтобы готовиться ко второму раунду.
third112
16.11.2017 16:34Тем, кто хорошо научился, управлять тупой кучей
Я бы сказал: тем, кому удалось догадаться, что имел в виду автор мануала. И да, Вы правы — есть почти месяц, чтобы догадаться.
В любом случае возникает вопрос: управлять тупой кучей — это ИИ?MiXei4
16.11.2017 18:04У меня не возникло проблем с пониманием мануала, особенно после просмотра кода готового бота.
Не ИИ, но Вы можете написать свой ИИ, который всех их уделает :)third112
16.11.2017 21:36Ok. Если у Вас нет проблем, то надеюсь Вас не затруднит написать мне строчку кода на Дельфи-7, которая выделит 10 танков и каждый пошлет по указанным координатам: (х1, у1), ..., (х10, у10). Заранее премного благодарен!
MiXei4
16.11.2017 21:59Вы имеете в виду каждый из танков направить по своим координатам?
Это плохая идея в данном случае. Тут надо оперировать группами.
Одной строчкой это сделать не получится конечно и весь код я не напишу…
На первом тике необходимо выбрать нужные юниты.
Если эти юниты расположены в прямоугольнике с углами (x1, y1) и (x2, y2), то
move.Action := ACTION_CLEAR_AND_SELECT;
move.Left := X1;
move.Right := {X2};
move.Top := {Y1};
move.Bottom := {Y2};
move.VehicleType:= VEHICLE_TANK; // Эта строка выбирает только танки и не обязательна
На этом тике мы больше не можем ничего сделать. Только одно действие — в данном случае выделение группы.
На следующем тике (если мы ещё не уперлись) в лимит 12 действий за 60 тиков:
move.Action := ACTION_MOVE;
move.X := DX;
move.Y := DY;
В этом случае вся группа сместится на (DX, DY)
То есть отправить группу по указанным координатам напрямую нельзя. Для это надо сначала рассчитать на сколько мы хотим сдвинуть группу.
Ещё к этому стоит учесть, что если на пути группы например наземных юнитов окажется препятствие в виде других наземных юнитов, то они не пройдут сквозь и не станут обходить. Они просто упрутся и встанут. То есть перед отправкой надо ещё проверить свободна ли дорога.third112
16.11.2017 22:35Вы имеете в виду каждый из танков направить по своим координатам?
Это плохая идея в данном случае.
Почему плохая идея? Со стратегической точки зрения рассосредоточить танки м.б. оправдано, особенно после введения атомного удара.
move.Right := {X2};
Тут скобки случайно? На Паскале {X2} — комментарий.
То есть перед отправкой надо ещё проверить свободна ли дорога.
А как это сделать? По циклу задавать приращение пути на 1 и смотреть нет ли там юнитов? И каждый шаг — это тик?
Если эти юниты расположены в прямоугольнике с углами
А если я не знаю, координат моих танков? Могу я их по номерам или по id вызвать?MiXei4
16.11.2017 22:51Плохая, потому что это оооочень долго. на 10 юнитов понадобится 100 тиков, чтобы отдать им команды. Потом они будут двигаться. Чтобы таким образом сдвинуть все 500 юнитов на 1 пиксель понадобится примерно 1/4 всей игры.
Чтобы рассредоточить юниты можно использовать action SCALE, который масштабирует формацию юнитов. Можно как растягивать так и скукоживать группу.
Скобки не нужны, да.
Чтобы получить все юниты на карте надо смотреть функцию initializeTick из примера.
Задачу, как проверить дорогу на отсутствие препятствий, уже каждый решает сам.
Stecenko
16.11.2017 22:13Как-то такВыделить танк — одно действие, послать — другое. Совершить действие — присвоить объекту move нужные значения в нужные поля. За один тик — одно действие, за 60 тиков — не более 12 действий. 10 танков — 20 действий, почти 2 секунды.
Выделить танк с координатами x y
move.Action := ACTION_CLEAR_AND_SELECT;
move.Left := x;
move.Top := y;
move.Right := x;
move.Bottom := y;
Послать выделенный танк по координатам x1, y1:
Upd. не по координатам, а по смещению.
move.Action := ACTION_MOVE;
move.X := x1;
move.Y := y1;
Это просто. Сложно найти, какие танки надо выделить, и куда посылать, чтобы не застревали.
ryzhikovas
16.11.2017 15:49Это верно для состоянии бета-версии (и организаторы явно указывали факт возможных изменений). Теперь правила стабильны, самое время начать.
alix_ginger
15.11.2017 20:22Конкурс проводится на территории Российской Федерации.
А участникам обязательно находиться в России, постоянно проживать или достаточно быть гражданином России?Stecenko
15.11.2017 21:32Для участия не обязательно ни первое, ни второе, ни третье. Но если рассчитываете на призы подороже футболки, то, согласно правил, победителям надо будет предоставить копии документов, которые могут включать: паспорт, инн, снилс, лицевой счет в банке, иные документы, которые могут потребоваться.
Levhav
16.11.2017 02:10Как жаль что после конкурса вы выключаете возможность сражений. Мне только на первом Ai Cup повезло тем что на момент старта было почти 5 свободных дней. Я бы на новогодних праздниках с удовольствием по сражался. А сейчас нет возможности выделить достаточно времени.
ManWithBear
16.11.2017 15:44Планируется ли введение Unix серверов? Тот вариант свифта, который продвигается на форуме, по сути частная урезаная игрушка под виндовс с уже довольно не актуальной версией.
ivlevAstef
17.11.2017 10:06Да я тоже слегка был огорчен. Но swift3.1 не сказать что сильно устаревший на текущий момент :)
С Unix тоже не все так просто — запустить не на ubuntu (я пробывал на CentOS) тоже почти нереально.
third112
17.11.2017 01:08Еще непонятный вопрос. Во многих играх допустим метод S/L (save/load). Можно ли в данной игре сохранить состояние и вернуться, пусть м.б. и с потерей общего времени?
fasterdif
17.11.2017 12:30Лично мои замечания:
1) ЯО это ИМБА! сразу вспомнились Heroes 3 и их Некры(на больших картах чтобы выиграть надо играть либо некрами, либо чтобы у соперник был не некром — иначе шансы очень малы)
Вполне можно было сделать изящную стратегию из ЯО. А так в любом случае придётся учитывать и этот вид действий…
2) то что от раунда к раунду меняются(и довольно кардинально) правила (я про туман войны например) вносит неразбериху — можно написать очень хорошую стратегию(но без учёта тумана) и потом лихо пролететь в финале а можно наоборот(менее вероятно но всё же) бросить все силы на учёт тумана но не дойти до финала на «голой» карте…
3) я конечно понимаю что это соревы, борьба, жёсткий отбор и т.д. но всё же очень бы хотелось больше времени — думаю поучаствовали бы гораздо больше людей а стратегии были поинтересней!!! (Вот например, я узнал про конкурс только вчера вечером и получается у меня всего лишь одни выходные до первого раунда… Стоит ли вообще начинать?;-))sat2707 Автор
17.11.2017 12:321) Да ну какая имба. Кулдаун высокий, наводчик сносится на раз. Посмотри игры топов, всё с ЯО нормально
2) Ну стратегия пишется же не одна на весь чемпионат. Ребята постоянно дорабатывают с учетом новых фичей
3) Я бы попробовал. Пройти во 2 раунд не так сложно. А это уже футболка )
KosToZyB
Ожидается ли поддержка языкового пакета Go?
KosToZyB
Пропустил
Firstborn
Я уже неделю как написал и выложил на гитхаб клиент на основе клиента предыдущего года, сообщество желающих писать на го одобрило и уже пользуется, судя по активности на репозитории, каждый день интересуюсь у администрации о состоянии, но с той стороны «ни ответа ни привета».