Журнал удивительных идей


Совместный проект учителей и учеников 192 школы





Игра

Встречаются два математика.

Один другому:
- Назови число.

- Ну пусть будет пи в степени e.

- Ха! А у меня е в степени пи! У меня больше, я выиграл!

Robocode

Build the best - destroy the rest!

Игры для программистов! В Белом номере мы рассказывали о замечательной игре Snakebattle. В ней нужно создать интеллект змеи, которая потом участвует в боях с другими змеями уже без участия создателя. Сегодня мы продолжим разговор о таких играх.

Очень интересной и по сюжету и по графике является игра Robocode. Ей уже достаточно много лет, но она развивается до сих пор, проводятся соревнования. Игроки программируют танки, которые запускаются на поле сражения.

Робот-танк состоит из трех управляемых частей: собственно танк, командуя которым мы можем передвигать объект вперед-назад, а также поворачивать. Пушка на танке может поворачиваться вокруг собственной оси и, естественно, стрелять и радар -  «глаза» танка, он тоже поворачивается независимо.

Программируют танки на языке Java. Для этого на компьютере должен быть установлен Java SDK, а сама среда программирования (редактор программ) входит в дистрибутив. В принципе, можно программировать роботов в любой среде, например, в Eclipse.

Объектная ориентированность языка Java позволяет создать свой первый танк очень быстро. Для этого достаточно пронаследоваться от класса Robot:

package mytank;
import robocode.*;
public class Dummy extends Robot
{}

Спарринг-партнер готов!

Для того, чтобы научить робота чему-нибудь нужно перегрузить (переопределить) соответствующие функции класса Robot. Прежде всего, функцию run(), в которой прописывается основной алгоритм поведения. А также функции обратного вызова, которые вызываются системой при наступлении определенных событий. Например, функция

void onHitRobot (HitRobotEvent event)  

вызывается в тот момент, когда наш танк настигает бандитская пуля.

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

package mytank;
import robocode.*;
public class MyFirstRobot extends Robot
{
   public void run()
   {
       while (true)
       {
           ahead(100);
           turnGunRight(360);
           back(100);
           turnGunRight(360);          
       } 
   }
   public void onScannedRobot
                  (ScannedRobotEvent e)
   {
       fire(1);
   }
}

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

public void onScannedRobot (ScannedRobotEvent e)

и робот выстрелит.

Несмотря на то, что на поле все происходит все в реальном времени, игра происходит строго по шагам. В каждый момент  времени (tick) каждому танку дается возможность выполнить часть своих действий. Эта часть строго ограничена. Например, у танка есть скорость. Ее можно увеличивать, но постепенно и только до 8 pixels/tick, у нас все-таки робот-танк, а не робот-истребитель! Расстояние, которое преодолевает танк за tick зависит от скорости.

Поэтому, если бы мы написали

while (true) 
{
    ahead(100000);
    turnGunRight(360);
…

То выигрыша в скорости не получили бы. Наоборот, он бы стал намного хуже!. В этом случае нашему роботу понадобилось бы в 100 раз больше тиков, чтобы закончить выполнение первой команды цикла и он бы поворачивал пушку в сто раз реже.

Другое подобное ограничение – поворот. За тик танк может повернуться на (10 - 0.75 * скорость) градусов. То есть, чем быстрее двигается танк, тем медленнее он поворачивается.

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

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

Основной сайт игры: http://robocode.sourceforge.net/

М
а
т
е
м
а
т
и
к
а
Ф
и
з
и
к
а
Х
и
м
и
я
Б
и
о
л
о
г
и
я
И
н
ф
о
р
м
а
т
и
к
а