Спортивное программирование

индекс
148,80

HabraWars — результаты первого чемпионата

HabraWars

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

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

Собственно: результаты и записи боев (для просмотра записей необходим Firefox или Chrome).

Победители:

1 место — korobkee (MiXei4)
2 место — ASmirnov80 (Sander80)
3 место — stalker.red (Stalker_RED)
4 место — alienff (alienff)
5 место — bolter.fire (kurokikaze)

Спасибо всем участникам за проявленный интерес! Предлагаю обсудить чемпионат и дальнейшие пути развития игры.
+48
20 ноября 2009, 21:44
11

комментарии (145)

+2
ramovsky #
Мой вышел в полуфинал!!! УРА!!!
+2
kurokikaze #
Пятое место! Arrrrgh! :)
+1
imwode #
Черт, из группы даже не вышел. 2-е место в группе с 2-мя победами. Но это было круто.
0
DKurilo #
Эх! Одной победы в полуфинале не хватило.
Ну что же. Я проиграл у победителя. И играл, не побоюсь этого слова, на равных! Победитель 5 побед, у меня 4!
В следующий раз выиграю. :)

Считаю, что 5-е место не совсем правильно. :) Но поздравляю.
Верно только первое, при таких правилах. :) Т.е. сильнейший однозначно только первый. :)
Ладно. Молчу, а то начну требовать провести все без победителя и таким образом выявить второе место. :) Чтобы убрать проблемы лотерейности в первых кругах. :)
+6
GogA #
Эх, остался я в полуфинале.

Давайте все скажем спасибо главному организатору <~P_r_i_m_a_t>!

Будем ждать второго чемпионата.
+2
GogA #
сорри, вот так P_r_i_m_a_t
+3
DKurilo #
Да. Спасибо организатору! :)
Не могу в карму проголосовать, но спасибо. :)
+5
Sander80 #
Есть! Второе место! (ASmirnov80)
Не зря я писал, что стратегия разумного невмешательства рулит!
Автору безумное спасибо, масса положительных впечатлений. Сейчас буду логи смотреть.
Плюсовать тоже пока не имею права, я здесь новенький
0
imwode #
Юыло у меня то разумное невмешательство. Не помогло.
0
Sander80 #
вы есть в полуфиналах? могу посмотреть и подумать.
кстати, могу попытаться дать описание своего алгоритма
(выкладывать код не хочется, да и глупо клонов плодить — а вот достаточно детальное описание идеи — с удовольствием)
0
imwode #
нет, я в группе L — andrey.pozhogin

У победителя, кстати, есть интересная фишка — если в него стреляют — он вместо того, чтобы убегать или просто продолжать движение — останавливается. Учитывая, что все бьют на опережение — талантливая тактика.
0
MiXei4 #
Не всегда. Я расчитываю что сделать лучше. Если не успеваю обогнать снаряд на нужное расстояние, то стою на месте :)
И по-моему останавливался так не только я.
0
kurokikaze #
Я тоже. Но мой ещё рассчитывал «манёвр вправо» и «манёвр влево», и из четырёх выбирал наилучший.
+1
MiXei4 #
Мой из шести выбирал лучший :)
+1
kurokikaze #
Ого, а ещё два варианта какие, если не секрет? :) Я хотел добавить движение с нормальной скоростью помимо ускорения, но поздно додумался :)
+1
MiXei4 #
Первый ход — Повернуться на месте в сторону от выстрела,
остальные ходы до падения бомбы бежать в ту сторону на полной скорости.

Ну и это проверяется на каждом ходу. То есть он может стоять поворачиваясь, а потом рвануться вперед.

Я не уверен честно говоря, что он использовался, но мне кажется такое возможно, если выстрел идет куда-то градусов под 45 от дула робота и вперед от робота.

Если мы просто рванем вперед, то это изначально приблизит нас к бомбе и только потом мы будем уворачиваться…
+1
kurokikaze #
Хм, да, разумно :)
+1
ramovsky #
Аналогично. Один в один.
+3
DrAlan #
у меня тоже эта фишка реализована была
помогла заработать 5 побед в первом круге (ну и другие фишки помогли)
вот только во втором круге попал с одними стояками а для них алгоритм не успел дописать (хотел динамическое подстраивание под каждую стратегию сделать)
фигово вышло что в воскресенье вели новые прикольчики а в четверг турнир — работа все время выедает
кстати спасибо за бои и плюс отдельное спасибо P_r_i_m_a_t (оба спасибо ему :)
в следующий раз боты думаю выйдут на новый уровень и научатся говорить и издавать боевые кличи: )
+3
Stalker_RED #
вот и раскрыт мой _самый_главный_секрет_ :)
+3
4dmonster #
я проверял опережение и если оно не накороет обе точки и исходную и максимально удалённую — то не стрелял.
Но этого оказалось не достаточно :)
+1
DKurilo #
Гм… Кажется, у всех разумное невмешательство.
Кто-же бой начинал? :))))
+1
kurokikaze #
Я :)
+4
kurokikaze #
У меня из за бага было периодическое «неконтролируемое вмешательство» :)
+4
DKurilo #
Эх, а я писал, что провокатор понадобится. :)
+2
kurokikaze #
Нет, он в любом случае нападал, просто в определённых условиях не замыкался на одной цели а весело отстреливал то что ближе.
+4
MiXei4 #
Я стрелял всегда, когда есть энергия 100%.
0
DrAlan #
я решил не поступать так подло и мой бот всегда стрелял когда есть энергия
вобщем я рад результату — вышел в полуфинал
+3
divbyzero #
Не вышел из группы, но 2 победы получил. Да и это отличный результат.
Спасибо организатору, было очень интересно! Пойду смотреть записи.

А когда будет второй тур?

+4
P_r_i_m_a_t #
Я не уверен как у меня со временем будет. Думаю в декабре можно будет провести.
+2
kurokikaze #
Я попробую автоматизировать, если Вы не против. Так и думал что руками всё делалось :)
+2
P_r_i_m_a_t #
Я очень даже не против :)
+2
P_r_i_m_a_t #
… не совсем руками, мне только после каждой группы надо было сохранить реплеи и пару кнопок нажать.
+1
Sander80 #
очень хотелось бы вбросить несколько вариаций семпловых ботов (для отладки алгоритмов)
если Вы не против, я бы даже написал несколько
+2
P_r_i_m_a_t #
Не против, но сначала надо все изменения в модель игры внести.
+2
imwode #
Взяли бы всех ботов первого турнира и рандомно высаживали в песочницу. На свой я разрешение даю, думаю и другие не против будут.
0
Sander80 #
а что-то в этом есть. если не открывать коды, то почему бы и нет
+2
GogA #
А никто не анализировал поведение соперника в момент последнего выстрела по нему и не запоминал его для прогнозирования его местоположения в момент следующего выстрела?

А то я смотрю на финал немного уныло и жалею что мой робот туда не попал.
+3
imwode #
Я хотел, но знаний не хватило. Я даже без дебаггера код писал.
+1
kurokikaze #
Я начал это делать, но к турниру не успел :)
+5
ramovsky #
Я делал при первых правелах. А при наличии инфы о снаряде, это не имеет смысла.
+1
Stalker_RED #
я запоминал кучу инфы о противниках, но практически ее не использовал — не хватило времени написать.
и невозможность потестить на адекватных противниках очень огорчает. стандартный алгоритм слишком уныл, а тестировать на копии своего тоже не тру — поведение у всех одинаковое.
+3
kurokikaze #
<Patrician|Away> what does your robot do, sam
it collects data about the surrounding environment, then discards it and drives into walls

Извините, первое напомнило :)
+4
Stalker_RED #
тактические ошибки именно там, где я и ожидал, промахи тоже. задумок интересных масса, осталось только реализовать :)
главная опасность — случайный разброс роботов при старте. тот, на кого срывается вся толпа — практически обречен.

когда второй чемпионат?
+2
ramovsky #
Написал мааааленькое условие: не стрелять, если до противника меньше 40пик(что бы себя не задело). Эта строчка стояла мне 7ми раундов!!!
#@)*I@*(#@##*#&
+2
kurokikaze #
Ага, у меня тоже это условие было :) И граница в 45 px, плюс невозможность отвернуться от противника если он выбран «наибольшей угрозой» :)
+2
Stalker_RED #
у меня хуже — два чистых суицида и еще кучу повреждений себе нанес. я как-то вообще не замечал раньше, что от своих выстрелов тоже повреждения идут. так поставил бы ограничение — дальность не меньше 46 едениц.
+2
DrAlan #
а я маленький секрет открою
если растояние меньше 45 я ставил стрелять на 45 и себя не заденешь (ну или чучуть) и волной накроешь пративника
+14
MiXei4 #
Поздравляю всех с моей победой! :) Спасибо всем!
+13
imwode #
мы вам еще задницу надерем :-)
+2
Sander80 #
проанализировал логи. очень понравилось.
заслуженное первое место за точность стрельбы и увороты
мое второе заработано стратегией — стрелял и уворачивался я очень плохо
+3
hyborg #
Сейчас получил — ноль побед (streambot). Честно пытался убегать от 2-3 противников ). Но радует код, который успел закодить, всё-таки он работал. А значит в следующий раз всем хана =).
+3
betal #
Две победы в группе тоже хороший результат ) Спасибо за игру)
0
w999d #
просмотрел записи, похоже что песочница все же немного отличалась — поведение моего бота было таким как при замене кода стандартных ботов в скрытой textarea — в определенные моменты он переставал стрелять вообще, тогда как при обычном тестировании показывал себя неплохо.

xD что не отменяет того факта, что я довольно плохо подготовился.
+2
P_r_i_m_a_t #
Хм, что-то мне подсказывает, что у вас где-то напрямую забит id своего робота = 0, а он может меняться.
0
w999d #
нет, не id… бот olamedia — можно посмотреть
+2
P_r_i_m_a_t #
Мне трудно так сходу понять, что с ним не так, потому что я не знаю как должно быть. Но вот эта строчка странной показалась:
if (enemies.length < 4)
+2
kurokikaze #
Смотря что задумывалось :) У меня тоже есть изменение стратегии когда противников остаётся меньше 2.
0
w999d #
как должно быть можно посмотреть в стандартном тестовом бое
0
w999d #
* я как бы признаю это своей виной, что стоило протестировать бота в скрытой textarea перед тем как выпускать.
0
kurokikaze #
Вряд ли дело в textarea, я думаю.
0
w999d #
я в прошлом топике писал, что попробовал поставить бота против своих ботов, в итоге сэмпловые боты с моим кодом разошлись по углам и не пытались отстреливаться.
0
P_r_i_m_a_t #
Нашел ошибку у вас. if (this.target_id… ) — target_id может быть 0.
0
w999d #
пользовался кодом из исходного шаблона :/
// Если ещё не выбрана цель или нашей цели больше нет, выбираем цель случайным образом
// target_id — это ID цели, а не её индекс в массиве enemies (индексы могут меняться)
if (this.target_id == -1 ||
0
w999d #
к тому же там же дополнительная проверка везде || !get_enemy_by_id(this.target_id, enemies)
0
P_r_i_m_a_t #
if (this.target_id && get_enemy_by_id(this.target_id, enemies)) — вот эту строку посмотрите внимательно.
0
w999d #
мм, понял… в тестовой песочнице у семпловых ботов id был всегда больше 0, я так полагаю
0
P_r_i_m_a_t #
Да, потому что 0 у первого бота, а первый был ваш.
+1
w999d #
поэтому когда я попытался поставить своего в качестве сэмпловых, они дружно позволили себя замочить первому боту с id = 0)
+1
P_r_i_m_a_t #
Я к тому, что соперников было 4.
+1
w999d #
разная тактика — пока больше 3-х участников можно вообще не вмешиваться, только отвечать на выстрелы.
+2
w999d #
вопрос к участникам, кто-то еще пытался экономить энергию?
я например делал частичные увороты, не увеличивал скорость пока снаряд еще далеко, что позволяло ответить на выстрел раньше.
при отсутствии выстрелов, близко к стенкам подходить нельзя — так как не останется места для маневра.
также в режиме против двоих (в теории) бот должен был добивать сильнейшего.

что хотел, но не было времени — проверка слишком близкостоящих врагов — от них стоит отходить всегда (в этот раз бот skubent несколько раз плотно подходил, и не давал двигаться xD)
+1
kurokikaze #
Я хочу сделать управление энергией, но пока всё что есть — бот останавливается если невыгодно бежать под взрыв.
+1
imwode #
У меня энергию экономил, пока не оставался один противник. А потом шел в лоб с небольшим уворотом, не убегая и сандаля без перерыва. Не помогло, 2 место в группе и вылет.
+2
Sander80 #
Словесное описание моей стратегии (у меня 2 место)
sander80.habrahabr.ru/blog/75934/
+3
SMiX #
Было бы интересно прикрутить к такому боту нейросеть
+1
ramovsky #
крутил. Для прогнозирования уворота. В первом варианте правил.
0
P_r_i_m_a_t #
Да, нейросеть могла бы микроконтроль намного улучшить.
0
ramovsky #
Что есть микроконтроль?
+1
kurokikaze #
Видимо, тактические решения — в противовес стратегическим :)
0
andoriyu #
боый выигрывает тактика, так-то
+1
kurokikaze #
Для боя важно и то и другое :) Например стратегическое решение = «переместиться в незанятый угол», тактическое — конкретный путь в обход роботов.
+1
bediary #
Отличный проект, отличная реализация, молодцы.
–7
Setti #
Я после пьянки, и как всегда в таком состоянии, хочется написать гадость. Но буду политкоректен: www.dailymotion.com/video/x2sc9t_axe-get-a-girlfriend_ads
0
ramovsky #
к чему это?*????
+3
imwode #
Это старик Хоттабыч и его коронное «А почему 22 мужика бегают за одним мячиком?»
0
ITdirector #
а онлайн нельзя показать записи боев?
+1
P_r_i_m_a_t #
Можно, но они несжатые довольно много занимают.
0
kurokikaze #
Можно отдавать в gzip, должно хорошо сжиматься.
+1
w999d #
каждый html ~4Mb
+3
kurokikaze #
Выложил описание своего бота. Мало ли, кому пригодится :)
0
Ex3NDR #
а можно где-нибудь хранить текущие просчитанные данные? мне, например, хочется A* сделать, а каждый раз пересчитывать…
0
kurokikaze #
В локальных переменных :) Или замыкания создавать.
+3
P_r_i_m_a_t #
Да, там же в первых строках примера это есть.
+1
Ex3NDR #
упс, недоглядел…
+3
w999d #
Есть идея — групповые бои: по 2 бота (одинаковых) от участника. Тогда добавится новый фактор взаимопомощи. Можно добавить как отдельную категорию боев.
+2
w999d #
добавить group_id каждому боту, выигрывает группа с хотя-бы одним выжившим ботом.
+1
w999d #
как вариант — x участников одной команды на x участников другой, за победу команды начисляется 1 балл каждому участнику. побеждает участник, набравший большее кол-во баллов по результатам нескольких раундов с разными наборами команд.
+2
smind #
Отсмотрел бои, имхо хорошо было бы биться группа на группу, например 4 своих против 4-х противника, а бои проводить не все против всех, а один на один…
+1
kurokikaze #
Ещё интереснее стандартизировать коммуникацию между ботами (т.е. сообщения только типа «помоги», «атакуй этого», «двигайся туда»), и объединять в команды разных ботов :)
0
Heckffy #
Хм, последовательностью таких команд вполне можно передавать закодированные сообщения :) Можно сделать чуть по-другому: разрешить передавать не более, например, 6 бит информации в течение 100 фреймов.
0
kurokikaze #
Это мизер, туда ничего не вставишь имхо. Пока координаты передашь, противник в другой угол уедет.
0
Heckffy #
Ну цифры пока с потолка взяты, но идея, я думаю, ясна: ограничение количества передаваемой информацию за период времени. Хотя, пока каждому роботу доступна информация о всем поле, это не имеет смысла: в любом случае можно каждым роботом оценивать ситуацию для всех союзников и генерировать такие команды для себя же. Вот если ограничить обзор робота, станет уже поинтереснее :)
0
w999d #
id врага вполне поместится в эти 6 бит )
0
w999d #
если точнее, id врага и 1 из 8 команд
+1
Heckffy #
Бои 1на1, на мой взгляд, были бы чересчур примитивными, уж очень мало вариантов поведения. А вот командные бои были бы довольно интересными :)
+1
w999d #
Чтобы сделать бои более динамичными можно угол поворота сделать float -x..+x градусов, где x ограничить до 3-5.
Также можно, например, уменьшить затраты на стрельбу и бег пропорционально, а начинать с 0 энергии — это позволит чаще уворачиваться и стрелять (придется выматывать противника, чтобы он не смог уворачиваться и стрелять).
Очень нехватает стрейфа xD.
* Это относится скорее к зрелищности турнира.
0
kurokikaze #
И получится Robocode :)
0
RomkoGoofique #
Вот бы игрушку можно было в офлайне отлаживать… Для сохранения бота/ботов можно Gears использовать.
+5
w999d #
по идее можно — весь движок в коде страницы, привязка к аккаунту для тестов не требуется.
0
naryl #
Жаль, нет возможности писать на одном из многих любимых языков.

Напомните, что случилось с идеей текстового протокола для управления роботами?
0
kurokikaze #
Она тихо заглохла. Впрочем, вы всегда можете подхватить, так сказать, упавшее знамя :)
–2
bediary #
а мне вот очень хотелось бы на пхп такую игрушку:( яваскрипт знаю, но для соревнований мне еще далеко(
+2
MiXei4 #
Да ладно… Я яваскрипт можно сказать не знаю. Примерно узнал как работать с массивами только во время написания бота.
В таких играх от языка мало что зависит.
А php и javascript вообще в данном случае мало чем отличаются. Если в моём коде добавить к переменным $, то практически будет код на php :)
+3
kurokikaze #
Это как раз хороший способ выучить язык :)
–1
imwode #
Мда. Я вообще только русский и английский знаю. Есть люди, которые ищут оправдания, чтобы что-то не делать.
+2
RomkoGoofique #
Скажите, а планируется ли делаться, что-то вроде дуэлей?
Так как торнамента ждать долго — а так заходишь: а у тебя есть выбор, на ком потренироваться =)
+1
P_r_i_m_a_t #
В принципе можно сделать.
+1
RomkoGoofique #
Извините — накинусь с предложениями.

Было бы круто, чтобы человек мог заводить несколько ботов в пределах одного аккаунта, так сказать, проверять на практике удачность того или иного изменения.

Если человек хочет устроить фуррор на турнире, ему бы помогла возможность обозначать некоторых роботов как приватных.
0
aliev #
Еще бы видео как проходят матчи. Рад за земляка :)
0
P_r_i_m_a_t #
Так оно есть. Пройдите по ссылке.
–4
naryl #
Конечно работы больше, но было бы интересно в рамках проекта написать специальный ассемблер и писать роботов уже на нём, установив быстродействие процессоров роботов в 50Гц. :) С почти неограниченными ресурсами и мгновенно выполняемыми программами не так интересно.
0
naryl #
Судя по динамике рейтинга этого коммента, любители низкоуровневой оптимизации на Хабре существуют, но их меньше, чем ненавистников. :)
+1
ramovsky #
Просто людям понравилось, и кардинальных изменений не хочется.
0
naryl #
На первой новости я предлоагал то же самое. Динамика была точно такой же.

habrahabr.ru/blogs/sport_programming/74523/#comment_2151428

Хотя там народу скорее всего не понравились использованные слова, а не сама идея.
0
4dmonster #
Мне кажется что для данной задачи слишком уж искусственное ограничение.

К тому же программисты для компьюторов и программисты системщики(для встроенных систем или вообще для систем на одной микросхеме) это как два разных непересекающихся мира.
0
naryl #
Можно попробовать организовать такой же турнир для системщиков. :)
+1
4dmonster #
Можно, но наберётся ди их достаточно?

Javascript, судя по комментам некоторые(да и про меня можно так сказать) попробовали только как раз на ботах. А будет ли так прост спец ассемблер, и что даже важнее будет ли на нём так легко писать.

Пощупали хабраварс больше тысячи (кажется даже очень сильно больше тысячи) а роботов прислало 67 человек.
0
naryl #
Писать на нём легко не будет. Это же игрушка для системных программистов! А не развлечение для местных веб-кодеров. :) Рекомендую посмотреть классику жанра — Corewars и AT-Robots Под DosBox обе идут.
0
P_r_i_m_a_t #
Программирование — это в первую очередь создание алгоритмов. Как раз при использовании JS кодинг сведен к минимуму. Участники сразу же начинают думать над логикой робота — что, на мой взгляд, в таких играх самое интересное. Ассемблер не предназначен для реализации высокоуровневых алгоритмов.
0
naryl #
> Участники сразу же начинают думать над логикой робота — что, на мой взгляд, в таких играх самое интересное.

Как уже сказал 4dmonster, системщики тоже хотят поиграться. :)
Думать над логикой робота, заботясь одновременно чтобы он не задумывался на минуту посреди боя — на мой взгляд ещё интереснее.
0
P_r_i_m_a_t #
Так организуйте, никто же не против…
0
naryl #
Подозреваю, что я буду единственным участником. Особенно виду только что прошедшего турнира. Но идея интересная.

/me добавил запись в список идей
0
4dmonster #
Вы всё же зря кладёте на чаши весов системщиков и программистов. Не забывайте это разные миры.

Кстати, если будете делать системный турнир, я бы посоветовал (хоть и не буду учавствовать, а буду читать/смотреть) просто взять эмулятор LEGO NTX за основу. Там остаточно возможностей для борбы роботов, а как бонус — финальные бои можно провести в реале.
0
naryl #
> Программирование — это в первую очередь создание алгоритмов.

В идеальном мире. Но на самом деле нужно ещё и думать о том, что эти алгоритмы будут исполняться на реальных машинах.
0
P_r_i_m_a_t #
Если говорить про современную робототехнику, то ассемблер уже давно не используются в качестве основного языка — задачи стали гораздо сложнее, да и с выч. ресурсами проблем нет. Реализовать какой-то небольшой кусок вычислений на ассемблере для увеличения производительности и использовать только ассемблер — разные вещи.
0
naryl #
Суть соревнования — в ограничении мощности процессоров роботов до порядка 100Гц. Очевидно, современные процессоры мощнее. :) Именно поэтому асм и не используется в современной робототехнике.
0
P_r_i_m_a_t #
Я понимаю, в чем суть соревнования :)
0
naryl #
Опыт с Эрлангом, Прологом, Хаскелем и т.д. помогает по-другому взглянуть на процесс разработки софта. Где-то находил упражнение для Java-прграммеров. Реализовать алгоритм два раза. Первый раз с ограниченим, что все функции должны возвращать void. Второй раз — не принимать аргументы. Опыт разработки под 100Гц-овые системы тоже пригодится всем. Даже тем, кто этого никогда делать не будет.
0
P_r_i_m_a_t #
Если вам просто ограничения нужны без ассемблера, то есть Google Code Jam.
0
naryl #
Там логиниться заставляют. Расскажите вкратце, что это. Если верить Википедии, единственное ограничение — время на разработку. Так они не первые и не последние, кто это делает.

А с ограниченными вычислительными ресурсами ничего современного нет.
0
P_r_i_m_a_t #
Суть такая — несколько задач (3-5), на решение которых отводится 2-3 часа. Задачи в основном на логику/математику. Участники пишут код на любом языке, для подтверждения решения скачивают входные данные и загружают результат на сервер. Для каждой задачи есть 2 набора входных данных: первый можно сказать тестовый, второй — основной. На загрузку результата дается 8 минут (для основного набора, для тестового не помню). В итоге все сводится к этому ограничению по времени и оптимизации своего алгоритма, чтобы уложиться в эти 8 минут. Конечно, это время зависит от компьютера участника, но этим можно пренебречь.
0
alienff #
Спасибо за хабравойны!
Не ожидал, что полудоделанный робот, отправленный «просто так, чтобы что-нибудь отправить» дойдет до финала. Или повезло (а значит надо проводить не 10 раундов, а больше) или я не знаю…
0
BlastBeat #
Ну что, когда продолжение?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.