Я продолжаю серию статей про игры для программистов. Напомню, в прошлый раз мы узнали про игры Colobot и Ceebot.
Сегодня я расскажу Вам про отличную игру Robocode. Она предназначена для обучения языку Java, и имеет большие функциональные возможности, несмотря на кажущуюся внешнюю простоту.
Robocode — это обучающая игра с открытыми исходными кодами, разработанная Mathew Nelson и Flemming Larsen. Ее целью было облегчение изучения языка программирования Java.
Игра
Основным движущим элементом в обучении должна была стать конкуренция. Каждый участник пишет код на Java, который управляет небольшим танчиком, и сражается с другими такими же танками.
Ваша цель — уничтожить все остальные танки на поле. Без компромиссов. Ваш танк должен достичь абсолютного превосходства, и показать какие жалкие неудачники Ваши друзья.
Разработчики настоятельно обращают Ваше внимание на то, что в Robocode нет крови, нет людей и нет политики. В игре есть взрывы, но если Вы заботитесь о собственном психическом здоровье — их можно легко отключить.
У танков большие возможности: они могут двигаться по игровому полю, стрелять, узнавать месторасположение друг в друга, врезаться в стены и в других роботов, узнавать где находятся летящие пули и использовать всю мощь языка Java.

Естественно, какой-либо простой стратегии для выигрыша нет. Существует огромное количество различных тактик, у каждой из которых есть свои преимущества и недостатки. Размер кода у различных танков колеблется от десятка строк до нескольких тысяч. Некоторые даже умудряются прибегать к статистическому анализу и нейронному программированию.
Интересно подошли к написанию робота в СПБгУ ИТМО. Танк был разработан с использованием SWITCH-технологий(смесь автоматного и объектно-ориентированного программирования) и к проекту прилагается серьезная проектная документация.
Вы можете скачать ее и исходные коды танка абсолютно бесплатно на странице проекта.
Установка игры
На официальном сайте проекта находится огромное количество различных материалов. Если Вы хотите начать обучение — это лучшее место для старта.

Сама игра распространяется в виде jar-архива, который можно скачать со страницы скачивания игры.
Игра кроссплатформенная, так как она написана на Java. В нее можно играть на Windows, Linux, FreeBSD и в любой другой системе, на которую портирована Java-машина.
Перед установкой игры не забудьте установить Java.
Ваш первый робот
Готовы к созданию своего первого робота? Я уверен это будет легко, занимательно и просто интересно!
Создать робота очень просто. Но сделать его победителем — нет.

Встроенный редактор
Разработчики включили в игру собственный редактор. Поэтому у Вас уже есть готовая среда для разработки с подсветкой синтаксиса.
Эта программа называется Robot Editor, и она доступна в меню Robot -> 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!
RSS
Есть мысли на этот счет:
Чертовски интересно! Большое спасибо, что поведали об этой игре на Хабре — там к сожалению не смог Вас отблагодарить ни словами, ни кармой, так как нету аккаунта.
Рад был помочь. Свяжитесь со мной — возможно, я помогу Вам с аккаунтом.
Да, вещь очень увлекательная! Похожая развлекуха проходит каждый год в один из дней во время международной олимпиады по программированию среди студентов :)
admin, а приходилось с terarrium .net 2.0 работать?)
Я знаю эту игру. Я, скорей всего, напишу статью и про terarrium .net 2.0.
Кстати тоже на хабре прочитал.
Жаль в моё студенчество я не зал то, такие игры существуют(
Великолепно! Если не сложно, сделайте описывание этих игр своим основным занятием. И ждем-с статью про Terrarium .net. Огромное спасибо!
Я пишу только о том, что мне интересно. Поэтому никакое конкретное направление я не собираюсь делать основным. Однако в какой-либо определенный момент времени я могу с удовольствием эксплуатировать конкретную тему.
Натолкнулся на вашу статью на хабре. С учетом того, что нету там аккаунта, то благодарю вас за статью здесь + тут отображаются все скриншоты.
Игра очень интересная. Я как раз изучаю Java сейчас, думаю будет полезной.
Хотелось бы узнать, есть ли еще подобные игры, которые могут помочь в изучении Java, C++?
Заранее спасибо.