Anima Robot Warfare 1

Правила RW1


-= Robot Warfare 1 =-

http://robots.chat.ru

Copyright (c) 1998-2000 by
Alexander A. Shabarshin
shaos@mail.ru

Декабрь 1998 - Март 2000

Правила RW1
Версия 1.9.9

 1. КАК ВОЮЮТ РОБОТЫ
    1.1 КОНЦЕПЦИЯ ИГРЫ
    1.2 ПОЛЕ БОЯ
    1.3 ОБОРУДОВАНИЕ РОБОТА
    1.4 ДВИЖЕНИЕ РОБОТА И ОТНОСИТЕЛЬНЫЕ КООРДИНАТЫ
    1.5 ЭНЕРГИЯ
    1.6 СТЕНЫ И КАМНИ
    1.7 ИСПОЛЬЗОВАНИЕ ПУШЕК
    1.8 ИСПОЛЬЗОВАНИЕ ГЛАЗ
    1.9 ИСПОЛЬЗОВАНИЕ РАДАРА
    1.10 ВЗАИМОДЕЙСТВИЕ РОБОТОВ

 2. ЯЗЫК ПРОГРАММИРОВАНИЯ РОБОТОВ RW1
    2.1 RW1-ТЕКСТ И RW0-ПСЕВДОКОД
    2.2 ПРИМЕР ПРОСТОГО РОБОТА
    2.3 СТРУКТУРА ПРОГРАММЫ
    2.4 КОМАНДЫ ЯЗЫКА RW1
        2.4.1 DEF name[N_len]
        2.4.2 DEF name[N_len] = {...}
        2.4.3 GOTO label
        2.4.4 CALL label
        2.4.5 RET
        2.4.6 POP
        2.4.7 STEP
        2.4.8 LEFT
        2.4.9 RIGHT
        2.4.10 ACT Var
        2.4.11 SPY
        2.4.12 RADAR Var
        2.4.13 DUMP N_width
        2.4.14 PRINT Var
        2.4.15 SAY "..."
        2.4.16 TEST "..." : label
        2.4.17 SEND Var1 Var2
        2.4.18 RECV Var
        2.4.19 SHOT Arr[N_offset]
        2.4.20 IF expr : label
        2.4.21 Var = expr
    2.5 ТОНКОСТИ ПРОГРАММИРОВАНИЯ
        2.5.1 ВЕЧНЫЙ ЦИКЛ
        2.5.2 РЕАЛИЗАЦИЯ IF-ELSE
        2.5.3 РЕАЛИЗАЦИЯ WHILE
        2.5.4 РЕАЛИЗАЦИЯ FOR
        2.5.5 ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ
        2.5.6 ДВУМЕРНЫЕ МАССИВЫ
        2.5.7 ИСПОЛЬЗОВАНИЕ СЛУЧАЙНОСТИ

 3. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
    3.1 RW1_COMP.EXE - КОМПИЛЯТОР
    3.2 RW1_DUEL.EXE - ВИЗУАЛИЗАТОР БОЯ
    3.3 RW1_EDIT.EXE - РЕДАКТОР РОБОТОВ
    3.4 RW1_CMP2.EXE - СРАЖАТЕЛЬ

 4. КАК ИГРАТЬ В RW1 ПО E-MAIL
    4.1 ИГРОКИ
    4.2 ЭЛЕКТРОННЫЕ АДРЕСА, СПИСОК РАССЫЛКИ
    4.3 ЗАПРОСЫ ПО ЭЛЕКТРОННОЙ ПОЧТЕ
    4.4 ПРОВЕДЕНИЕ СОРЕВНОВАНИЙ
    4.5 ПРИВИЛЕГИИ АВТОРА РОБОТА-ПОБЕДИТЕЛЯ
    4.6 ИДЕНТИФИКАЦИЯ РОБОТА
    4.7 СНЯТИЕ РОБОТА С СОРЕВНОВАНИЙ
    4.8 ПОДСЧЕТ ОЧКОВ И ОПРЕДЕЛЕНИЕ РОБОТА-ПОБЕДИТЕЛЯ

===========================================================================

"Robot Warfare is a Russian invention, along with vodka and Tetris ..."

                  Sam James and Harry Fairhead, COMPUTER SHOPPER, December 1999





   1. КАК ВОЮЮТ РОБОТЫ

   1.1 КОНЦЕПЦИЯ ИГРЫ

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


   1.2 ПОЛЕ БОЯ

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


   1.3 ОБОРУДОВАНИЕ РОБОТА

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


   1.4 ДВИЖЕНИЕ РОБОТА И ОТНОСИТЕЛЬНЫЕ КООРДИНАТЫ

   Робот может двигаться вперед или осуществлять поворот на 90
градусов вправо или влево. Одно действие занимает 1 такт боевого
времени. Если робот ударяется в стену, это не влечет за собой
потерю энергии. Все координаты даются роботу в относительной
системе координат, связанной с роботом - начало координат в
клетке, где стоит робот, ось Х направлена вправо от робота, ось
У направлена вперед. Когда робот поворачивается, его оси координат
также поворачиваются.


   1.5 ЭНЕРГИЯ

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


   1.6 СТЕНЫ И КАМНИ

   Робот не может проехать сквозь стену вокруг поля боя. И не
может расстрелять ее. Сквозь камень робот также не может проехать,
но зато может его расстрелять из пушки, выстрелив пять раз или меньше,
если в этот камень уже кто-то стрелял.


   1.7 ИСПОЛЬЗОВАНИЕ ПУШЕК

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


   1.8 ИСПОЛЬЗОВАНИЕ ГЛАЗ

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


   1.9 ИСПОЛЬЗОВАНИЕ РАДАРА

   Использование радара требует затрат энергии. Однократное его
использование влечет за собой уменьшение энергии на 1 единицу.
Радар принимает число - тип объекта, который нужно обнаружить
(см.1.2, в том числе и 0 - обнаружить ближайшее
пустое место), и дает роботу информацию об относительных координатах
ближайшего объекта требуемого типа (но не более того).


   1.10 ВЗАИМОДЕЙСТВИЕ РОБОТОВ

   Начиная с версии 1.99 роботы получили возможность взаимодействовать
друг с другом. Общение может быть осуществлено двумя путями:
во-первых - путем широковещательных символьных сообщений (команда SAY),
во-вторых - путем использования радиопередатчика (команда SEND).
   Широковещательное символьное сообщение может быть проверено с помощью
команды TEST, которая сравнивает последнюю сказанную фразу со строкой-
шаблоном, в которой могут быть использованы символы-заменители
'?' (заменяет любой один символ) и '*' (заменяет несколько любых
символов - в том числе и нисколько).
   Однократное использование радиопередатчика влечет уменьшение энергии
на 1 единицу. При этом по "радио" отправляется целое число со знаком либо
конкретному роботу, либо всем роботам, участвующим в бою. При получении
любым роботом сообщения по "радио" оно помещается в очередь сообщений и
может быть прочитано оттуда командой RECV. При этом для каждого сообщения
(которое является целым числом со знаком) сохраняются :
- порядковый номер робота-передатчика;
- относительные координаты передатчика;
- момент времени, в который был отправлен/получен сигнал.


   2. ЯЗЫК ПРОГРАММИРОВАНИЯ РОБОТОВ RW1

   2.1 RW1-ТЕКСТ И RW0-ПСЕВДОКОД

   Описание поведения робота записывается в текстовый файл с
расширением RW1. Если автор желает сделать текст своей программы
нечитаемым для других игроков, он может откомпилировать его в
RW0 псевдокод с помощью утилиты RW1_COMP.EXE, в противном случае
текст, помещаемый на нашей страничке в Интернете, может быть
прочитан и использован другими игроками. Внутри каждого робота
находится виртуальная машина RW0, выполняющая RW0 байт-код.
При загрузке в игру робота из текста RW1, предварительно
производится компиляция в байт-код для виртуальной машины RW0.


   2.2 ПРИМЕР ПРОСТОГО РОБОТА

   % ================= WSIMPLE.RW1 ==================
   % Пример простейшего
   % робота с одним глазом
   % и одной пушкой.
   % Запуск:    RW1_DUEL.EXE  WSIMPLE.RW1

   ROBOT "WinSimple Robot"

     COLOR FFD010

     FRONT EYE
     LEFT  GUN

   START:

     ACT FRONT        % Смотрим вперед
     IF N!=6 : L1     % Если впереди робот, то
        RIGHT
        ACT LEFT      % стреляем
        LEFT
        GOTO START
     L1:
     IF N!=3 : L3     % Если впереди ящик со снарядами, то
        STEP          % идем вперед
        GOTO START
     L3:              % Если впереди нет ни ящика ни робота, то
                      % это значит, что по направлению движения
                      % какая-то преграда.
     IF D==1 : L4     % Если расстояние до нее больше 1, то
        STEP          % шагаем вперед
        GOTO START
     L4:
     RIGHT            % Если преграда в следующей клетке,
     GOTO START       % то поворачиваемся направо

   END


   2.3 СТРУКТУРА ПРОГРАММЫ

   Комментарии в тексте программы начинаются символом % и
продолжаются до конца строки. В каждой строке записывается лишь
одна команда. Каждая команда выполняется за один такт боевого времени
(за исключением команд GOTO, CALL, RET и DEF без инициализации).
Команды GOTO, CALL, RET и DEF (без инициализации) выполянются
"мгновенно" и в один такт боевого времени может быть выполнено до
десяти таких команд (плюс одна полноценная команда).
Количество "мгновенных" команд, выполняющихся за один боевой такт,
ограничено десятью, для того, чтобы избежать зацикливания программы
визуализации боя, в случае, если в программе будет, например, цикл,
состоящий только из "мгновенных" команд.
   Программа начинается с ключевого слова ROBOT, за которым
следует имя робота в кавычках. Программа заканчивается ключевым словом END.
Программу на языке RW1 можно разбить на два блока - блок объявлений
(после ROBOT и до метки START) и блок команд (после метки START и до END).
   Имя автора робота задается в блоке объявлений путем использования
ключевого слова AUTHOR, за которым следует имя автора в кавычках.
Каждый робот, участвующий в групповом бою, имеет строку автора и
порядковый номер. Роботы одного автора считаются роботами одной
команды и видят друг-друга как объекты типа 7.
   Цвет робота задается в блоке объявлений ключевым словом COLOR
и следующим за ним цветом в 16-ричной форме RGB, например:

   COLOR FF0000 % красный
   COLOR 00FF00 % зеленый
   COLOR 0000FF % синий
   COLOR FFFFFF % белый
   COLOR C0C0C0 % светло-серый и т.д.

   Допускается лишь одно определение цвета робота в программе.
Если цвет робота не определен - робот считается белым. Картинка,
соответствующая роботу, может быть задана в блоке объявлений
следующим образом:

   IMAGE 0 0 0 0 0 0 0 0   % 1-я строка, 8 черных точек
   IMAGE 0 0 0 0 0 0 0 0   % 2-я строка,
   IMAGE 0 0 1 1 1 1 0 0
   .....
   IMAGE 0 0 1 A B 0 0 0
   IMAGE 0 0 0 0 0 0 0 0   % 8-я строка,

   где
         0 - BLACK        8 - DARKGRAY
         1 - BLUE         9 - LIGHTBLUE
         2 - GREEN        A - LIGHTGREEN
         3 - CYAN         B - LIGHTCYAN
         4 - RED          C - LIGHTRED
         5 - MAGENTA      D - LIGHTMAGENTA
         6 - BROWN        E - YELLOW
         7 - LIGHTGRAY    F - WHITE

   В блоке объявлений также указывается оборудование робота путем
использования команд: FRONT, BACK, LEFT, RIGHT, за которыми идет
либо слово EYE (глаз), либо слово GUN (пушка). Например, чтобы
описать робота с четырьмя пушками, пишем

   FRONT GUN  % спереди пушка
   BACK  GUN  % сзади пушка
   LEFT  GUN  % слева пушка
   RIGHT GUN  % справа пушка

   Или одна пушка впереди и один глаз сзади

   FRONT GUN  % спереди пушка
   BACK  EYE  % сзади глаз

   Метка - это слово, составленное из латинских букв, цифр
и символа подчеркивания ('_') длиной до 16 символов, за которым
следует двоеточие (':'). В программе допускается наличие не более
256 меток. Следует иметь в виду, что в строке, где есть метка,
наличие команды не допускается (комментарий после метки допустим).
На прохождение метки такты боевого времени не тратятся. Самой
первой меткой в программе должна быть метка START. После этой
метки начинается блок команд - непосредственно сама программа
поведения робота.
   В программе могут быть использованы переменные и массивы. Массивы
необходимо объявлять. Переменные, в отличие от массивов, объявлять
не нужно. Переменная считается существующей с момента первого
присвоения этой переменной какого-либо значения. Переменные и
элементы массива могут принимать значения в пределах -32768..32767.
Имена переменных и массивов составляются из латинских букв, цифр и
символа подчеркивания ('_') длиной до 16 символов. Все переменные,
массивы и метки должны иметь уникальные имена, отличные от ключевых
слов языка и от имен регистров робота. Большие и маленькие буквы
не различаются (например, имена 'Name' и 'NAME' будут обозначать
одно и то же).
   Следует отметить, что некорректная работа со стеком (CALL и RET)
приведет робота в состояние HALT, при котором он считается погибшим.
К этому же приводит большинство некорректных действий программы робота.
   Робот имеет несколько целочисленных регистров (только для чтения):

    X,Y - координаты объекта относительно робота,
    D - расстояние,
    N - тип объекта (см.1.1),
    K - вспомогательный регистр,
    R - случайное число 0..999,
    T - значение счетчика тактов,
    E - уровень энергии НАШЕГО робота,
    M - количество снарядов НАШЕГО робота,
    I - порядковый номер в игре НАШЕГО робота (нумерация с 1),
    S - глубина стека возвратов (в начале программы 0).


   2.4 КОМАНДЫ ЯЗЫКА RW1

   2.4.1 DEF name[N_len]

   Объявление массива без инициализации. Занимает 0 тактов.
"name" - уникальное имя массива, отличное от других имен в программе.
N_len - число от 1 до 10000. Следует отметить, что сумма количества
всех переменных и суммарной длины всех описанных в программе
массивов не должна превышать 10000. При объявлении массива, его
элементы принимают нулевые значения.

   2.4.2 DEF name[N_len] = {...}

   Объявление массива с инициализацей. Занимает 1 такт.
В фигурных скобках через запятую перечисляются значения элементов
массива. Если количество элементов в скобках меньше чем k, то все
оставшиеся принимают нулевые значения. Например, DEF aa[10]={1,2,3}
означает, что первые три элемента массива aa[0], aa[1] и aa[2] принмают
значения 1,2 и 3 соответственно, а все остальные принимают 0.

   2.4.3 GOTO label

   Команда ветвления. Передает управление на метку. Занимает 0 тактов.
"label" - имя метки, существующей в программе. Выполнение этой
команды записывает в указатель команд адреса метки (регистр указателя
команд скрыт от пользователя).

   2.4.4 CALL label

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

   2.4.5 RET

   Команда ветвления. Возврат из подпрограммы. Занимает 0 тактов.
Выполнение этой команды влечет за собой снятие с вершины стека
возвратов адреса возврата, уменьшение регистра глубины стека S на 1
и передачу управления на адрес возврата (запись адреса в указатель команд).

   2.4.6 POP

   Команда особождения стека возвратов на 1 значение. Регнстр S
уменьшается на 1 (если его значение было больше 0). Полезна при
экстренном выходе из подпрограммы для дальнейшего перехода на
какую-либо метку внутри основной программы путем использования
команды GOTO. Команда выполняется за 1 такт боевого времени.

   2.4.7 STEP

   Команда движения робота, занимающая 1 такт. Производит один шаг
в направлении движения робота, возвращает в регистре N тип объекта
(см.1.2), который помешал сделать шаг, или 0, если шаг успешно произведен.

   2.4.8 LEFT

   Команда движения робота, занимающая 1 такт. Производит поворот
робота на 90 градусов влево.

   2.4.9 RIGHT

   Команда движения робота, занимающая 1 такт. Производит поворот
робота на 90 градусов вправо.

   2.4.10 ACT Var

   Команда действий робота. Задействует оборудование (глаз или пушку),
размещенное в направлении Var ( 0-спереди, 1-справа, 2-сзади, 3-слева
или FRONT, RIGHT, BACK и LEFT соответственно ), причем глаз возвращает
следующую информацию в регистрах робота: D - расстояние до объекта
(1 - соседняя клетка), N - тип объекта в выбранном направлении,
K - уровень энергии, если это робот, или степень целостности, если
это камень, или направление полета, если это снаряд (1 - в робота,
0 - от робота либо в сторону). Занимат 1 такт.

   2.4.11 SPY

   Информационная команда. Дает информацию о том, попал ли последний
выпущенный снаряд в цель. Регистры X и Y возвращают текущие относитеьные
координаты снаряда (или координаты места, куда он попал), регистр N -
тип объекта (номер типа или 0, если снаряд еще в полете, и -1, если
ни один снаряд еще не выпущен. Занимает 1 такт.

   2.4.12 RADAR Var

   Команда поиска. Запускает радар на поиск объекта типа Var = 0..7.
Координаты найденного объекта относительно робота помещаются в
регистры X и Y, если же оба регистра равны 0, то объект не найден.
В регитстре K возвращается квадрант объекта (относительно робота -
против часовой стрелки 0,1,2,3), в регистре D - минимальное абсолютное
значение координат. Занимает 1 такт. Отнимает 1 единицу энергии.

   2.4.13 DUMP N_width

   Команда для отладки. Выводит дамп памяти массивов и
переменных в столбец шириной N_width (только в режиме отладки).
В версии 1.99 выводится в файл RW1_DUEL.OUT в режиме отладки.
Занимает 1 такт боевого времени.

   2.4.14 PRINT Var

   Команда для отладки. Var - имя регистра, переменной или элемента
массива. Команда выводит на терминал значение регистра, переменной
или элемента массива, имя которого указано после слова PRINT.
Занимает 1 такт боевого времени.

   2.4.15 SAY "..."

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

   2.4.16 TEST "..." : label

   Команда ветвления. Проверяет последнее сказанное через команду SAY.
Если сказанное точно соответствует шаблону, указанному в кавычках после
слова TEST, то происходит переход на метку с именем "label". В шаблоне
могут быть использованы символы * и ?, заменяющие собой: ? - один символ,
* - любое количество символов (в том чиле и нисколько). Команда выполняется
за 1 такт боевого времени.

   2.4.17 SEND Var1 Var2

   Команда взаимодействия роботов. Передает код по "радио". Код Var1
(число, переменная или элемент массива) отправляется по "радио" роботу
с порядковым номером Var2 (число, переменная или элемент массива).
Причем если Var2 равно нулю, то передача является широковещательной,
т.е. код получает каждый робот, участвующий в игре. Команда выполняется
за 1 такт боевого времени и вызывает уменьшение энергии на 1.

   2.4.18 RECV Var

   Команда взаимодействия роботов. Принимает код по "радио". Принятый
код записывается в Var (переменная или элемент массива). Кроме того
в регистры заносится следующая информация: регистр N - порядковый номер
робота-передатчика (если N равен 0, то буфер принятых сообщений пуст);
в X и Y записываются относительные координаты робота-передатчика;
в регистр K помещается значение счетчика времени T, в которое был
отправлен код (для определения приемником того, насколько давно было
отправлено сообщение). При однократном использовании команды RECV
количество сообщений в буфере принятых сообщений уменьшается на одно.
Размер буфера - 100 сообщений. Команда выполняется за 1 такт боевого времени.

   2.4.19 SHOT Arr[N_offset]

   Команда сохранения регистров в памяти. В массив Arr[] начиная с
элемента N_offset записываются значения всех внутренних регистров
робота, начиная с элемента N_offset и заканчивая элементом N_offset+15
(т.е. предусмотрено место для 16 регистров - пока используется только 10).
Регистры записываются в массив следующим образом:
Arr[N_offset+0]=X, Arr[N_offset+1]=Y, Arr[N_offset+2]=D, Arr[N_offset+3]=N,
Arr[N_offset+4]=K, Arr[N_offset+5]=R, Arr[N_offset+6]=T, Arr[N_offset+7]=E,
Arr[N_offset+8]=M, Arr[N_offset+9]=I, Arr[N_offset+10]=0, Arr[N_offset+11]=0,
Arr[N_offset+12]=0, Arr[N_offset+13]=0, Arr[N_offset+14]=0, Arr[N_offset+15]=S.
Команда выполняется за 1 такт боевого времени.

   2.4.20 IF expr : label

   Команда ветвления. Передает управление на метку "label", если условие
"expr" выполняется. В качестве условия выступает запись вида Var1 Op Var2,
где Var1 и Var2 могут быть числом, регистром, переменной или элементом
массива, а Op - логическая операция: больше >, меньше <, больше или равно >=,
меньше или равно <=, равно == или =, неравно != или <>.
Занимает 1 такт.

   2.4.21 Var = expr

   Команда вычисления выражения. Занимает 1 такт. Var может быть переменной
или элементом массива, а "expr" - запись вида Var1 (т.е. простое присвоение),
-Var1 (т.е. операция унарного минуса), ~Var1 (т.е. операция побитной инверсии)
или Var1 Op Var2, где Var1 и Var2 может быть числом, регистром, переменной
или элементом массива, а Op - арифметическая операция: сложение + , вычитание - ,
умножение * , целочисленное деление /, остаток от деления %, побитное или |,
побитное и &, побитное сложение по модулю 2 ^.


   2.5 ТОНКОСТИ ПРОГРАММИРОВАНИЯ

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

   2.5.1 ВЕЧНЫЙ ЦИКЛ

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

   ROBOT "TEST"
   COLOR 0000FF
   FRONT EYE
   LEFT GUN
   START: % начало "вечного" цикла
     % тело "вечного" цикла
     ...

   GOTO START % конец "вечного" цикла
   % здесь, при необходимости, могут располагаться подпрограммы
   END

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

   ROBOT "TEST"
   COLOR 0000FF
   FRONT EYE
   LEFT GUN
   START:  % начало блока инициализации
   DEF A1[10] % объявление массивов
   DEF A2[20]
   ...
   I1=0       % начальная инициализация переменных
   JJ=101
   ...
   % конец блока инициализации
   START1: % начало "вечного" цикла
     % тело "вечного" цикла
     ...

   GOTO START1 % конец "вечного" цикла
   % здесь, при необходимости, могут располагаться подпрограммы
   END

   2.5.2 РЕАЛИЗАЦИЯ IF-ELSE

   Если требуется запрограммировать условие IF-ELSE на языке RW1,
то это будет выглядеть так:

   IF условие : LABEL1
      % блок кода, если условие не выполняется
      ...

      GOTO LABEL2
   LABEL1:
      % блок кода, если условие выполняется
      ...

   LABEL2:
   % дальнейший код
   ...

   2.5.3 РЕАЛИЗАЦИЯ WHILE

   Аналог цикла WHILE будет следующим:

   LABEL1:
      IF условие_выхода_из_цикла : LABEL2
      % блок кода в цикле
      ...

      GOTO LABEL1
   LABEL2:
   % дальнейший код
   ...


   2.5.4 РЕАЛИЗАЦИЯ FOR

   Цикл FOR будет иметь следующий вид:

   i=0 % начальная инициализация счетчика
   LABEL1:
      IF i>=10 : LABEL2 % проверка на выход после 10 проходов
      % блок кода в цикле
      ...

      i=i+1
      GOTO LABEL1
   LABEL2:
   % дальнейший код
   ...

   2.5.5 ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ

   Если какие-то куски кода программы состоят из идентичных
команд, то удобнее воспользоваться подпрограммой, состоящей из
этих команд, например имеем:

   ...
   ACT FRONT
   i=i+1
   STEP
   ACT FRONT
   i=i+1
   STEP
   ACT FRONT
   i=i+1
   STEP
   ...

   можно записать так:

   ...
   CALL SUB1
   CALL SUB1
   CALL SUB1
   ...
   GOTO START % конец большого цикла

   SUB1: % метка, обозначающая начало нашей подпрограммы
     ACT FRONT
     i=i+1
     STEP
     RET  % возврат из подпрограммы

   END % конец программы на RW1

   Начиная с версии 1.99 вызов подпрограммы и возвращение из нее
не влечет потерю времени, т.к. команды CALL и RET теперь не занимают
времени.

   2.5.6 ДВУМЕРНЫЕ МАССИВЫ

   Также бывает полезно воспользоваться двумерными массивами. Так
как язык RW1 позволяет оперировать лишь с одномерными массивами,
то приходиться эмулировать двумерный массив следующим образом.
Пусть нам нужен двумерный массив 10 x 10. Для этого мы описываем
массив длиною 100:

   DEF ARR[100]

   А в программе обращаемся к элементу [x,y] этого массива так:

   i=y*10
   i=i+x
   ARR[i]=k % что означает ARR[x,y]=k

   или

   i=y*10
   i=i+x
   k=ARR[i] % что означает k=ARR[x,y]

   2.5.7 ИСПОЛЬЗОВАНИЕ СЛУЧАЙНОСТИ

   Бывает полезно пользоваться регистром R, который возвращает
случайное число от 0 до 999. Например, если робот натолкнулся на
препятствие, то можно развернуть его либо влево, либо вправо:

   ...
   i=R%2 % поучаем из числа 0..999 или 0, или 1
   IF i==1 : L_LEFT
      RIGHT  % если у нас случайно получился 0, то направо
      GOTO L_END
   L_LEFT:
      LEFT  % если у нас случайно получилась 1, то налево
   L_END:
   ...

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


   3. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

   3.1 RW1_COMP.EXE - КОМПИЛЯТОР

   RW1_COMP.EXE - программа компилятора роботов. В качестве аргумента
задается имя текстового файла с расширением RW1, в котором записан текст
программы на языке RW1. Компилятор производит проверку программы на наличие
ошибок и генерирует бинарный файл с расширением RW0, в котором записывается
код скомпилированного робота. На экран выводится количество байт получившегося
кода и количество использованных в роботе переменных.

   3.2 RW1_DUEL.EXE - ВИЗУАЛИЗАТОР БОЯ

   RW1_DUEL.EXE - программа визуализации боя между роботами (от 2 до 15).
Варианты запуска :

    RW1_DUEL [options] ROBOT.RW1
    RW1_DUEL [options] robots
    RW1_DUEL @list.txt

   где options - опции, разделенные пробелами; robots - имена файлов
роботов (RW1 и/или RW0), разделенные пробелами. Файл list.txt - текстовый
файл, в котором могут быть перечислены необходимые опции и имена файлов
роботов, по одной записи в строке. Кроме того допускается использовать
и файл с опциями и задание опций из командной строки.
   Возможные опции:
   -s0 : отключение звука
   -s1 : PC-спикер (по умолчанию)
   -r0 : подключение встроенного робота-соперника 'WINSIMPLE'
   -r1 : подключение встроенного робота-соперника 'BUILT-IN 2' (по умолчанию)
   -r2 : подключение встроенного робота-соперника 'MONSTER 7'
   -f  : быстрая игра с визуализацией
   -f2 : быстрая игра без визуализации
   -d  : режим отладки, при котором вывод направляется в файл RW1_DUEL.OUT
   -d2 : режим пошаговой отладки по тактам (с RW1_DUEL.OUT)
   -d3 : режим пошаговой отладки по подтактам (1/5 такта) (с RW1_DUEL.OUT)
   -nM : M - число от 0 до 1 для задания карты (например -n0.2001)
   -gT : быстрый пробег до такта T (может быть совместно использовано с -d2)
   -gr : режим групповых боев (свои роботы видны как объект 7)
   -dm : deathmatch режим - каждые 1000 тактов появляются ящики с патронами
   -mN : размножение роботов до количества N (размножается последний робот)
   -E/M : где E и M числа соответственно уровень энергии и количество
          снардов для последнего упомянутого робота в командной строке.
          Пример: RW1_DUEL robot1.rw0 -10/10 robot2.rw0 -13/50

   Теперь незарегистрированным пользователям доступны ВСЕ возможности
программы, но в течение только лишь 200 тактов. Без ограничений программа
работает когда в качестве аргумента был записан единственный робот в виде
исходного текста (RW1), а также при наличии ключа -f2 (отключение
визуализации). Последнее означает, что программа RW1_CMP2 отныне будет
доступна абсолютно всем! Стоимость регистрационного ключа - $7.00.
(для жителей СНГ возможны варианты - пишите гейм-мастеру robots@shaos.ru).

   3.3 RW1_EDIT.EXE - РЕДАКТОР РОБОТОВ

  RW1_EDIT.EXE - редактор роботов для операционной системы Windows-95.
Для удобства в редакторе присутствует подсветка синтаксиса (комментарии,
ключевые слова и цифры выделяются разными цветами). В редакторе используется
альтернативная (досовская) кодировка для русских букв! Через меню ACTION
можно запускать для редактируемого робота компилятор или визуализатор боя.
Выделение блоков осуществляется через SHIFT и стрелки либо мышью (левый
клик - начало, правый клик - конец).

   3.4 RW1_CMP2.EXE - СРАЖАТЕЛЬ

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


   4. КАК ИГРАТЬ В RW1 ПО E-MAIL

   4.1 ИГРОКИ

   Игрок - автор роботов, выбирает себе псевдоним и отправляя
своего робота, указывает свой псевдоним в поле "Subject".
Например автор ALEX, должен отправлять своего робота в письме со
следующим subject: "RW1:ALEX". Чтобы мы могли соотнести псевдоним
с электронным адресом автора, его полным именем и т.д., автор
должен предварительно включится в игру, отправив нам электронное
письмо, указав в поле subject слово "REG", двоеточие и свой
псевдоним. В этом письме автор может сообщить некоторую
информацию о себе - полное имя, пол, род занятий, город проживания
и т.д. Эта информация будет использована нами в статистических
целях и поможет избежать путаницы, если несколько авторов
пожелают называться одним псевдонимом. Например автор пожелал
называться ALEX. Он отправляет нам письмо, указав в поле subject
"REG:ALEX". Если еще кто-то пожелает быть ALEX-ом и попытается
зарегистрироваться с этим псевдонимом, то ему будет отправлено
уведомление с просьбой сменить псевдоним.

   4.2 ЭЛЕКТРОННЫЕ АДРЕСА, СПИСОК РАССЫЛКИ

   Электронный адрес каждого автора известен только нам и неизвестен
другим авторам (если автор не изьявил желание сделать свой e-mail
общедоступным). Поэтому вся корреспонденция между авторами проходит
через нас (shaos@mail.ru). При этом в поле "Subject" нужно писать
слово "MAIL", двоеточие и псевдоним автора, кому нужно отправить письмо.
Например некто хочет отправить сообщение автору ALEX. Для этого он
отправляет свое сообщение нашему почтовому роботу (shaos@mail.ru),
указав в поле темы (subject) следующее "MAIL:ALEX". Наш почтовый робот
тут же отправит это сообщение нужному игроку, удалив из письма обратный
адрес и вставив в письмо псевдоним отправителя. Для того, чтобы все
сработало, отправитель должен отправить свое письмо именно с того адреса,
с которого отправлялось его первое письмо "REG". Игрок может измененить
свой электронный адрес через гейм-мастера.
   Также авторы имеют возможность подписаться на наш список рассылки
rwar@onelist.com, для этого достаточно отправить пустое письмо по адресу
rwar-subscribe@onelist.com, если потребуется отказаться от подписки, то
нужно отправить пустое письмо на rwar-unsubscribe@onelist.com.
Так же существует англоязычный список рассылки rware@onelist.com.

   4.3 ЗАПРОСЫ ПО ЭЛЕКТРОННОЙ ПОЧТЕ

   Вы можете запросить у нашего почтового робота файлы, указав в качестве 
темы письма слово REQUEST (большими буквами!):
   1) RULES RUS - правила на русском (20K)
      или RULES ENG - правила на английском (20K)
   2) RW1_COMP - RW1 компилятор (25K)
   3) RW1_DUEL - визуализатор боя роботов (50K)
   4) RESULTS - результаты последнего соревнования (5-10K)
   5) ROBOT NEW - новые роботы из последних соревнований (10-15K)
      или ROBOT SRC - все роботы, пришедшие в исходных текстах
          ROBOT A - все роботы из класса A
          ROBOT B - все роботы из класса B  и т.д.
   Укажите в теле письма одно или несколько из этих ключевых слов
по одному в начале строки и вы получите то, что заказывали.

   4.4 ПРОВЕДЕНИЕ СОРЕВНОВАНИЙ

   Основные соревнования между роботами проводятся нами по понедельникам.
Результаты соревнований на нашем сайте появляются во вторник. Участие в
соревнованиях абсолютно бесплатное. Каждую неделю будет обновляться список
лидирующих роботов. Также на нашей странице всегда можно будет найти
новейшую программу для тестирования Вашего робота и статистику
по всем проведенным битвам роботов. Следует отметить, что с нашей
странички можно скачать тексты программ или псевдокоды всех роботов,
участвовавших во всех соревнованиях. Кроме того на сайте roboits.ural.net
присутствует удобный интерфейс для доступа к базе данных всех игроков и
всех их роботов, когда-либо участвовавших в соревнованиях.

   4.5 ПРИВИЛЕГИИ АВТОРА РОБОТА-ПОБЕДИТЕЛЯ

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

   4.6 ИДЕНТИФИКАЦИЯ РОБОТА

   Автор робота должен дать своему детищу
   а) уникальное имя, которое ранее не использовалось в соревнованиях,
   б) цвет (RGB),
   в) и при желании небольшую картинку (8х8 - 16 цветов).

   4.7 СНЯТИЕ РОБОТА С СОРЕВНОВАНИЙ

   Робот может быть снят с соревнований в трех случаях:
  - автор робота был уличен в плагиате (перекомпиляция чужого робота);
  - в последних соревнованиях робот набрал менее 0 очков, играя в самом
последнем классе, либо попал в число трех пследних роботов;
  - автор сам пожелал снять робота, в этом случае он должен отправить
письмо на наш электронный адрес с темой "DEL:ROBOT.RW0", где ROBOT.RW0
имя файла робота, причем письмо должно быть отправлено точно с того же
адреса, с которого автор регистрировался в игре (письмо "REG") и отправлял
своих роботов. Следует иметь в виду, что робота, играющего в классе А,
автор снять не может.

   4.8 ПОДСЧЕТ ОЧКОВ И ОПРЕДЕЛЕНИЕ РОБОТА-ПОБЕДИТЕЛЯ

   Каждая битва ведется в течении 10000 тактов боевого времени. Выигрывает
робот, убивший соперника и оставшийся в живых. В случае, если во время
боя никто не погибнет, результатом игры считается НИЧЬЯ. То же самое
относится к случаю, когда выжил никого не убивший робот (например,
погибший робот просто упал в яму или выполнил некорректную инструкцию).
   Все роботы разделены на классы. Самым лучшим считается класс А.
По результатам боев в классе А высчитывается десятка лучших роботов
(с учетм предыдущих соревнований). Каждый класс содержит 21 робота
(кроме последнего класса - там может быть от 10 до 30 роботов).
В одном бою участвуют только два робота из одного класса. Если в
классе представлены N роботов (обычно 21), то проводится N*(N-1) боев.
Каждый робот участвует в 2*(N-1) боях. Например, если в одном классе 21
робот, то проводится 21*20=420 боев - каждый с каждым по два раза - и
каждый робот участвует в 40 боях. После каждого боя 1 очко приписывается
роботу-победителю. При ничье каждый робот, участвовавший в бою
получает по 0 очков. В случае 21 робота, максимальное количество
очков, которое может набрать робот - 40. Первый робот в каждом классе
по итогам боев в этом классе называется "сквозным" - он переходит в
верхний класс в этих же соревнованиях и воюет также и там.
   Вообще процесс игры можно представить так - существует большой
список роботов, расположенных на своих местах по итогам последних
соревнований. Новые роботы помещаются в конец списка по мере
поступления. Алгоритм проведения соревнований:
 1. Удаление роботов, которые были удалены игроками
 2. Разбиение всего списка роботов на группы по 20 (в последнем классе
    допускается наличие от 10 до 29 роботов)
 3. Назначение последнего класса текущим
 4. Проведение соревнования в текущем классе
 5. Если текущий класс не является последним, то пометка последних ТРЕХ
    роботов, как переходящих в нижний класс
 6. Если текущий класс является последним, то удаление последних ТРЕХ
    роботов (ужесточение условий вылета!!!) и роботов, набравших 0 очков
 7. Если текущий класс не является первым, то переход робота занявшего
    ПЕРВОЕ место в верхний класс ("сквозной робот" или просто "сквозняк" :)
    и пометка роботов, занявших ВТОРОЕ и ТРЕТЬЕ место, как переходящих в
    верхний класс
 8. Если текущий класс является первым, то назначение робота, занявшего
    ПЕРВОЕ место, победителем соревнований. Переход к 10
 9. Назначение верхнего класса текущим. Переход к 4
10. Перемещение роботов, помеченных как переходящих в верхние или
    нижние классы.
11. Объединение всех роботов в один большой список


   SPECIAL THANKS

   Stepan Unegov
   Uriy Kornukhin
   Uriy Ivanov
   Tim Collins
   Jaroslav Malygin


Автор: Шабаршин А.А.
Страница создана 6 декабря 1998
Последние измененния внесены 20 мая 2011