войти зарегистрироваться

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)

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

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

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

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

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

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

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

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

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

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

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

    • Я не уверен как у меня со временем будет. Думаю в декабре можно будет провести.
      • Я попробую автоматизировать, если Вы не против. Так и думал что руками всё делалось :)
        • Я очень даже не против :)
        • … не совсем руками, мне только после каждой группы надо было сохранить реплеи и пару кнопок нажать.
      • очень хотелось бы вбросить несколько вариаций семпловых ботов (для отладки алгоритмов)
        если Вы не против, я бы даже написал несколько
        • Не против, но сначала надо все изменения в модель игры внести.
          • Взяли бы всех ботов первого турнира и рандомно высаживали в песочницу. На свой я разрешение даю, думаю и другие не против будут.
            • а что-то в этом есть. если не открывать коды, то почему бы и нет
  • А никто не анализировал поведение соперника в момент последнего выстрела по нему и не запоминал его для прогнозирования его местоположения в момент следующего выстрела?

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

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

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

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

      что хотел, но не было времени — проверка слишком близкостоящих врагов — от них стоит отходить всегда (в этот раз бот skubent несколько раз плотно подходил, и не давал двигаться xD)
      • Я хочу сделать управление энергией, но пока всё что есть — бот останавливается если невыгодно бежать под взрыв.
      • У меня энергию экономил, пока не оставался один противник. А потом шел в лоб с небольшим уворотом, не убегая и сандаля без перерыва. Не помогло, 2 место в группе и вылет.
  • Словесное описание моей стратегии (у меня 2 место)
    sander80.habrahabr.ru/blog/75934/
  • Было бы интересно прикрутить к такому боту нейросеть
    • крутил. Для прогнозирования уворота. В первом варианте правил.
    • Да, нейросеть могла бы микроконтроль намного улучшить.
      • Что есть микроконтроль?
        • Видимо, тактические решения — в противовес стратегическим :)
          • боый выигрывает тактика, так-то
            • Для боя важно и то и другое :) Например стратегическое решение = «переместиться в незанятый угол», тактическое — конкретный путь в обход роботов.
        • http://ru.wikipedia.org/wiki/Микроконтроль
  • Отличный проект, отличная реализация, молодцы.
  • раскрыть комментарий
    • к чему это?*????
      • Это старик Хоттабыч и его коронное «А почему 22 мужика бегают за одним мячиком?»
  • а онлайн нельзя показать записи боев?
    • Можно, но они несжатые довольно много занимают.
      • Можно отдавать в gzip, должно хорошо сжиматься.
    • каждый html ~4Mb
  • Выложил описание своего бота. Мало ли, кому пригодится :)
  • а можно где-нибудь хранить текущие просчитанные данные? мне, например, хочется A* сделать, а каждый раз пересчитывать…
    • В локальных переменных :) Или замыкания создавать.
    • Да, там же в первых строках примера это есть.
      • упс, недоглядел…
  • Есть идея — групповые бои: по 2 бота (одинаковых) от участника. Тогда добавится новый фактор взаимопомощи. Можно добавить как отдельную категорию боев.
    • добавить group_id каждому боту, выигрывает группа с хотя-бы одним выжившим ботом.
    • как вариант — x участников одной команды на x участников другой, за победу команды начисляется 1 балл каждому участнику. побеждает участник, набравший большее кол-во баллов по результатам нескольких раундов с разными наборами команд.
  • Отсмотрел бои, имхо хорошо было бы биться группа на группу, например 4 своих против 4-х противника, а бои проводить не все против всех, а один на один…
    • Ещё интереснее стандартизировать коммуникацию между ботами (т.е. сообщения только типа «помоги», «атакуй этого», «двигайся туда»), и объединять в команды разных ботов :)
      • Хм, последовательностью таких команд вполне можно передавать закодированные сообщения :) Можно сделать чуть по-другому: разрешить передавать не более, например, 6 бит информации в течение 100 фреймов.
        • Это мизер, туда ничего не вставишь имхо. Пока координаты передашь, противник в другой угол уедет.
          • Ну цифры пока с потолка взяты, но идея, я думаю, ясна: ограничение количества передаваемой информацию за период времени. Хотя, пока каждому роботу доступна информация о всем поле, это не имеет смысла: в любом случае можно каждым роботом оценивать ситуацию для всех союзников и генерировать такие команды для себя же. Вот если ограничить обзор робота, станет уже поинтереснее :)
          • id врага вполне поместится в эти 6 бит )
            • если точнее, id врага и 1 из 8 команд
    • Бои 1на1, на мой взгляд, были бы чересчур примитивными, уж очень мало вариантов поведения. А вот командные бои были бы довольно интересными :)
  • Чтобы сделать бои более динамичными можно угол поворота сделать float -x..+x градусов, где x ограничить до 3-5.
    Также можно, например, уменьшить затраты на стрельбу и бег пропорционально, а начинать с 0 энергии — это позволит чаще уворачиваться и стрелять (придется выматывать противника, чтобы он не смог уворачиваться и стрелять).
    Очень нехватает стрейфа xD.
    * Это относится скорее к зрелищности турнира.
  • Вот бы игрушку можно было в офлайне отлаживать… Для сохранения бота/ботов можно Gears использовать.
    • по идее можно — весь движок в коде страницы, привязка к аккаунту для тестов не требуется.
  • Жаль, нет возможности писать на одном из многих любимых языков.

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

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

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

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

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

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

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

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

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

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

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

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

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