Программирование интеллекта робота происходит в виде написания скрипта. Скрипт робота вызывается на каждой итерации моделирования для каждого робота и отвечает за поведение робота. Все роботы из одной команды имеют одинаковый интеллект (т.е. используют один и тот же скрипт).
В качестве языка скриптов используется Angel Script. Синтаксис Angel Script практически идентичен синтаксису C/C++.
В качестве основы скрипта робота выступает функция Execute. Эта функция должна присутствовать в каждом скрипте. Именно эта функция вызывается из программы моделирования.
Прототип функции Execute:
void Execute(RobotState&, const 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 определяет состояние конкретного робота.
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() |
Все входящие сообщения получаются роботом непосредственно перед началом итерации (т.е. запуском его скрипта). Если робот хочет отправить сообщение, то он должен выставить флаг передачи сообщения (при этом записав в сообщение нужные данные). На следующей итерации его сообщение будет разослано всем дружественным роботам в зоне передачи сообщения.
Память робота сохраняется на всем протяжении его жизни и может использоваться для хранения различной информации.
Для скриптов доступны следующие вспомогательные функции: