Создание собственного робота

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

В качестве языка скриптов используется Angel Script. Синтаксис Angel Script практически идентичен синтаксису C/C++.

В качестве основы скрипта робота выступает функция Execute. Эта функция должна присутствовать в каждом скрипте. Именно эта функция вызывается из программы моделирования.

Прототип функции Execute:

void Execute(RobotState&, const Environment&);

 Далее будет подробно рассказано о параметрах функции.

 

Environment

Класс Environment содержит параметры окружающей среды, в которой происходит конкретная игра.

class Environment
{
public:
    int bases_count;

    int field_width;
    int field_height;
    int robot_hp;
    int base_hp;
    int shoot_range;

    int view_range;
    int transmit_range;
    int reload_time;
    int robot_construction_time;
    int msg_size;
    int memory_size;

    int iter;
    int last_iter;
    int timeout;

    int dist(int x1, int y1, int x2, int y2);
    bool shift(int x, int y, int dir, int &dx, int &dy);
    int get_dir(int x1, int y1, int x2, int y2);
};

Подробнее о членах класса:

Член класса Значение
bases_count Общее число баз на игровом поле
field_width Ширина игрового поля, в клетках
field_height Длина игрового поля, в клетках
robot_hp Максимальное количество хитпоинтов у роботов
base_hp Максимальное количество хитпоинтов у баз
shoot_range Максимальный радиус стрельбы у роботов
view_range Максимальный радиус видимости у роботов
transmit_range Максимальный радиус передачи сообщений у роботов
reload_time Время перезарядки оружия у роботов
robot_construction_time Время создания нового робота у баз
msg_size Максимальный размер сообщения у роботов, в байтах
memory_size Максимальный размер памяти у роботов, в байтах
iter Номер текущей итерации моделирования
last_iter Максимальное число итераций моделирования
timeout Максимальное время моделирования, в секундах


Значения членов класса Environment являются общими для всех роботов, задаются перед началом игры и не могут быть изменены в ее ходе.

Также класс Environment содержит следующие вспомогательные функции:

Функция
Значение
dist Вычислить расстояние между точками (x1, y1) и (x2, y2) на игровом поле
shift Получить координаты точки (dx, dy), полученной перемещением из точки (x, y) в направлении dir. Функция возвращает false, если движение в заданном направлении невозможно (выход за границы поля и т.п.)
get_dir Вычислить направление движения из точки (x1, y1) в точку (x2, y2)

 

RobotState

Класс RobotState определяет состояние конкретного робота.

class RobotState
{
public:

    int x, y;
    int team;
    int hitpoints;
    int cooldown;

    bool shoot;
    bool transmit;
    int move_direction;
    int shoot_x, shoot_y;

    uint get_msgs_num();

    uint get_robots_num();

    uint get_bases_num();
     

    Unit get_robot(uint ind);

    Unit get_base(uint ind);


    void set_mem_int(uint pos, int val);

    void set_msg_int(uint pos, int val);


    int get_mem_int(uint pos);

    int get_msg_int(uint pos);

    int get_msgs_int(uint ind, uint pos);


    void copy_to_msg(uint ind);

};

Первая группа членов класса описывает характеристики робота, которые являются константными на текущей итерации и не могут быть изменены самим роботом:

Член класса Значение
x, y Текущие координаты робота на игровом поле
team Номер команды робота
hitpoints Текущее количество хитпоинтов робота
cooldown Оставшееся время до готовности оружия робота

 

Вторая группа описывает действия, которые робот собирается совершить на текущей итерации. Задание значений этих членов класса и является результатом работы скрипта робота.

Член класса Значение
shoot Флаг стрельбы; равен true если робот собирается стрелять
transmit Флаг передачи сообщения; равен true если робот рассылает сообщение
move_direction Направление, в котором хочет переместиться робот (0 если робот не двигается)
shoot_x, shoot_y Координаты клетки поля, куда хочет выстрелить робот (при shoot равном true)

 

Функции класса RobotState для обнаружения других роботов и баз:

Функция
Значение
get_robots_num Получить количество других роботов в зоне видимости
get_bases_num Получить количество баз в зоне видимости
get_robot Получить информацию о роботе по индексу ind, 0 ≤ ind < get_robots_num()
get_base Получить информацию о базе по индексу ind, 0 ≤ ind < get_bases_num()

 

Unit – вспомогательный класс для предоставления информации о видимом объекте:

class Unit
{
public:
    int x, y;
    int team;
    int dist;
};

Значения членов класса Unit:

Член класса Значение
x, y Координаты объекта
team Номер команды объекта (если для базы team равно -1, то база нейтральная)
dist Расстояние до объекта

 

Функции класса RobotState для работы с памятью и сообщениями:

Функция
Значение
set_mem_int Записать значение val (типа int) в память на позицию pos
set_msg_int Записать значение val (типа int) в сообщение на позицию pos
get_mem_int Получить значение (типа int) из памяти с позиции pos
get_msg_int Получить значение (типа int) из сообщения с позиции pos
get_msgs_num Получить количество полученных входящих сообщений
get_msgs_int Получить значение (типа int) из входящего сообщения с индексом ind с позиции pos, 0 ≤ ind < get_msgs_num()
copy_to_msg Скопировать входящее сообщение с индексом ind в основное сообщение, 0 ≤ ind < get_msgs_num()

 

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

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

 

Вспомогательные функции

Для скриптов доступны следующие вспомогательные функции:

  • rand() – генерация случайного целого числа
  • print(const string& str) – вывод на экран строки str
  • print(int n) – вывод на экран числа n