Четыре танкиста и компьютер (еще раз об игре Robocode)



Откорректированная версия статьи:
Озеров А.А. Четыре танкиста и компьютер // Магия ПК. - 2002. - № 11. - С. (www.magicpc.spb.ru)


канд. физ.-мат. наук Озеров А.А. (aozerov@mail.ru)

Четыре танкиста и компьютер

Отсюда можно скачать полный текст статьи в формате pdf (250Kb)

Война закончена лишь тогда,
когда похоронен последний солдат.
Александр Суворов

"Первый - товсь! Пли!". Такими примерно возгласами заканчивается рабочий день в нашей компании, занимающейся разработкой программного обеспечения. Тогда как все нормальные люди расходятся после напряженного трудового дня по своим домам, а программисты других компаний выясняют отношения при помощи "Age of Empires" или Quake-подобных "стрелялок", большая часть программистов нашего отдела оттачивают свое мастерство в тактике и стратегии ведения танкового боя.

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

Пожалуй, многие из программистов слышали о нескончаемых игровых баталиях "Corewars", имевших место еще на заре развития компьютерных технологий. Тогда на подобном ассемблеру языке "Redcode" программисты писали маленькие программы, которые боролись друг с другом в области компьютерной памяти (core) некоторого абстрактного компьютера. На первый взгляд, игровой процесс был похож на написание элементарного вируса, целью которого было завоевание всего игрового пространства. Несмотря на незатейливость сюжета, именно эта идеология была положена в основу целого игрового направления, известного до сих пор как "Бои роботов".

История "боев" насчитывает множество реализаций и видов используемого программного обеспечения: от простых программ командной строки до полнофункциональных программных комплексов, графически представляющих арену битвы. Одним из последних и ярких примеров такой программы служит проект "Robot Battle", позволяющий программно создавать своих собственных танков-ботов (слово "бот" является сокращением слова "робот") с использованием языка высокого уровня, подобного Visual Basic. Мастерство программиста заключалось в написании собственного интеллектуального "движка" такого бота, обеспечивающего тактическое и стратегическое превосходство над другими танками своих коллег.

Так или иначе, все аналогичные проекты данного направления были ориентированы на игровой процесс и скорее представляли собой некое подобие логических игр без какого-то полезного применения. Впервые ситуация изменилась с выходом в 2001 г. программы-игры Robocode, написанной с использованием технологий Java ведущими программистами компании IBM. Необычность этой программы заключалось в том, что основной целью служит не само участие в игре, где также необходимо управлять своим танком-ботом, а процесс самообучения и изучения самого языка программирования Java.

Немного истории

Отцом-создателем игры Robocode стал один из сотрудников компании IBM Мэтью Нельсон (Mathew Nelson). Являясь ярым поклонником таких игр, как "Warcraft", "Sim City" и "Diablo", Метью не смог устоять перед созданием своего собственного игрового "шедевра". Проект Robocode был начат в середине 2000 г. и по замыслу его создателя должен быть стать развитием игры Robot Battle, адаптированным под язык Java. По мере развития проекта и написания кода для своих первых танков, автору пришла в голову гениальная мысль - совместить игровой процесс с обучением. Дело в том, что язык программирования Java, на котором, собственно, и написана программа, является универсальной объектно-ориентированной технологией, предоставляющей программистам неограниченные возможности по созданию программ любой сложности - от небольших графических утилит до крупных проектов. Использование этого языка для моделирования поведения собственных объектов-роботов, по мнению автора, может в значительной степени повысить интерес, как к самой технологии, так и к процессу ее обучения.

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

Мой первый танк

Итак, что же представляет собой игра Robocode? Во-первых, это графическая оболочка, состоящая из интерфейса среды исполнения и специального редактора (Robot Editor), с помощью которого участники игры могут создать и откомпилировать код управления для своей боевой машины. Во-вторых, это виртуальная машина Java, которая выступает в качестве основного движка игры и отвечает за весь игровой процесс. И, в-третьих, это Java-классы, на основе которых программируются танки и сама игровая среда.

Архитектура танка довольно проста. Танк представляет собой боевую единицу, состоящую из ходовой части, пушки и радара.

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


package test;
import robocode.*;

/**
 * My first robot
 */
public class MyFirstRobot extends Robot
{
  public void run() { while(true) { ahead(); }}
  public void onScannedRobot(ScannedRobotEvent e) { fire(1); }
} 

В этой программе класс MyFirstRobot унаследован от базового класса Robot, который предлагает простейший командный интерфейс боевой машины. В частности, могут быть использованы следующие методы:

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

Во время боя каждому танку выделяется отдельный поток виртуальной Java-машины. В пределах данного потока танк может реагировать на различные внешние события, реакцию на которые программисты могут реализовать в соответствующих методах (таблица).

Таблица. Методы и соответствующие им события
Метод класса Событие Описание
onScannedRobot() ScannedRobotEvent Событие поступает при пеленге противника радаром. В теле этого метода обычно реализуется алгоритм обстрела области, в которой был обнаружен противник
onHitByBullet() HitByBulletEvent Событие поступает при попадании снаряда в ваш танк. Здесь программисты должны предусмотреть алгоритм маневрирования танком.
onHitRobot() HitRobotEvent Событие поступает при столкновении с другим танком.
onHitWall() HitWallEvent Событие поступает при столкновении со стеной.

В приведенном выше листинге в методе onScannedRobot(ScannedRobotEvent e) предлагается по умолчанию открыть огонь по противнику при помощи метода fire(). Мощность выстрела контролируется параметром метода.

Так или иначе, набор методов, позволяющих управлять поведением боевой машины, достаточно обширен. Остается лишь правильно выбрать алгоритмы для реализации тактики сражения. Победа присваивается по результатам сражений в 10 раундах. В каждом раунде вы можете выставить в качестве противника любого из 20 танков, входящих в стандартную поставку программы или попробовать свои силы в битве против танка вашего коллеги. Из боевых машин, которые доступны в качестве ваших противников, можно отметить нескольких. Например, тактика танка "Corner" заключается в том, чтобы как можно быстрее занять позицию в углу поля битвы и вести прицельный огонь по машинам-соперникам. Танк под названием "Wall" передвигается по периметру поля и довольно эффективно ведет обстрел всего пространства. Уйти от огневой атаки такого монстра довольно трудно. Если же вы сомневаетесь при выборе стратегий и поведения вашей боевой машины, вы всегда можете посмотреть на код реализации всех танков, которые входят в поставку программы. Код и описания для каждого танка доступны для свободного просмотра и редактирования.

Лига Robocode - лучшие из лучших

После выхода игры за несколько дней с сайта IBM было скачено более 1000000 копий. В последующие несколько месяцев игра настолько стала популярной среди программистов всего мира, что ее разработчики решили устроить групповой турнир под названием RoboLeague (http://apps.alphaworks.ibm.com/rumble/), где каждый программист вместе со своим танком мог попробовать свои силы и даже выиграть приз - ноутбук IBM ThinkpadR. По результатом последних боев победа досталась танку под названием "SandboxLump", представленного Эвансом Паулом (Evans Paul). Танк просто растерзал всех своих соперников, ни оставив, ни малейшего шанса на выживание.

Русские начинают и выигрывают

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

Однако наибольший интерес вызвала российская реализация танка с использованием SWITCH-технологии - парадигмы программирования, основанной на применении конечных автоматов. Эта реализация была предложена сотрудниками Санкт-Петербургского государственного института точной механики и оптики Н.И. Туккелем и А.А. Шалыто. Российские ученые на основе теории конечных автоматов создали модель танка, который запросто обыгрывает многих участников лиги роботов. Точная математическая модель и использование современных методик программирования, позволили российскому танку занять достойное место в лиге Robocode. Этот танк обладает тремя особенностями, делающими его уникальным среди остальных:

Заключение

Если вы заинтересовались этой увлекательной игрой и хотите попробовать свои силы в программировании танка или начинаете осваивать язык Java, то сделать первый шаг в этом направлении вам поможет сайт разработчиков Robocode (http://robocode.alphaworks.ibm.com), где вы бесплатно получите копию игры, а также полезные советы и рекомендации. Удачи вам, господа танкисты!

Полезные ссылки