Арена роботов

1. Как воюют роботы на Арене
   1.1 Концепция игры
   1.2 Поле боя
   1.3 Оборудование робота
   1.4 Движение робота
   1.5 Энергия
   1.6 Использование пушек
   1.7 Использование глаз
2. Описание программного обеспечения
   2.1 Редактор роботов (REditor.exe)
    2.2 Редактор списков роботов (RChanger.exe)
   2.3 Графический движок (Engine.exe)
3. Разработка роботов
   3.1 Описание языка
   3.2 Структура программы
   3.3 Процедуры арены роботов
   3.4 Примечания
   3.5 Пример программы-робота
4. Перспективы



   1. Как воюют роботы на Арене

   1.1 Концепция игры


   Принцип проекта "Арена роботов" прост - игроку нужно написать робота
в виде специальной программы в специальном редакторе роботов. Эта
программа в виде динамической библиотеки подключается к графическому
движку.
   Робот должен уметь перемещаться по полю игры, обходя стены и ямы,
собирать патроны, заряжаться от электростанций и отстреливать вражеских
роботов, управляемых подобными же программами.

   1.2 Поле боя

   Бои роботов ведутся на поле DX х DY. Размер поля Вы выбираете самостоятельно.
Общая рекомендуемая формула такова: S=100*N (где S - площадь поля,
N – количество роботов), или, если поле квадратное, то DX=DY=10*sqrt(N).
Вокруг поля возведена высокая прочная стена. По полю случайным образом
разбросаны прочные стены и камни, через которые робот не может проехать,
но может разбить с 10-и попаданий. Также на поле располагаются еще несколько
типов объектов.
   Каждая клетка поля может быть либо пустой, либо занятой объектом одного из
следующих типов: стена, камень, яма, ящик со снарядами, реактор, робот.
   В начале игры каждый робот помещается в произвольное
место карты. Соседними клетками для робота на игровом поле считаются
четыре клетки – спереди, сзади, слева и справа от робота. Робот, упавший в яму,
считается погибшим и заканчивает игру. Ящики со снарядами можно подбирать -
это прибавляет роботу от 5 до 10 снарядов с каждого ящика. Ящики случайным
образом выкидываются на поле боя с частотой, установленной пользователем
(по умолчанию – один раз за 20 тактов).

   1.3 Оборудование робота

   Каждый робот имеет четыре радара (спереди, сзади, слева и справа) и одну
пушку (спереди). При старте у робота уже имеется 6 снарядов. Максимальное
количество снарядов не оговаривается.

   1.4 Движение робота

   Робот может двигаться вперед или осуществлять поворот на 90 градусов
вправо или влево. Одно активное действие (движение, поворот, использование
радара) занимает 1 такт боевого времени.
   Остальные действия происходят «мгновенно», т.е. за 1 такт Можно выполнить
несколько таких команд.

   1.5 Энергия

   В начале игры каждый робот обладает 15 единицами энергии, максимальная
величина - 30 единиц. При попадании снаряда робот теряет 1 единицу энергии.
Если значение энергии достигнет нуля - робот погибает. Зарядка робота
осуществляется следующим образом: робот встает в одну из соседних клеток
ядерного реактора и совершает шаг в сторону реактора. Энергия будет расти со
скоростью 1 единица за 1 шаг.
   За каждые 10 выстрелов из оружия максимальная величина энергии робота
увеличивается на 1 единицу: в качестве награды за боевой опыт.

   1.6 Использование пушек

   Выстрел осуществляется одним снарядом в сторону, где у робота расположена
пушка (спереди). Максимальное расстояние выстрела определяется порогом
дальности действия каждого робота (по умолчанию - 5 клеток). Запас снарядов
пополняется подбиранием ящиков со снарядами. Причем каждый робот может
иметь до 50 снарядов.
   Если снаряд попадает в ящик со снарядами или в реактор, то происходит
взрыв и на месте этих объектов образуется яма. Если снаряд попадает в робота,
то у него отнимается 1 единица энергии.
   Яма не является препятствием для снаряда.

   1.7 Использование глаз

   Глаза (радары) даны роботу для того, чтобы видеть. Каждый глаз предоставляет
роботу следующую информацию:
     а) тип объекта в направлении взгляда,
     б) расстояние до объекта в клетках (соседняя клетка - 1),
     в) расстояние до ямы (если её нет на пути – то 0).
   Восприятие каждого робота ограничено границей дальности действия.
   Яма не является препятствием для радара.


   2. Описание программного обеспечения

   2.1 Редактор роботов (REditor.exe)


   Используется для написания алгоритма поведения робота и задания некоторых
атрибутов.
   С помощью Редактора роботов задаются:
   - алгоритм поведения робота;
   - имя робота;
   - изображение робота.
   После компиляции создаются 2 файла: динамическая библиотека (.dll) и
информационный файл робота (.rim). Они подключаются к редактору списков.

   2.2 Редактор списков роботов (RChanger.exe)

   Используется для создания и редактирования списков роботов, которые затем
подключаются к графическому движку.
   С помощью Редактора списков задаются:
   - роботы, учавствующие в бою, путь к их файлам;
   - разделение роботов на команды;
   - изменения начальных характеристик каждого робота.
   Списки сохраняются в файлы с расширением ".rls". Они подключаются к движку.

   2.3 Графический движок (REngine.exe)

   Основа проекта. Позволяет проводить бои роботов, написанных разными
пользователями.
   Для проведения боя надо зарание составить список роботов, принимающих
участие в бою, с помощью программы "Редактор списков" (RChanger.exe).
Затем в REngine.exe для загрузки списка нажать «Меню\Управление\Создать карту».
Вы увидите созданную случайным образом карту. Затем «Меню\Управление\
Разместить роботов» и на карте случайным образом будут размещены роботы из
выбранного списка. Для запуска процесса боя нужно нажать «Меню\Управление\
Запустить роботов».    При однократном нажатии на главное окно появится окно
настроек. В этом окне представлена статистика боя. Кроме этого здесь расположены
настройки создания новой карты (DX x DY, % боеприпасов, аккумуляторов, стен и
камней) и параметры боя (скорость движения и частота появления боеприпасов в
случайном месте).


   3. Разработка роботов

   3.1 Описание языка роботов

   Проект каждого робота состоит из имени робота, рисунка робота и алгоритма
поведения робота. Имя можно задавать любое, лучше до 16 символов. Желательно
уникальное. Рисунок робота – это .bmp или .jpg файл размером 20х20 точек, любой
глубины цвета. Этим рисунком Ваш робот будет обозначен на игровом поле.
   Для написания алгоритма поведения робота используется язык Pascal. Код,
написанный пользователем автоматически компилируется с помощью компилятора
Delphi 6.0 (dcc.exe ver.14.0) в динамическую библиотеку (.dll). Эта библиотека
содержит ссылки на основные процедуры Арены Роботов и алгоритм, написанный
пользователем. Затем библиотеки с роботами подключаются к основной программе
– графическому движку.

   3.2 Структура алгоритма

   Структура описания алгоритма соответствует структуре программы на языке
Pascal, за исключением секции заголовка программы и секции подключения
внешних модулей. Кроме стандартных инструментов языка, есть ряд дополнительный
процедур, которые и описывают поведение робота на поле боя. Они разделяются
на те, выполнение которых занимает боевое время, и те, которые выполняются
мгновенно.

   3.3 Процедуры арены роботов

procedure Fire;
Выстрел вперед. Тратятся 1 снаряд и один такт времени.

procedure Move;
Шаг вперед. Один такт боевого времени.

procedure RotLeft;
Поворот налево на 90 градусов. Один такт времени.

procedure RotRight;
Поворот направо на 90 градусов. Один такт времени.

procedure Say(mess: PChar);
Послать сообщение: вывести сообщение "mess" в окно Лога. Мгновенно.

function SeeFront(var Dlina: integer; var HoleDlina: integer; var Enrg: integer): integer;
function SeeRight(var Dlina: integer; var HoleDlina: integer; var Enrg: integer): integer;
function SeeLeft(var Dlina: integer; var HoleDlina: integer; var Enrg: integer): integer;
function SeeBack(var Dlina: integer; var HoleDlina: integer; var Enrg: integer): integer;

Смотреть перед собой. Возвращает тип объекта.
const Wall      =0; // Стена
const Hole      =1; // Яма
const Pol        =2; // Пустота
const Accum   =3; // Реактор
const Ammo    =4; // Боеприпасы
const Stone    =5; // Камень
const Robot    =11; // вражеский робот
const Friend    =12; // дружественный робот (из той же команды)
Все эти константы уже определены в редакторе.
Dlina – расстояние до этого объекта.
HoleDlina – Расстояние до ямы (0 – нету ямы; 1 – на соседней клетке, и т.д.)
Enrg – количество энергии робота (если видит робота) или прочность камня
(от 10 до 1 – если видит камень).
Занимает один такт времени.

procedure GetObjXY(Obj: integer; var dx: integer; var dy: integer);
Возвращает в переметрах dx и dy близжайшее расстояние от робота до объекта
типа Obj. Внимание: использование этой процедуры отнимает одну единицу энергии.
Занимает один такт времени.

function GetAngle: integer;
Возвращает текущий угол поворота. Мгновенно.

function GetAmmo: integer;

Возвращает текущее количество боеприпасов. Мгновенно.

function GetEnergy: integer;
Возвращает текущее значение энергии. Мгновенно.

function GetMaxEnergy: integer;
Возвращает текущее предельное значение энергии. Мгновенно.

function ID: integer;
Возвращает текущий порядковый номер робота. Мгновенно.

procedure KillMe;
Досрочно закончить бой. Мгновенно.

   3.4 Примечания


   Следует помнить, что программа робота должна выполняться "вечно",
т.е. до убийства робота либо до окончания игры. Следовательно каркасом
программы для Арены Роботов должен быть "вечный" цикл:

label Start;
var

 ...
 ...
begin
Start:


 ... // некоторый код

goto Start;
end.


    В алгоритме робота можно использовать строковые переменные, но они
должны иметь тип «Pchar». Либо описывать переменные как «String», но
использовать следующую конструкцию:

var

 R: integer;
 Str: String;
begin

...
 Str:= IntToStr(R);
 Say(PChar(Str));

...
end.

   3.5 Пример программы-робота

//Этот алгоритм вы найдете в файле проекта “Primer.rap”
procedure RandRot;
begin //подпрограмма поворота влево или вправо  
 case random(2) of  
  0: RotLeft;
  1: RotRight;  
 end;
end;

procedure RndMovRot(HoleRpr: integer);

begin //подпрограмма случайного выбора: повернуть или пойти вперед  
 if holeRpr=1 then //если перед ямой, то только повернуть.
  RandRot
 else  
  case random(10) of  0..6: Move;  7..9: RandRot; end;
end;

procedure EnUpToMax;

begin //заряжаться энергией до посинения  
 while (GetEnergy<getMaxEnergy) do Move;  
 Fire;
//когда больше не нужен, реактор можно взорвать  
 RandRot;
end;

label 0,fin;
// описание меток
var //описание переменных, используемых в программе  
 R: integer;  
 Obj: integer;
 i: integer;  
 Str: PChar;  
 HoleR: integer;  
 Enrg: integer;
//начало основной программы

begin
0:
  Obj:=SeeFront(R,HoleR,Enrg);
//глядим, что там впереди
 Str:=PChar(IntToStr(R));
 Say(Str);
//сообщим всем: что увидели – бесполезно, лишь для демонстрации
 case (Obj) of
  Stena: begin
//если перед нами стена, повернемся
   if R<2 then RandRot else RndMovRot(HoleR); //если далеко,
   //то можно еще шаг сделать, если ямы нету  
   goto 0;  
 end;  
 Accum: begin
 //если аккумулятор и нет ямы, идем заряжаться.
  if HoleR>0 then begin RndMovRot(HoleR); goto 0; end;
  EnUpToMax;  
  goto 0;
 end;
 Ammo: begin
 //если боеприпасы и яма не мешает, идем прямо к ним.
  if HoleR>0 then begin RndMovRot(HoleR); goto 0; end;
  for i:=0 to R-1 do Move;
  goto 0;
 end;

 //если видим камень, то стреляем,
 //пока не уничтожим его, если больше 10 снарядов  
 Stone: if GetAmmo>10 then Fire else RandRot;
 //если другой робот, то стреляем до истощения боеприпасов
 Robot: if GetAmmo>0 then Fire else RandRot;

 //если мы совсем ничего спереди не видим, то
 //или пойдем вперед или повернемся.
else RndMovRot(HoleR);

end;

fin:

goto 0;

end.



   4. Перспективы


   Есть ряд задумок, на реализацию которых нужно время и интересно
узнать у пользователей, пригодятся ли они:
   - Оставить у каждого робота 4 радара и 1 пушку спереди или предложить
пользователю выбор: а каждой из 4-х сторон может быть либо пушка, либо радар?
   - Нужны ли клетки воды? Какую функцию они могут выполнять, кроме того,
чтобы быть идентичными ямам?

Остались вопросы?   Есть предложения?


Автор: Залога А.Н.
Страница создана 26 апреля 2005 г.
Последние изменения внесены 18 июня 2005 г.

Hosted by uCoz