Robocode. Обзор API

Robocode. Обзор API Эта статья для тех, кто заинтересовался игрой Robocode, о которой мы говорили в КГ №24'2002, и хотел бы разобраться, как создавать своих собственных роботов. Мы рассмотрим свойства и методы класса Robot, а также некоторых других классов, расширяющих возможности по программированию поведения роботов.

Программирование своего робота весьма сложный и увлекательный процесс. От вас требуется не столько высококлассное знание языка программирования, сколько продумать стратегию поведения вашего робота.
Процесс создания робота можно разделить на два этапа.
Первый — это определить основные действия робота в пассивном режиме.
Второе — это программирование обработчиков событий, будь то обнаружение другого робота или событие при ранении. Мы не будем рассматривать полностью весь процесс реализации тактики вашего робота. Это будет не совсем правильно. Если вы хотите всерьез заняться этой игрой, вы должны сделать это сами.
Рассмотрим шаблон, который предлагает нам редактор по умолчанию, если имя робота — "Просто_робот", а пакет — "litvinuke":

package litvinuke;
import robocode.*;
//import java.awt.Color;

/**
* Просто_робот — a robot by (your name here)
*/
public class Просто_робот extends Robot
{
/**
* run: Просто_робот's default behavior
*/
public void run() {
// After trying out your robot, try uncommenting the import at the top,
// and the next line:
//setColors(Color.red,Color.blue,Color.green);
while(true) {
// Replace the next 4 lines with any behavior you would like
ahead(100);
turnGunRight(360);
back(100);
turnGunRight(360);
}
}

/**
* onScannedRobot: What to do when you see another robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
fire(1);
}

/**
* onHitByBullet: What to do when you're hit by a bullet
*/
public void onHitByBullet(HitByBulletEvent e) {
turnLeft(90 — e.getBearing());
}

}

Как мы видим, код нашего класса Просто_робот первоначально состоит из трех методов. Это run(), onScannedRobot() и onHitByBullet(). Метод run() определяет то самое стандартное поведение нашего робота. Этот метод выполняется все время, пока не наступает какое-либо определенное событие. Событием может быть столкновение со стеной, смерть или победа робота, обнаружение противника, ранение, попадание в противника, попадание в снаряд противника. Методы событий описывают реакцию робота на событие, т.е. те действия, которые он будет выполнять при возникновении того или иного события.
Заметьте, что события в Robocode представлены в виде обычных методов, а не исключений (exceptions). Хотя на мой взгляд, было бы правильнее как раз второе. Но это мое мнение.
Вернемся к этапу, который мы определили как первоначальный при создании нашего робота. Это программирование стандартного поведения.
Если оставить метод run() пустым, то наш робот будет просто стоять на своем месте на поле и ждать каких-либо действий со стороны своих соперников. Думаю, вы согласитесь, что такая тактика более чем не уместна. Потому нужно с особым вниманием отнестись к реализации метода run().
Для этого нужно продумать определенную тактику поведения. Можно просто ездить взад-вперед, можно кружить по кругу, и, что главное, никто не запрещает делать и то и другое одновременно. Чтобы воплотить вашу идею в жизнь, вам помогут широкий набор методов API Robocode и язык Java. Кстати, по умолчанию редактор нам предлагает вариант езды на 100 пикселей вперед и назад, при этом поворачивая пушку вокруг своей оси для поиска противника. Давайте рассмотрим некоторые из многочисленных методов класса Robot для управления вашим роботом. Это всего лишь ничтожная часть того, что можно предусмотреть и выполнить при помощи Robocode API. За дополнительной информацией обращайтесь к Help -> Robocode API.

void ahead(double distance)
этот метод дает команду вашему роботу двигаться вперед на заданную дистанцию.

void back(double distance)
то же самое, только движение назад.

void fire(double power)
робот выстреливает снаряд с заданной мощностью. Вы должны знать, что от мощности зависит и количество энергии, теряемое при выстреле снаряда. Так что, чем меньше и точнее вы будете стрелять, тем больше у вас шансов на победу.

double getEnergy()
возвращает количество энергии вашего робота на данный момент.

int getOthers()
возвращает количество оставшихся на поле боя роботов.

long getTime()
возвращает время, пройденное от старта текущего раунда. В каждом раунде счетчик сбрасывается на 0.

void scan()
ищет первого попавшегося в поле обзора робота и нацеливает пушку на него. Сканирование заключается в повороте радара и пушки вокруг своей оси до тех пор, пока не будет обнаружен робот.

void turnGunLeft(double degrees)
void turnGunRight(double degrees)
повернуть ствол пушки на degrees градусов влево и вправо соответственно.

void turnLeft(double degrees)
void turnRight(double degrees)
повернуть робот влево или вправо на degrees градусов.

Это что касается некоторых операций по управлению роботом. Помимо метода run(), как мы уже отмечали, в теле нашего класса можно перегружать методы, отвечающие за определенные события. Таких методов несколько. Практически каждому из таких методов передается, в качестве параметра, экземпляр объекта класса события, из которого можно получить дополнительную информацию. Давайте разберем эти методы.
public void onBulletHit(BulletHitEvent event)
этот метод вызывается, когда ваш робот ранил кого-нибудь на поле. В качестве информации методу передается экземпляр объекта BulletHitEvent. Он содержит информацию о роботе, которого вы ранили, его параметры на данный момент. Если вы хотите обрабатывать данное событие, то вам нужно просто перегрузить данный метод в классе вашего робота. Например:

public void onBulletHit(BulletHitEvent event)
{
// выполняем некоторые действия
// ...
}

public void onBulletHitBullet(BulletHitBullet event)
вызывается при попадании вашим роботом в снаряд другого робота. При помощи event вы можете восстановить информацию о снаряде и его хозяине.

public void onBulletMissed(BulletMissedEvent event)
вызывается при попадании вашего снаряда в стенку, иными словами — когда вы ни в кого не попали.

public void onDeath(DeathEvent event)
вызывается при вашем поражении, т.е. когда вас просто убили.

public void onHitByBullet(HitByBulletEvent event)
вызывается при ранении вас чьим-либо снарядом.

public void onHitRobot(HitRobotEvent event)
вызывается при физическом столкновении с одним из роботов.

public void onHitWall(HitWallEvent event)
вызывается при столкновении робота со стенкой, иначе говоря, с границей поля боя.

public void onRobotDeath(RobotDeathEvent event)
вызывается, когда один из роботов на поле боя уничтожен.

public void onScannedRobot(Scan-nedRobotEvent event)
это одно из самых важных событий. Метод вызывается при обнаружении вашим радаром соперника. Т.е. тогда, когда вы случайно наткнулись на одного из роботов.

public void onWin(WinEvent event)
вы добились вашей цели и остались на поле победителем. Осталось немного времени, чтобы исполнить прощальный финт победителя ;).

Вот все, что касается событий в игре.
Для более подробной информации о классах событий, передаваемых методам, обращайтесь к документации.
В классе Robot существует очень интересное дополнение в лице заранее определенного объекта класса PrintStream out. При помощи ссылки out вы можете выводить отладочную и просто информацию о процессе игры на экран. Например:

public void onBulletHit(BulletHitEvent event)
{
out.println("Я попал в " + event.getName + "!");
}

Да, и не забывайте о проведении соревнований на сайте http://apps.alphaworks.ibm.com/ rumble/. Победители получают весьма ценные призы. Спешите участвовать — срок регистрации истекает.

Алексей Литвинюк


Компьютерная газета. Статья была опубликована в номере 26 за 2002 год в рубрике программирование :: java

©1997-2024 Компьютерная газета