Как я стал чемпионом Robocode

Я — Jdev, автор робота Tomcat, который в ноябре/декабре 2011 года был Королём Премьер Лиги общего зачёта Robocode (пруф) без единого поражения, сейчас занимает 3-е место из 911 в процентном зачёте и является героем моего повествования. Эту статью я решил написать для привлечения к этой игре внимания соотечественников, потому как одному защищать честь Российского флага становится уже тяжело (не считая двух моих роботов, лучший русский робот занимет 142-ое место). Рассказ я решил построить в виде журнала.

Для начала кратко раскрою заголовок, в котором я не много слукавил ради красного словца. Robocode — это игра для программистов (robocode, robowiki) в которой надо написать систему управления танком (роботом, ботом). Далее танки бьются между собой и получают очки за победы в раундах и попадания по противнику. В игре используются две системы рейтингов: средний процент очков (в коммьюнити эта система называется Averange Percents Score, APS, и является основной) и количество побед (в коммюнити эта система называется Премьер Лигой). В комьюнити чемпионов называют Королями, поэтому и я в дальнейшем буду использовать это слово. Так вот лукавство заголовка в том, что Король без приставок определяется очковой системой, а не победной.

2005-07 год: Начало
Я точно помню, что в первый раз я прочитал о Robocode весной-летом 2005 году на сайте javaportal.ru, но сейчас, почему-то, не могу найти ту статью. Написал я какого-то простенького бота, который рвал демонстрационных ботов и решил, что я невероятно крут. Скачал робота Shadow, который в 2004 году стал вторым и последним на текущий момент абсолютным чемпионом (дуэль, схватка и командная дуэль). Естественно, он моего питомца разорвал на мелкие клочки. Я не помню точно, то ли это поражение, то ли завал на работе, то ли завал на учёбе, но к осени 2005-ого я завязял.
Снова вспомнил о Robocode я в 2007 году, после того как в первый раз прочитал про генетические алгоритмы. Я попытался “подорбать” ДНК, которая бы определяла последовательность команд для реакции на события и эта затея, конечно же, с треском провалилась. На чём и закончился мой второй набег на эту игру.

Июнь-Июль 2009: Шаг на 0-ую ступеньку
В июне 2009 меня попросили провести спецкурс по Java в летней школе программирования ВКИ НГУ и я решил, попытаться построить занятия вокруг программирования танков (это была плохая идея, да и вообще выяснилось, что с совсем маленькими детьми я работать не умею). А для того чтобы чему-то учить, надо самому это изучить. Так начался мой третий, трёхлетний поход за короной Премьер Лиги.

Лето 2009-Осень 2010: собираем грабли
Своего робота я очень “оригинально” решил назвать Jdev. Самое удивительное, что в Tomcat’е до сих пор есть куски кода и дизайна Jdev’а, написанные в 2009-ом году. Я считаю, что если речь не идёт о промышленном программировании, то изобретение велосипеда является весьма полезным для саморазвития и поэтому я целенаправленно избегал чтения робовики, и самостоятельно изобрёл все велосипеды. И это, пожалуй, было моей самой большой ошибкой за весь поход.
Осенью 2009-ого я решил стать пооригинальнее и переименовал Jdev’а в UltraMarine. Это имя я выбрал, т.к. летом 2009 мы не одну ночь в общаге провели зарубаясь в Warhammer: 40,000, и хотя я играл за Тау, наиболее благозвучным мне показалось имя именно этого достойнейшего ордена моих заклятых врагов.
За эти полтора года я придумал и попробовал всё что только можно было — и существующие техники и какие-то свои — я мечтал превзойти ABC, автора Shadow, который изобрёл фундаментальную технику этой игры. Но всё было безуспешно.

Зима 2010-11: Релиз! Не удался...
Как-то вечером в депрессии я решил “Да гори оно всё синем пламенем!” и зарелизал своего питомца. Питомец тут же начал набирать в битвах 0 очков и исследование показало, что он использует API версии 1.7, а для проведения официальных боёв использовалась версия 1.6. Допилить бота было не сложно (что я в скором времени и сделал), но на тот момент депрессия взяла верх.

Весна-лето 2011: Поиски себя
В марте 2011 года случился очередной “прорыв”, поэтому и я решил провести в честь этого ребрендинг UltraMarine’а и переименовал его в Primarch’а. Затем 3-4 месяца я потратил на “прорыв”, который в очередной раз провалился. В июле 2011 года я осознал очередной провал и решил плюнуть на славу изобретателя и просто сделать хорошего робота. Так родился он, будущий чемпион, Tomcat.

5-ое августа 2011: Релиз!
Наконец, 5-ого августа я решился на релиз. Релиз оказался достаточно успешным — 50-ое место из 816. Далее было 2 неудачных релиза — которые навели меня на мысль, что я дорос до RoboResearch — тулзы для автоматического исполнения битв локально, которая в случае достаточного количества боёв против всех роботов может весьма точно предсказать место. Однако, тулза то ли очень давно была написана, то ли просто криво написана и битвы она выполняла путём запуска bat-ника игры. А инициализация игры может быть в разы дольше собственно битвы. По этому я решил написать свою тулзу Distributed Robocode — она, во-первых, инициализировала движёк только один раз и, во-вторых, позволяла одновременно запускать несколько боёв на разных компьютерах. Точных цифр я не помню, но моя тулза работает значительно быстрее. Первую версию тулзы я закончил к 23-ему сентября 2011-ого года.

Август-ноябрь 2011: Путь на верх
Я не проводил специального исследования, но думаю что не сильно совру, если скажу что восхождение Tomcat’а было одним из самых быстрых, если не самым быстрым за “современную” историю игры. Поэтому дальше события развиваются стремительно. Но я приведу только ключевые шаги.
10 августа (40-ое место): новая система управления данными о прицеливании противника, +5 мест и первая маломальская инновация.
11 августа (32-ое место): сортировка данных о стрельбе противника, +8 мест буквально одной строкой!
12 сентября (25-ое место): при выборе журналов попаданий противника используется информация о том, куда он не стрелял, +7 мест и вторая маломальская инновация.
7 октября (7-ое место): переписал пушку с использованием алгоритма k ближайших соседей, +8 мест
3 ноября (4-ое место): улучшил использование информации о “затемнённых” (сбиваемых моими пулями) пулях противника, +3 места

6 ноября 2011: Корона!
Это было феерично. Примерно в это время, мы поехали в Ангарск, родной город моей девушки. Ехать до туда от Новосибирска полтора дня, поэтому мы взяли ноут и по дороге я “танчил”. “Натанчил” генальную вешь — теперь, при определении опасности позиции учитывается расстояние между мной и противником, не в момент, когда эта позиция достигается, а минимальное расстояние между этой позицией и всеми позициями противника. С утра я сразу же запустил тест и очень быстро стало понятно, что новая версия удалась. Я её зарелизал и пошёл на день рождения к сестре девушки. Сидим, пьём, разговариваем, а в голове крутиться одна мысль: “Ну как он там?”. Важно сказать, что это было моё первое знакомство с будущими родственниками. Наконец, изрядно, выпив я решился попроситься в интернет и вижу — 3-е место! КОРОНА ПРЕМЬЕР ЛИГИ! Что там началось — я чуть не сплясал на радостях и тут же окрестил девушку Королевой Премьер Лиги. В общем до сих пор стыдно за тот день, но родители не запретили выходить девушке за меня замуж.

Ноябрь-Декабрь 2011: Битва за корону
В эти 2 месяца между 3-мя лучшими ботами (DrussGT, Diamond и Tomcat) развернулась битва за корону Премьер Лиги. За эти 2 Месяца она переходила из рук в руки раз 5-6 и этот факт отметили в хронике 2011 года. Победителем из той битвы вышел DrussGT, который уже более 4-ёх лет является основным (по процентам) Королём Robocode. Таким положение дел сохранилось и по сей день.

Январь-Июнь 2012: Стагнация
К новому году я выдохся и взял отпуск до февраля. В феврале тоже ничего хорошего не вышло и на этом фоне мой энтузиазм постепенно умер до Июня. И в июне тоже ничего интересного не произошло, за исключением того, что у меня остались только революционные с точки зрения кода идеи и я начал разработку младшего брата Tomcat’а — ConceptA.

На этом заканчивается достаточно славная, но не идеальная история о том, как я стал чемпионом Премьер Лиги Robocode. Надеюсь вторая попытка будет удачнее. Так же надеюсь, что хоть кого-то из вас, уважаемые читатели, я заинтересовал этой игрой. До встречи на квадратных полях боя!
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 37

    +2
    Спасибо за материал.
    Было бы здорово если бы вы описали как собственно начать. Такой себе hello world для Robocode. Думаю это помогло многим хотя-бы попробовать и понять в чем же суть, как происходит бой и так далее.
      +3
      Если вы читаете на английском, то уже сейчас можете начать отсюда:
      robowiki.net/wiki/Robocode/My_First_Robot

      Я же на выходных постараюсь перевести эту статью. Да и вообще, если будет спрос, постепенно переведу все основные статьи из робовики.

      Так же, может быть интересным посмотреть ролики на youtube по запросу robocode. Особенно стоит уделить внимание роликам от пользователя Azaxxo
        +2
        Я за отдельный топик. Я то читаю, но на русском было бы удобнее, да и полагаю вы сможете сделать пособие по легкому старту.
          +1
          Спасибо. Спрос будет. Года два назад друг рассказал про Robocode, тогда чего-то руки не дошли… А зря, пользительная вещь. Будут статьи, попробую на нашем ФИТе порекламировать.
          +3
          Если хотите посмотреть как выглядит бой, на youtube можете посмотреть, набрав в поиске слово robocode. Вот пример группового рубилова на небольшом прямоугольном поле: www.youtube.com/watch?v=HsGUoA13PMo
            +3
            Во, именно этой визуализации не хватает в статье. Теперь поняв, что к чему — могу даже автору кое-что посоветовать. По сути один из главных аспектов — это уход от столкновения (в данном случае от снаряда). А это я как то моделировал :)
              0
              Там не всё так просто. Радар бота не детектит летящие снаряды. О снарядах можно узнать, только когда они куда-то попадают. Радар детектит только положение и характеристики других ботов, попавших в поле зрения. А остальное – лишь предположения, расчет вероятностей, и т.д. В этом-то и интрига :)
                +1
                Это конечно усложняет, но выход один — надо уходить с прямой линии противника, т.е. находить такое положение, где все прямые от центров противника тебя не касаются — и будет тот же алгоритм обхода столкновений.
                  0
                  В принципе да, наверное. Тут дело усложняется тем, что положение корпуса противника известно, но положение башни с пушкой – нет. А ведь башня может вращаться в любую сторону, независимо от корпуса. То есть невозможно определить, куда направлена пушка противника и куда он будет стрелять, нет прямых линий, можно лишь с некоторой вероятностью предполагать направление (сектор огня противника), но и это сложно. Для этого нужно собирать и анализировать статистику, при этом одни используют теорвер, другие – матстатистику, и т.д. Наиболее продвинутые используют нейронные сети и генетические алгоритмы. Автор с этим, по-видимому, справился лучше остальных. :)
                    +1
                    На самом деле и не нужно знать положение башни и момент выстрела. Нужно просто исходить из наихудшего сценария. Так как если бы пушки всех танков были бы направлены на тебя. И ты уходишь от всех с приоритетом от тех кто ближе, стреляя одновременно по тем которые близко и мешают маневрировать.

                    Сети и генетика — тут будет слишком медленно работать и на самом деле не нужно. Любой детерминированный алгоритм будет работать выгоднее.
                      +1
                      Tomcat — дуелист, т.е. он умеет драться только один на один, по этому далее я буду говорить о дуэли.
                      Нет худшего вариант. Есть диапазон позиций, которые робот может занять за время подлёта пули, ~ от -45 до +45 градусов. И любой угол обстрела, в общем случае, равно вероятен.

                      Далее, основной инструмент в игре — мат статистика. Теор вер играет уже на много меньшую роль, нейронные сети удачно сумел запрограммировать только один человек, а гинетические алгоритмы используются «оффлайн» — т.е. дома у себя какие-нить параметры тюнишь часами, а потом выкладываешь затюненую версию. Собственно так я и потерял корону:)
                        +1
                        > И любой угол обстрела, в общем случае, равно вероятен.

                        Ну, это же не правда. В каждый конкретный момент — есть разница и зависит от количества и расположения противников. Не могут же они стрелять дугой — только по прямой.
                          +1
                          Я говорил только о дуэли, так что противник строго один. И он может стрелять куда угодно, хоть в противоположно направлении. Хотя как раз в этом ничего страшного нет.
                            +1
                            А, ну и может стрелять и стреляет — это разные вещи. Например, тех кто стреляет прямо по позиции Tomcat'а в момент выстрела, или полагает, что Tomcat будет двигаться строго прямо на максимальной скорости, Tomcat разрывает >99-0. Но в случае более продвинутых техник прицеливания уже намного сложно хотя бы примерно определить направление полёта пули.
                              +1
                              Вопрос в том на основании чего можно судить о положение башни с пушкой противника. Что вообще «видит» «наш» танк?
                                +1
                                Посмотрел немного, там все оказывается серьезно :)

                                Хорошо бы вы осветили бы вопрос набором статей — о радарах, управлении движением, и т.д. конкретными темами, чтобы человеку было легко сделать первую версию примитивного танчика…
                                  +2
                                  Да, я постараюсь на следующей недели подготовить статью об устройстве игры и с описанием первых шагов
              +1
              Отличный ролик. Многое становится понятнее. tvv, у вас же есть некоторый опыт в этом, вы бы не могли оформить статейку? Так, глядишь, народ вокруг вас и начал бы собираться.
                0
                Та не, у меня энергии не хватит. Может быть потом, если будут достижения, сравнимые с автором данной статьи…

                Кстати, для меня в Robocode наибольший интерес представляют командные бои (teamrumble), вот этим бы наиболее интересно было заняться.
                  +3
                  я бы, всё-таки, порекомендовал эти 2 ролика:
                  www.youtube.com/watch?v=dqHmp_kMz-U
                  www.youtube.com/watch?v=eqlPbtO3rQY

                  Потому как они лучше освещают о чём речь идёт в данной статье.
              +10
              Ну, депрессии и личная жизнь (с Маринами) описаны здорово. Про робота — как-то мельком.
                +3
                Я старался не перегрузить пост специфичными терминами, а с Маринами связаны 4 важные на мой взгляд вехи: 2 переименования, не удавшийся релиз и собственно победа. Но в любом случае спасибо за замечание, в дальнейшем постараюсь меньше отвлекаться от сути:)
                0
                Хотел посмотреть код Tomcat, но This file is no longer available
                  +1
                  Обновил линку
                    +1
                    Спасибо
                  +1
                  А почему именно танчики, а не CoreWar?
                    +1
                    Потому что они мне первыми на глаза попались, а по натуре я консерватор.
                    0
                    Отлично. Я сам недавно увлекся Robocode, написал нанобота пару месяцев назад, запостил туда. Понравилось. Мое мнение, чтобы войти хотя бы в ТОП 50, придется посвятить этому дело минимум человеко-месяц, и то и более. Это так, навскидку.

                    Пока что временно отложил, вместе с друзьями другой программерской забавой забавой увлекся (Salatron). Но я обязательно продолжу и с Robocode. Хотя мне одному скучновато немного, так как, увы, друзей Robocode не впечатлил, ну да ладно. Вот если бы кто-то замутил что-то типа клана, пожалуй, попросился бы вступить. ))
                      +2
                      Дайте, пожалуйста, ссылку на Salatron. А то я ничего внятного не могу найти про нее.
                    +1
                    В моём случае на то чтобы попасть в топ 50 потребовалось 2 года и ещё 3 месяца на то чтобы попасть в топ 3:) Но сейчас, для меня, я думаю потребуется не более человеко-недели на то чтобы с нуля забраться в топ-50.

                    А кланы там как-то не приняты.
                      +1
                      Хотел попробовать, а там только Java/.NET :( Биндингов к другим языкам нету?
                        +1
                        К сожалению нет. На робовики регулярно поступают запросы, но пока только прикрутили .NET и я не думаю, что стоит ожидать новых языков в ближайшее время.
                        +5
                        image
                          +2
                          <paranoia>
                          Да, ловко ВПК стран(ы) наиболее вероятного противника стоят ИИ боевого робота.
                          Как изящно — сами строгают/пилят люди, только выбирай наиболее качественное решение вопроса. Снимаю шляпу.
                          </paranoia>

                            0
                            А как зарелизить своего бота, что бы он участвовал в соревнованиях и учитывался в рейтинге?

                            Only users with full accounts can post comments. Log in, please.