Пользователь
0,0
рейтинг
17 мая 2009 в 14:50

Robocode

Слоган RobocodeХабрасообщество поддержало идею написания обзоров игр для программистов, поэтому я продолжаю эту серию статей. Напомню, в прошлый раз я рассказал Вам про игры Colobot и Ceebot.

Сегодня Вы узнаете про отличную игру Robocode. Она предназначена для продвинутому обучения Java, и имеет большие функциональные возможности, несмотря на кажущуюся внешнюю простоту.

Robocode — это обучающая игра с открытыми исходными кодами, разработанная Mathew Nelson и Flemming Larsen. Ее единственной целью было облегчение изучения языка программирования Java.



Игра



Основным движущим элементом в обучении должна была стать конкуренция. Каждый участник пишет код на Java, который управляет небольшим танчиком, и сражается с другими такими же танками.

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

Разработчики настоятельно обращают Ваше внимание на то, что в Robocode нет крови, нет людей и нет политики. В игре есть взрывы, но если Вы заботитесь о собственном психическом здоровье — их можно легко отключить.

У танков большие возможности: они могут двигаться по игровому полю, стрелять, узнавать месторасположение друг в друга, врезаться в стены и в других роботов, узнавать где находятся летящие пули и использовать всю мощь языка Java.

Битва танков


Естественно, какой-либо простой стратегии для выигрыша нет. Существует огромное количество различных тактик, у каждой из которых есть свои преимущества и недостатки. Размер кода у различных танков колеблется от десятка строк до нескольких тысяч. Некоторые даже умудряются прибегать к статистическому анализу и нейронному программированию.

Интересно подошли к написанию робота в СПБгУ ИТМО. Танк был разработан с использованием SWITCH-технологий(смесь автоматного и объектно-ориентированного программирования) и к проекту прилагается серьезная проектная документация.

Вы можете скачать ее и исходные коды танка абсолютно бесплатно на странице проекта.

Установка игры



На официальном сайте проекта находится огромное количество различных материалов. Если Вы хотите начать обучение — это лучшее место для старта.

Установка Robocode


Сама игра распространяется в виде jar-архива, который можно скачать со страницы скачивания игры.

Игра кроссплатформенная, так как она написана на Java. В нее можно играть на Windows, Linux, FreeBSD и в любой другой системе, на которую портирована Java-машина.

Java


Перед установкой игры не забудьте установить Java.

Ваш первый робот



Готовы к созданию своего первого робота? Я уверен это будет легко, занимательно и просто интересно!

Создать робота очень просто. Но сделать его победителем — нет.

Robocode Logo


Встроенный редактор



Разработчики включили в игру собственный редактор. Поэтому у Вас уже есть готовая среда для разработки с подсветкой синтаксиса.

Эта программа называется Robot Editor, и она доступна в меню Robot -> Editor.

Robocode Editor


Давайте теперь создадим заготовку робота. Для этого перейдите в пункт меню File -> New Robot. Придумайте имя Вашему будущему роботу и введите Ваши инициалы(никнейм).

Вуаля! Теперь Вы видите набросок кода Вашего будущего робота.

Примечание: Если Вы хотите использовать Eclipse или другую IDE, то без труда найдете соответствующее руководство по интеграции с Robocode в Интернете.

Новый робот



В самом простом виде код должен выглядеть так:

// Используем пакет с Вашими инициалами. Это сделано для избежания конфликтов имен.
package v673;

// Указывает Java, что мы собираемся использовать объекты Robocode в нашей программе.
import robocode.*;

// Указывает Java: "Класс, описываемый ниже, является расширением класса Robot.
// И называется MyFirstRobot".
public class MyFirstRobot extends Robot
{
   // Игры вызывает метод run(), когда начинается битва.
   public void run()
   {
     // Здесь идет непосредственно код Вашего робота.

   }

   // Существует и другие методы, которые мы рассмотрим позже.
}




Пора уже что-нибудь делать!



Давайте заставим нашего робота что-нибудь делать. Добавьте в метод run() следующие строчки:

// while (true) означает то, что код в скобках будет выполнятся до тех пор, пока игра не прервется.
while (true)
{
   // Робот проедет вперед на 100 пикселей.
   ahead(100);

   // Робот повернет свою пушку на 360 градусов.
   turnGunRight(360);

   // Робот вернется назад на 100 пикселей.
   back(100);

   // Робот снова повернет свою пушку на 360 градусов.
   turnGunRight(360);

   // После чего код начинает выполняться снова.
}




Наш робот будет выполнять эти действия снова и снова, пока не умрет. Неплохо, да?

Огонь!



Когда радар танка находит вражеский робот, мы начинаем стрелять:

public void onScannedRobot(ScannedRobotEvent e)
{
   fire(1);
}



Как Вы можете заметить, в функцию отправляется объект ScannedRobotEvent, который содержит информацию о вражеском(или дружеском) роботе — сколько у него здоровья, где он находится, с какой скоростью передвигается и т.д.

Но так как у нас простой робот — мы не будем уделять этому много времени.

Компилирование робота



В первую очередь, сохраните Вашего работа: File -> Save.

Теперь скомпилируйте робота: Compiler -> Compile.

Компилирование


Если Ваш робот скомпилировался без ошибок — Вы можете приступать к битве. Начните новую битву выбрав в меню игры Battle -> New. Если Вы не видите собственного робота — обновите список, нажав F5. Добавьте Вашего робота в битву вместе с еще одним роботом. Например, вместе с танком Sample.

Новая битва


Запустите битву, нажав Start Battle.

Enjoy!

Анатомия робота



Только что мы создали собственного робота. Давайте теперь чуть более подробно рассмотрим конструктивные особенности танков.

Танк состоит из трех частей: тело танка, пушка и радар.

Анатомия робота


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

Поле битвы



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

Система координат:

Система координат


Заметьте, что даже если Вы выполните ahead(50000), команда остановит свое выполнение в тот момент, когда робот врежется в стену.

В RoboWiki Вы можете более подробней ознакомиться с игровой физикой.

Угол отклонения



Иногда удобно использовать относительный угол. Например, для поворота к другому роботу можно использовать следующую команду:

turnRight(event.getBearing());


То есть getBearing() указывает на сколько градусов нужно отклонится от текущего положения, чтобы увидеть, к примеру, вражеский танк.

Угол отклонения


Примечание: Если Вы передадите в функцию turnRight() отрицательное значение, то робот повернется влево.

Чувства робота



Нет, мы не будем говорить о ранимой душе танка. Мы рассмотрим функции, по которым робот может узнавать влияние внешних факторов.

Ваш робот знает, когда:
  • Он ударяется об стену: onHitWall()
  • В него попадает вражеская пуля: onHitByBullet()
  • Он врезается в другого робота: onHitRobot()
  • А также еще ряд экзотических функций, например, когда Ваша пуля попадает в пулю вражеского робота.


На основе этих функций построены все роботы в Robocode. Более подробно ознакомится со всеми функциями можно в API-документации.

Что дальше?



Больше всего учебного материала собрано на официальном сайте игры.

К сожалению, русских материалов про Robocode не так и много. Но я надеюсь, что английский язык для Вас не сильно большая проблема.

Рекомендую ознакомится с курсом по Robocode от Mark Whitley: CS 3230 — Robocode Project. Кстати, есть коллективный русский перевод благодаря проекту translated.by. Но он, к сожалению, еще не оформлен в отдельный PDF-файл, отсутствуют картинки. Поэтому я, на данный момент, советую изучать оригинал.

Также есть две отличные статьи от Sing Li про Robocode: Rock 'em, sock 'em Robocode! Round 1, Rock 'em, sock 'em Robocode! Round 2

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

Кроме того, на официальном сайте Вы найдете множество ссылок на другие отличные статьи про Robocode.

Можете даже ознакомится со статей про использование генетических алгоритмов в RoboCode.

В репозитории RoboCode находится огромное количество различных роботов. К некоторым выложены исходные коды.

Существует официальный блог разработчиков: robo-code.blogspot.com.

На этом наш обзор я бы хотел закончить.

Если Вам интересны мои статьи, то существует хак, позволяющий читать их до релиза на хабрахабре: подписаться на мой блог, ну или на твиттер.

Желаю успехов в постижении тонкостей Robocode!
Станислав @v673
карма
103,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (56)

  • +5
    Игрушка моего достуденческого детства :)
  • 0
    Как рас изучаю JAVA и надеюсь это поможет. А кто нить изучал языки с помощью таких вот вспомогательных штучек?
    • 0
      Что по-поводу книжек скажете? Больше интересует SE. На многих форумах рекомендуют вот такую литературу: Патрик Ноутон, Герберт Шилдт — Java 2. Наиболее полное руководство и Брюс Эккель — Философия Java. 4-е издание
      • 0
        Джава сильна в EE но не в SE (для этих нужд .NET более предпочтительнее — мое мнение). Читал все эти книги, но вот мой рецепт хорошего обучения:
        1) Сначала видео уроки, что то типа TeachPro Java for beginner, потом — professionals
        2) А теперь уже и Философию Джава Еккеля, желательно новую редакцию (то есть на англицком).

        Так как если вы новичек и только начинаете, то в этих книгах вы скорее всего не найдете нужной теоритической базы, или найдете все, но плохо усвоете, а с видео уроками в разы легче.
        • 0
          4е издание Эккеля есть уже в переводе. По-моему с него и надо начинать…
          • 0
            русское издание урезано наполовину от оригинала
        • 0
          «Философия Джава» — это которая по-английски «Thinking in Java» или нет?
          • 0
            она самая
          • 0
            Да
      • 0
        Определенно Эккель. Он неимоверно крут)
        • 0
          минусовать за использование java — дурной тон, господа.
    • –12
      Ей, .NET«чики — хватит минусовать!
    • –10
      Ей, .NET«чики — хватит минусовать!
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Да точно есть и ещё живет… вот только название не помню :)
      • +2
        Terrarium
        • +4
          Обзор Terrarium`а тоже появится в свое время.
      • 0
        ммм… вы меня заинтриговали=) На джаве что-то похожее по описанию я помню — это electro jungle, кажется так; теперь вот на #'версию очень хочется посмотреть)
  • +4
    первый шаг на пути к созданию ПО для Терминатора :)
  • +1
    похоже на CoreWar, но там используется язык похожий на ассемблер
  • –1
    Было бы классно, если бы использовались языки, которые проходят в школе, то есть Basic или Pascal, тогда бы у детей была бы мотивация изучать программирование.
    • +2
      Мне кажется в школах нужно перестать изучать мертвые языки. Ведь не учили же мы латынь. А Паскаль учили.
      Понятно что с чего-то надо начинать, но зачем с Паскаля? Есть более современные ЯП
      • 0
        Вы это учителям скажите. Они все еще говорят, что паскаль современнее бейсика и в институтах сейчас изучают именно паскаль.
      • +2
        точно не помню где, но я слышал что мотив преподавания латыни в свое время заключался не столько в самом языке, сколько в том, как работает и тренируется мозг ученика при изучении именно этого языка (в силу особенностей самого языка) — такого эффекта вроде как сложнее было добиться при изучении других предметов.
        • +3
          Латын при изучении живых языков может очень пригодиться, есть как прямые наследники — романская группа языков, так и языки, которые переняли часть слов.

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

          Загружать мозг бессмысленной информацией по принципу лишь бы загрузить, не вижу в этом смысла. По-моему, это все отмазки людей. котрым обидно, что их предмет больше невостребован.
      • 0
        современность языка не играет роли, главное что он должен делать — помогать научить правильно мыслить и проектировать. паскаль для этого прекрасно подходит. а многие современные ЯП многое для программистов упрощают и упраздняют, и в итоге после обучения выходят программисты с огромнейшими пробелами в алгоритмической подготовке. почитайте например «И снова о программировании» Джоеля Спольски, он это обьясняет гораздо лучше меня. если нет проблем с английским — вот одна из глав по теме — www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html
    • 0
      мое мнение:
      pascal в школе изучать не стоит — он морально устарел, чутше что-нибуть Си-подобное, поскольку на базе него и его потомков сейчас большиноство сделано. а паскаль направливает не совсем в то русло.
      • 0
        Лично я изучал basic в школе, потом начал изучать php, и классе в 10-м посмотрел на c++.
        Я бы не советовал сразу начинать с сей — достаточно тяжело.
      • 0
        ИМХО Python для таких целей — самое оно! Современно, учит форматировать код, кроссплатформенно и достаточно быстро для их целей.
    • +4
      мы в школе на ЛОГО программировали, курсор-черпашка, «вперед 10 вправо 90» :)
      • 0
        О да, классная штука :)
        • 0
          В КДЕ есть аналог =)
  • +1
    Спасибо за обзор! Позабавился :)
  • +1
    Присоединяюсь к благодарностям!
    А кампании там нету?)))
  • +2
    Вот если бы еще сетевая была…
  • 0
    а есть что нибудь подобное для питона?
    • 0
      Врядли — питон молодой язык. но было бы очень интересно на подобное посмотреть!
      • 0
        сильно моложе java и .net?
        • 0
          Пожалуй даже старше дотНета, но он не Enterprise, не настолько распространён и не имеет такой большой любви у товарищей клепающих мегабольшущие программулины.
  • 0
    У нас в университете каждый год соревнования. Вот на прошлом я занял второе место %) А штука очень интересная, правда нет клуба любителей в России, а жаль.
    • 0
      Не плохо было бы организовать где-нибудь битву. А одному играть скучно.
      • НЛО прилетело и опубликовало эту надпись здесь
        • –2
          Описываем пакетный уровень Lineage II, ставим небольшой интерпретатор и играем =)
        • 0
          С написанием управляющего кода на любом языке ;-)
  • 0
    А что-нибудь подобного для изучения Actionscript нет?
  • +1
    Это прямо почти тоже самое что в финале ICM ICPC(тот самый чемпионат мира, в котором Россия в этом году победила). Там это называется Java Game Challange. Ухх, круто!

    Кстати, для четвертьфинала наши ребята из Саратова написали подобную систему, где можно было писать на Delphi, C, Java! И все это работало вместе! Просто супер!

    Потом прикольно сидеть в огромном зале, и смотреть как в кино — танчик твоей команды бьется с другими такими же :)
    Битвы в реальном времени на огромном экране!… накал страстей не хуже чем на футбольном матче :)
  • 0
    Пытались писать в универе что-то подобное, только ко всему этому у нас сцена сражения в 3D была. Проект загнулся.
  • 0
    Помнится когда то игрались с такими роботами на С (http://www.geocities.com/crobots32/index.html что то похожее на это), потом была какая то версия под Windows 3.11 с языком похожим на basic, для того времени сделана просто классно, там были не только роботы, пули и радары, но и мины и еще что то, к сожалению названия не помню, а всяческие просьбы админа из университета поискать в старых залежах результата не приносили.
  • +1
    Опа! Приятно удивлён теме. Вспомнилась история.
    В 2007м году выиграл университетский чемпионат по такой игрушке. За 1е место дали флешку на 500Мб. :) Самое смешное, что за второе дали мышку USB (ох как она мне нужна была в тот момент...), за третье коврик для мышки. :)

    а в Ирландии в университете Trinity за первое место дают ноут. Вот обидно-то было…

    А вообще игрушка очень хорошо помогает вспомнить школьную геометрию.
  • 0
    Вот оно
    en.wikipedia.org/wiki/Category:Programming_games
    А нету подобных штук в онлайне?
  • 0
    вспомнилась snake battle. в детстве заигрывались с приятелями )
  • 0
    > Интересно подошли к написанию робота в СПБгУ ИТМО. Танк был разработан с использованием SWITCH-технологий

    Еще стоит вспомнить, что первая версия этого танка была некоторое время чемпионом мира на регулярных соревнованиях.
    На этой странице, которую

    counterwallrobot
  • 0
    > Интересно подошли к написанию робота в СПБгУ ИТМО. Танк был разработан с использованием SWITCH-технологий

    Еще стоит вспомнить, что первая версия этого танка была некоторое время чемпионом мира на регулярных соревнованиях.
    На этой странице, которая пропала при переходе на новую вики, было написано, что появление этого танка заставило разработчиков сменить правила игры.
    robowiki.net/cgi-bin/robowiki?History

    Танк назывался counterwallrobot.Cynical. Его автор — я :-)
    Давно дело было…
    • 0
      >> Танк назывался counterwallrobot.Cynical. Его автор — я :-)

      Офигеть! Кого только не встретишь на хабре :)
  • 0
    Спасибо за статью.
    Пробовал подобное на Java и на C#.
    На Java это был CodeRuller — средневековая стратегия: нужно защищать свои замки и захватывать чужие.
    На C# был Terrarium — итернет стратегия: создаешь свои существа, программируешь интеллект и выпускаешь их выживать в инет :)
  • 0
    Картинки протухли.

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