Игры для программистов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!


Есть мысли на этот счет:
Виталий 17.05.2009 13:49 пишет:

Чертовски интересно! Большое спасибо, что поведали об этой игре на Хабре — там к сожалению не смог Вас отблагодарить ни словами, ни кармой, так как нету аккаунта.

    v673 17.05.2009 16:29 пишет:

    Рад был помочь. Свяжитесь со мной — возможно, я помогу Вам с аккаунтом.

Михаил 17.05.2009 15:46 пишет:

Да, вещь очень увлекательная! Похожая развлекуха проходит каждый год в один из дней во время международной олимпиады по программированию среди студентов :)

Не Админ 17.05.2009 22:41 пишет:

admin, а приходилось с terarrium .net 2.0 работать?)

    v673 18.05.2009 09:24 пишет:

    Я знаю эту игру. Я, скорей всего, напишу статью и про terarrium .net 2.0.

Не Админ 17.05.2009 22:41 пишет:

Кстати тоже на хабре прочитал.

Жаль в моё студенчество я не зал то, такие игры существуют(

Дмитрий. 18.05.2009 11:13 пишет:

Великолепно! Если не сложно, сделайте описывание этих игр своим основным занятием. И ждем-с статью про Terrarium .net. Огромное спасибо!

    v673 18.05.2009 17:03 пишет:

    Я пишу только о том, что мне интересно. Поэтому никакое конкретное направление я не собираюсь делать основным. Однако в какой-либо определенный момент времени я могу с удовольствием эксплуатировать конкретную тему.

Dragon 01.07.2010 10:32 пишет:

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

Игра очень интересная. Я как раз изучаю Java сейчас, думаю будет полезной.

Хотелось бы узнать, есть ли еще подобные игры, которые могут помочь в изучении Java, C++?

Заранее спасибо.

Есть что сказать?
Ваше имя:
Ваш e-mail:
Ваш сайт:
Ваше мнение:




земляные работы в Донецке