Comments 91
На очереди: Swift, Go, Rust, Nim.
Пропустил
Когда мы планировали будущие бои, мы представляли себе что-то вроде серии игр Total War, StarCraft, C&C и иже с ними — умную тактическую битву стройных рядов техники, отход-наступление и прочие красоты подобных игр.
Если бы в Total War, StarCraft, C&C и иже с ними юниты упирались в другие и никуда после этого не ехали, то там никаких красот тоже не было бы.
Интересно, кстати, кто-нибудь сумеет написать самообучающийся алгоритм? Молодцы организаторы, вполне себе интересный варгейм :)
Спасибо напр добром слове :)
Для самообучения у нас, к сожалению, довольно скудный инструментарий. В следующей серии http://aicups.ru/ хотим это исправить — давно просится задачка специально под сетки
А что именно вы имеете в виду? Дайте ссылочку или протицируйте, если вам не сложно — разберемся
«У вас косяк в пакете под паскаль в FacilityControl.pas Ругается на эту строчку constructor TFacility.Create(const facility: TFacility); overload; Я в принципе локально у себя поправил. Ранер успешно запускается и конектится к эмулятору, но не уверен будет ли работать оно у вас»
У меня та же штука в D-7. Стер Overload -работает. Но это не по правилам — править можно только свою стратегию.
2) См.:
“Теперь напишем более сложный код”. Этот 2й пример только на Яве :( ИМХО в руководстве он должен быть переведен на все поддерживаемые языковые пакеты, иначе они будут в неравных условиях
3) См.:
Как вообще на Паскале выделить 10 юнитов, нпр., танков и послать их в точку с заданными координатами? Пробовал по разному — не работает. Может баг? А можно 10 танков послать в 10 разных точек за 1 тик? Мануалу явно не хватает примеров таких элементарных действий. Описание API слишком формальное, много второстепенных методов и добраться до основных за ограниченное время представляется проблематичным.
4) См.:
Прикольно было бы легенду выводить со значками/цветами. Хотя наверное и к этому можно привыкнуть.
5) См.:
ОБЯЗАТЕЛЬНО! Нужна легенда: цвет танка, вертолета и т.д. игрока и противника и у каждого число — сколько осталось.
6) См.:
А цифры потерь можно сделать более крупным шрифтом? Трудно следить за боем когда на цифру елочка накладывается. Было бы лучше сделать отдельно информационное окошко и легенду там дать — какого цвета какие юниты и сколько их осталось.
Все виды техники имеют своё схематичное изображение.В Local runner виды техники обозначены маленькими кружками разного цвета. Но какой цвет какому виду соответствует — остается только гадать!
есть также неофициальный рендерер, разработанный в сообществе участников AI Cup.А ссылку можно,pls?
В Local runner это всё же не просто кружочки, если приблизить, то видно, что они по-разному нарисованы.
Именно поэтому вместе с утилитой Local runner распространяется также и специальный плагин для отображения любой нужной вам информации поверх имеющейся картинки.Как зовут этот плагин? Как его подключать? Где про него написано?
2) Код на Java не имеет сложных конструкций и макросов, похож на другие популярные языки и поэтому легко читается всеми программистами. Переписывание «Быстрого старта» на другие языки займёт значительное время и скорее всего просто приведёт к сокращению списка языков, поддерживаемых из коробки.
3) В Песочнице чемпионата есть участники, пишущие стратегию на Pascal. Значит в нём нет какого-либо крупного бага, приводящего к частичной или полной неработоспособности стратегии. В мануале довольно подробно описаны возможные действия стратегии. Достаточно внимательно прочитать его и осмыслить. В любом случае, наше соревнование рассчитано на длительное участие, а сколько времени на него выделять, это уже ваше решение.
Мы не обнаружили проблем с компиляцией пакета на 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!
В любом случае, наше соревнование рассчитано на длительное участие, а сколько времени на него выделять, это уже ваше решение.Т.е. если не знаю Яву, нужно как минимум времени, чтобы выучить Яву?
Обычно, когда человек заявляет, что он не понял ничего, значит он и не хотел разбираться. В таком случае я ничем не могу помочь.
Если бы вы внимательно прочитали мой комментарий, то поняли, где можно посмотреть версию компилятора.
Wow! Ребусы продолжаются!
Вы написали:
При локальном тестировании вы можете использовать любой компилятор, но мы можем гарантировать правильную работу только с версией, указанной в разделе сайта «Языковые пакеты».
Смотрим, что написано в разделе сайта «Языковые пакеты»:
Pascal Free Pascal 3.0+ [Delphi mode]
А Delphi mode какой версии?
Если бы вы внимательно читали правила, то сейчас не спрашивали у меня страницу.Ну тупой я! Ну подскажите!
Для чтения приведённых вами участков кода достаточно иметь базовые навыки программирования, а также знать английский, вот и всё.Что все?
ANY,
ALLY,
ENEMY
Переводчик гугл переводит:
ЛЮБЫЕ,
ЭЛЛИ,
ВРАГ
И как такое знание английского поможет перевести на Pascal? ;)
BTW А что значит ALLY? Гугл предлагает: союзник, помощник, пособник, но и
мраморный шарик.
И еще мне интересно: это конкурс на создание ИИ-стратегии или на знание языков (английского, явы)?
Вот ссылка на правила. Все действия стратегии описаны в пункте 2.6 Управление (страницы 12-13). Но в любом случае нужно минимум всю вторую главу прочитать для понимания правил игры.
2)
Все действия стратегии описаны в пункте 2.6 Управление (страницы 12-13).
Читаю:
CLEAR_AND_SELECT. Стандартное выделение дружественных юнитов рамкойДля такого выделения надо знать координаты каждого унита. Как мне их узнавать? А иное выделение возможно? (по номеру юнита)
3) что у Вас значит «ALLY»?
К сожалению или к счастью, но сейчас нет популярных языков программирования с русским синтаксисом, за исключением, наверное, 1С. Так что знание технического английского является обязательным требованием для любого программиста. А то, что Гугл странно переводит, давно известный факт.
Это перечисление не является частью API игры и присутствует только в примере. В вашей стратегии его может не быть.
А Delphi mode какой версии?
Не понял вопроса. Стратегия компилируется примерно вот так (вырезано из compile-fpc.bat, входящего в состав pascal-cgdk):
fpc.exe -Cs67107839 -Mdelphi -XS -vm3018 Runner.dpr -oMyStrategy.exe
Free Pascal указанной версии с ключиком Delphi.
Не спортивно!
Для каждого элемента коллекцииБольшое спасибо за Ваше желание помочь! Я слышал, что в Яве есть коллекции, но в Дельфи-7 их в таком виде нет.И как переводить?
Мне писали, что за пару часов возможно перевести. Предположим, что всего участников будет 1000, а из них на Яве 200, т.о. 800 будут переводить и каждый потратит 2 часа, получим 1600 часов. А если организаторы переведут на 9 языков, то потратят всего 18 часов.
5) Действие стратегииТут совсем непонятно.
private enum Ownership {
ANY,
ANY — это вызов функции? В Яве запятая м.б. разделителем меду операторами?
А enum что значит?
enum — это перечисление, специальный класс, здесь класс Ownership, принадлежность. ANY, ALLY, ENEMY — его объекты, не функции.
В-о-о-о-т мы и уперлись в различные трактовки ООП в разных языках.
Согласно википедии:
Класс — абстрактный тип данных в объектно-ориентированном программировании, задающий общее поведение для группы объектов; модель объекта.
Объект — это экземпляр класса. А Вы говорите, что в классе enum уже есть объекты (ANY, ALLY, ENEMY). Это с ходу не понять.
Если другой класс имеет поле класса Ownership, его значением может быть только один из указанных здесь объектов.
Если я правильно понял это скалярный тип Виртовского Паскаля:
type Ownership=(ANY, ALLY, ENEMY);
По поводу коллекций — откройте стартовый пакет в Вашей IDE. Возможно, нужная функция возвращает массив, список, или другую структуру, которая есть в Вашем языке, и которую можно обойти циклом.
Вот видите как все не просто и неоднозначно! Одним из лучших классических мануалов когда-то считался Macintosh Inside. Он был двуязычный Паскаль и Си. Там удалось предусмотреть все несовпадения этих языков. А в нашем случае ребус.
На самом деле переводить этот код на свой язык не имеет большого смысла. Я сначала перевёл, потом всё снёс.
Реально полезная функция там — initializeTick. Она каждый тик актуализирует массив vehicleById, в котором хранится полная информация обо всех юнитах.Это одномерный массив-вектор? А какой интервал индекса этого массива? От нуля до? Он не сортирован? Все юниты (танки, вертолеты и т.д.) вперемешку? Если юнит гибнет из vehicleById он убирается?
Главное, что у вас есть метод 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()); // Лишнее
}
}
Таким образом мы имеем массив с информацией обо всех юнитах включая координаты, тип и тп.
Кажется в паскале есть нечто подобное — 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));
Это то самое?
На самом деле переводить этот код на свой язык не имеет большого смыслаПонятно, что практического смысла нет. Но как еще понять принципы организации элементарных действий, если в мануале об этом не сказано?
Делаешь ИИ, продумываешь, находишь годные решения… Только для того, чтобы организаторы изменили правила так, чтобы твои решения перестали работать.
Очень жаль! А что Вы имеете в виду?
Но ведь судя по статье — все сильные решения, которые участники придумали организаторы исключили введя правки, которые сделали эти решения неудачными.
По факту, лучшее поведение участника во время бета теста — это молчать, если придумал выигрышную стратегию. А то её выпилят в релизе.
В итоге ваши участники по сути два раза участвуют в конкурсе. Сначала в его бета версии, потом второй раз в релизной.
P.S>
Пример: Вы говорите что ввели ядерную бомбу, потому что тупое «выделить кучу и послать» — рулило. Но потом сами же показываете варианты, когда правильные тактики(клещи), легко заруливают тупое выделение, без всякиз бомб. Но имбу в виде ядерной бомбы все равно ввели. Зачем?
Так она не имба. Ввели потому, что иначе никакого стимула развивать стратегию, хотелось разнообразия. Да и участники сами просили, на том же форуме и в чате можно посмотреть :)
У нас же нет задачи придушить слишком сильные тактики, наша цель — дать выбор и вариации :)
Применение ядерного удара имеет свои ограничения и уж точно не является имбой. Да, это нововведение ускорит вымирание простых стратегий, но они в любом случае стали бы менее эффективны со временем. АОЕ стало дополнительным элементом геймплея, улучшило игровой баланс. С этим согласна не только команда разработчиков, но и большинство участников.
Жаловаться на изменения во время бета-теста вообще странно. Кажется, у вас просто превратное понимание о целях его проведения. Он нужен не для того, чтобы кто-то из участников пораньше начал писать стратегию и получил тем самым преимущество. Он нужен в первую очередь для разработчиков. Выявить и исправить баги, сделать игру лучше. От этого выйграют все.
вы слишком легко рассуждаете об игровом балансе.
Для этого не нужно быть участником конкурса — вполне достаточно вдумчивого прочтения статьи.
они в любом случае стали бы менее эффективны со временем
Ну если в любом случае стали бы — зачем вообще вмешиваться?
улучшило игровой баланс
Камень-ножницы-бумага имеет идеальный игровой баланс. Но это же не повод регулировать баланс, пока он не станет похож на эту игру?
С этим согласна не только команда разработчиков, но и большинство участников.
В любом конкурсе есть согласные и не согласные. Но согласие не означает правильность. Впрочем, и моё мнение не является чем-то выделяющимся и также не влияет на правильность.
Камень-ножницы бумага имеет идеальный игровой баланс
...-ящерица-Спок!
Идеальный вариант… если нет особенностей местности и т д
В этой игре можно было бы с туманом войны обойтись только одним контактником(бойцом ближнего боя).
Стремление сделать разнообразие техники под «камень ножницы бумага» — плохая идея.
Например в старе балансны были комбинации первых 2х юнитов. Пулеметчики+огнеметчики вс герлинги+гидры вс зелоты+драгуны.
Что общего? радиус стрельбы+у всех мили+рандж.
А тут вы намутили. Ваш подход не плохой, но слишком шаблонный для карточных игр.
Когда единственное что может сделать ИИ — выбрать случайное значение из трёх и всё.
Все в равных условиях, идеальный баланс. Но бред.
Потому что требуется, чтобы ИИ на что-то влиял. То есть по сути — задача разработчика найти идеальную стратегию и научит ею ИИ. Но, это противоречит концепции баланса! Потому что баланс — это когда идеальной стратегии просто нет!
Тем, кто хорошо научился, управлять тупой кучей
Я бы сказал: тем, кому удалось догадаться, что имел в виду автор мануала. И да, Вы правы — есть почти месяц, чтобы догадаться.
В любом случае возникает вопрос: управлять тупой кучей — это ИИ?
Не ИИ, но Вы можете написать свой ИИ, который всех их уделает :)
Это плохая идея в данном случае. Тут надо оперировать группами.
Одной строчкой это сделать не получится конечно и весь код я не напишу…
На первом тике необходимо выбрать нужные юниты.
Если эти юниты расположены в прямоугольнике с углами (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)
То есть отправить группу по указанным координатам напрямую нельзя. Для это надо сначала рассчитать на сколько мы хотим сдвинуть группу.
Ещё к этому стоит учесть, что если на пути группы например наземных юнитов окажется препятствие в виде других наземных юнитов, то они не пройдут сквозь и не станут обходить. Они просто упрутся и встанут. То есть перед отправкой надо ещё проверить свободна ли дорога.
Вы имеете в виду каждый из танков направить по своим координатам?
Это плохая идея в данном случае.
Почему плохая идея? Со стратегической точки зрения рассосредоточить танки м.б. оправдано, особенно после введения атомного удара.
move.Right := {X2};
Тут скобки случайно? На Паскале {X2} — комментарий.
То есть перед отправкой надо ещё проверить свободна ли дорога.А как это сделать? По циклу задавать приращение пути на 1 и смотреть нет ли там юнитов? И каждый шаг — это тик?
Если эти юниты расположены в прямоугольнике с угламиА если я не знаю, координат моих танков? Могу я их по номерам или по id вызвать?
Чтобы рассредоточить юниты можно использовать action SCALE, который масштабирует формацию юнитов. Можно как растягивать так и скукоживать группу.
Скобки не нужны, да.
Чтобы получить все юниты на карте надо смотреть функцию initializeTick из примера.
Задачу, как проверить дорогу на отсутствие препятствий, уже каждый решает сам.
Это верно для состоянии бета-версии (и организаторы явно указывали факт возможных изменений). Теперь правила стабильны, самое время начать.
Конкурс проводится на территории Российской Федерации.
А участникам обязательно находиться в России, постоянно проживать или достаточно быть гражданином России?
Поддерживаю, сделайте постояный сервер или после контеста выложите код сервера чтобы можно было спокойно поиграться
Очень хочется попрактиковаться и сражаться с реальными людьми.
www.codingame.com/multiplayer/bot-programming
За первое место макбук не дарят, но регулярно проходят соревнования с неплохими призами. И разнообразия там поболее…
1) ЯО это ИМБА! сразу вспомнились Heroes 3 и их Некры(на больших картах чтобы выиграть надо играть либо некрами, либо чтобы у соперник был не некром — иначе шансы очень малы)
Вполне можно было сделать изящную стратегию из ЯО. А так в любом случае придётся учитывать и этот вид действий…
2) то что от раунда к раунду меняются(и довольно кардинально) правила (я про туман войны например) вносит неразбериху — можно написать очень хорошую стратегию(но без учёта тумана) и потом лихо пролететь в финале а можно наоборот(менее вероятно но всё же) бросить все силы на учёт тумана но не дойти до финала на «голой» карте…
3) я конечно понимаю что это соревы, борьба, жёсткий отбор и т.д. но всё же очень бы хотелось больше времени — думаю поучаствовали бы гораздо больше людей а стратегии были поинтересней!!! (Вот например, я узнал про конкурс только вчера вечером и получается у меня всего лишь одни выходные до первого раунда… Стоит ли вообще начинать?;-))
Я так и не получил ответа: dcc32 в compile-dpr.bat у вас на сервере будет работать?
Скорее просто не всё добавили…
Например с++14 при том что конкретно на новом стандарте пишут не так чтобы многие(уж точно не большинство). Казалось бы мелочь?.. Но… То что некоторые новые конструкции не совсем очевидны это ещё ладно, но вот у меня например вижла с компилятором не понимающим 14-й стандарт. Поэтому надо либо искать-скачивать-покупать новую вижлу, либо возиться-разбираться с консольно-блокнотными версиями.
Тоже есть неудобства.
Завезите Node.JS, пожалуйста.
А вообще странно, что не сделали просто работу через некое http API.
Возвращает значения изменяемых полей для каждой видимой техники, если хотя бы одно поле этой техники изменилось. Нулевая прочность означает, что техника была уничтожена либо ушла из зоны видимости.
Собственно вопрос: а как понять, что ты убил какого-то юнита? Т.е. сейчас если у юнита стало 0 hp, то это подразумевает два исхода (убит, спрятался). Зачем было так усложнять?
Russian AI Cup 2017 — отчет о бета-тесте, старт чемпионата. Хотели StarCraft, получили странный Total War