-= Robot Warfare 1 =-
http://attend.to/robots
Copyright (c) 1998-1999 by
Шабаршин А.А. (shaba@earthcorp.com),
Унегов С.В. (unegov@a-vip.com).
Декабрь 1998 - Май 1999
Правила ведения войны роботов 1
Version 1.8.0
1. ROBOT WARFARE 1 - ИГРА ПО E-MAIL 1.1 ВВЕДЕНИЕ 1.2 ИГРОКИ 1.3 ЭЛЕКТРОННЫЕ АДРЕСА, СПИСОК РАССЫЛКИ 1.4 ЗАПРОСЫ ПО ЭЛЕКТРОННОЙ ПОЧТЕ 2. ПРАВИЛА ПРОВЕДЕНИЯ СОРЕВНОВАНИЙ 2.1 ПРОВЕДЕНИЕ СОРЕВНОВАНИЙ 2.2 ПРИВИЛЕГИИ АВТОРА РОБОТА-ПОБЕДИТЕЛЯ 2.3 ПОДСЧЕТ ОЧКОВ И ОПРЕДЕЛЕНИЕ РОБОТА-ПОБЕДИТЕЛЯ 2.4 ИДЕНТИФИКАЦИЯ РОБОТА 2.5 СНЯТИЕ РОБОТА С СОРЕВНОВАНИЙ 3. ПРАВИЛА ВЕДЕНИЯ БОЯ 3.1 ПОЛЕ БОЯ 3.2 ОБОРУДОВАНИЕ РОБОТА 3.3 ДВИЖЕНИЕ РОБОТА И ОТНОСИТЕЛЬНЫЕ КООРДИНАТЫ 3.4 ЭНЕРГИЯ 3.5 СТЕНЫ И КАМНИ 3.6 ИСПОЛЬЗОВАНИЕ ПУШЕК 3.7 ИСПОЛЬЗОВАНИЕ ГЛАЗ 3.8 ИСПОЛЬЗОВАНИЕ РАДАРА 4. ЯЗЫК "ROBOT WARFARE 1" (RW1) 4.1 RW1-ТЕКСТ И RW0-ПСЕВДОКОД 4.2 ПРИМЕР ПРОСТОГО РОБОТА 4.3 ОПИСАНИЕ ЯЗЫКА "RW1" 4.4 ТОНКОСТИ ПРОГРАММИРОВАНИЯ =========================================================================== 1. ROBOT WARFARE 1 - ИГРА ПО E-MAIL 1.1 ВВЕДЕНИЕ ROBOT WARFARE 1 - это разработанная нами бесплатная игра через Интернет, в которую может играть любой. Все, что для этого нужно сделать - изучить правила, описать поведение Вашего робота в программе на специальном языке (не более 1000 строк) и отправить эту программу нам по электронной почте (robots@army.net), указав в поле темы (subject) аббревиатуру "RW1" и псевдоним автора через двоеточие. 1.2 ИГРОКИ Игрок - автор роботов, выбирает себе псевдоним и отправляя своего робота, указывает свой псевдоним в поле "Subject". Например автор ALEX, должен отправлять своего робота в письме со следующим subject: "RW1:ALEX". Чтобы мы могли соотнести псевдоним с электронным адресом автора, его полным именем и т.д., автор должен зарегистрироваться у нас, отправив нам (robots@army.net) письмо, указав в поле subject слово "REG", двоеточие и свой псевдоним. В этом письме автор может сообщить некоторую информацию о себе - полное имя, пол, род занятий, город проживания и т.д. Эта информация будет использована нами в статистических целях и поможет избежать путаницы, если несколько авторов пожелают называться одним псевдонимом. Например автор пожелал называться ALEX. Он отправляет нам письмо, указав в поле subject "REG:ALEX". Если еще кто-то пожелает быть ALEX-ом и попытается зарегистрироваться с этим псевдонимом, то ему будет отправлено уведомление с просьбой сменить псевдоним. 1.3 ЭЛЕКТРОННЫЕ АДРЕСА, СПИСОК РАССЫЛКИ Электронный адрес каждого автора известен только нам и неизвестен другим авторам (если автор не изьявил желание сделать свой e-mail общедоступным). Поэтому вся корреспонденция между авторами проходит через нас (robots@army.net). При этом в поле "Subject" нужно писать слово "MAIL", двоеточие и псевдоним автора, кому нужно отправить письмо. Например некто хочет отправить сообщение автору ALEX. Для этого он отправляет свое сообщение к нам (robots@army.net), указав в поле темы (subject) следующее "MAIL:ALEX". В тот же день сообщение дойдет до получателя. Также авторы имеют возможность подписаться на наш список рассылки rwar@onelist.com, для этого достаточно отправить пустое письмо по адресу rwar-subscribe@onelist.com, если потребуется отказаться от подписки, то нужно отправить пустое письмо по rwar-unsubscribe@onelist.com. 1.4 ЗАПРОСЫ ПО ЭЛЕКТРОННОЙ ПОЧТЕ Вы можете запросить по электронной почте robots@army.net (subject:REQUEST) 1) RULES - правила (20K) 2) RW1_COMP - RW1 компилятор (25K) 3) RW1_DUEL - визуализатор боя роботов (50K) 4) RW1_SND - поддержка SoundBlaster для визуализатора (19K) 5) RESULTS - полные результаты последнего соревнования (60-80K) 6) ROBOT "robotname" - любой робот из соревнований (0.1-4K) или ROBOT SRC - все роботы, пришедшие в исходных текстах ROBOT A - все роботы из класса A ROBOT B - все роботы из класса B и т.д. Укажите в теле письма одно или несколько из этих ключевых слов и вы получите это. 2. ПРАВИЛА ПРОВЕДЕНИЯ СОРЕВНОВАНИЙ 2.1 ПРОВЕДЕНИЕ СОРЕВНОВАНИЙ Соревнования между роботами будут проводится на нашем сайте по мере поступления новых роботов, но не чаще одного раза в неделю. Участие в соревнованиях абсолютно бесплатное. Каждую неделю будет обновляться список лидирующих роботов. Также на нашей странице всегда можно будет найти новейшую программу для тестирования Вашего робота и статистику по всем проведенным битвам роботов. Следует отметить, что с нашей странички можно скачать тексты программ или псевдокоды всех роботов, участвовавших в последних соревнованиях. 2.2 ПРИВИЛЕГИИ АВТОРА РОБОТА-ПОБЕДИТЕЛЯ Автору робота, занимающего первое место, будет предоставлена возможность разместить свое фото (размером до 16 Кбайт) на "доске почета" нашей страницы, а также поместить короткое сообщение (не противоречащее российскому законодательству и соответствующее нормам литературного русского или английского языков). 2.3 ПОДСЧЕТ ОЧКОВ И ОПРЕДЕЛЕНИЕ РОБОТА-ПОБЕДИТЕЛЯ Битва ведется в течении 10000 тактов боевого времени. Выигрывает робот, убивший соперника и оставшийся в живых. В случае, если во время боя никто не погибнет, результатом игры считается НИЧЬЯ. То же самое относится к случаю, когда выжил никого не убивший робот (например, погибший робот просто упал в яму). Все роботы разделены на классы. Самым лучшим считается класс А. По результатам боев в классе А высчитывается десятка лучших роботов. Каждый класс содержит 16 роботов (кроме последнего класса - там может быть от 5 до 20 роботов). В одном бою участвуют только два робота из одного класса. Если в классе представлены N роботов (обычно 16), то проводится N*(N-1) боев. Каждый робот участвует в 2*(N-1) боях. Например, если в одном классе 16 роботов, то проводится 240 боев - каждый с каждым по два раза - и каждый робот участвует в 30 боях. После каждого боя 1 очко приписывается роботу-победителю. При ничье каждый робот, участвовавший в бою получает по 0 очков. В случае 16-ти роботов, максимальное количество очков, которое может набрать робот - 30. По итогам соревнований в каждом классе определяется три первых и три последних робота. Три первых переходят в старший класс (если это уже самый старший класс А, то эти роботы объявляются победителями соревнований). Три последних робота переходят в младший класс (если это уже самый младший класс, то роботам переходить некуда - они остаются в своем классе). Если робот, играя в самом последнем (младшем) классе, набирает 0 очков, то он выбывает из дальнейших соревнований. 2.4 ИДЕНТИФИКАЦИЯ РОБОТА Автор робота должен дать своему детищу а) уникальное имя, которое ранее не использовалось в соревнованиях, б) цвет (RGB), в) и при желании небольшую картинку (8х8 - 16 цветов). 2.5 СНЯТИЕ РОБОТА С СОРЕВНОВАНИЙ Робот может быть снят с соревнований в трех случаях: - автор робота был уличен в плагиате (перекомпиляция чужого робота); - в последних соревнованиях робот набрал менее 0 очков, играя в самом последнем классе; - автор сам пожелал снять робота, в этом случае он должен отправить письмо на адрес robots@army.net с subj "DEL:ROBOTNAME", где ROBOTNAME - имя робота, причем письмо должно быть отправлено точно с того же адреса, с которого автор регистрировался и отправлял своих роботов. Следует иметь в виду, что робота, играющего в классе А, автор снять не может. 3. ПРАВИЛА ВЕДЕНИЯ БОЯ 3.1 ПОЛЕ БОЯ Война роботов ведется на поле DX х DY. Размер поля зависит от количества воюющих роботов. Общая формула такова S=100*N (S - площадь поля, N - количество роботов), или, если поле квадратное, то DX=DY=10*sqrt(N). Вокруг поля возведена высокая прочная стена. По полю случайным образом разбросаны огромные камни, через которые робот не может проехать, но может их расстрелять. Также на поле располагаются еще несколько типов объектов. Каждая клетка поля может быть либо пустой, либо занятой объектом одного из следующих типов: 1 - яма 2 - камень 3 - ящик со снарядами 4 - ядерный реактор 5 - летящий снаряд 6 - робот (Кроме этого 0 соответствует пустому месту, а 10 - клетке стены вокруг поля боя). В начале игры каждый робот помещается в произвольное место карты. В случае игры с двумя роботами, размер игрового поля составляет 20 клеток по горизонтали и 10 клеток по вертикали. Вид поля битвы и весь ход игры определяется действительным числом из диапазона (0,1). Алгоритм расположения объектов на поле является псевдослучайным и зависит от этого числа. Соседними клетками для робота на игровом поле считаются четыре клетки - спереди, сзади, слева и справа от робота. Робот, упавший в яму, считается погибшим и заканчивает игру. Ящики со снарядами можно подбирать - это прибавляет роботу 10 снарядов с каждого ящика. 3.2 ОБОРУДОВАНИЕ РОБОТА Каждый робот имеет четыре посадочных места для оборудования (спереди, сзади, слева и справа) и один радар. В одно посадочное место можно установить либо пушку, либо глаз. Могут быть роботы с любыми комбинациями глаз и пушек (например, у робота могут быть только глаза или только пушки со всех сторон, или 3 глаза и 1 пушка и т.д.). При старте у робота уже имеется 5 снарядов. Максимальное количество снарядов не оговаривается. 3.3 ДВИЖЕНИЕ РОБОТА И ОТНОСИТЕЛЬНЫЕ КООРДИНАТЫ Робот может двигаться вперед или осуществлять поворот на 90 градусов вправо или влево. Одно действие за 1 такт боевого времени. Если робот ударяется в стену, это не влечет за собой потерю энергии. Все координаты даются роботу в относительной системе координат, связанной с роботом - начало координат в клетке, где стоит робот, ось Х направлена вправо от робота, ось У направлена вперед. Когда робот поворачивается, его оси координат также поворачиваются. 3.4 ЭНЕРГИЯ В начале игры каждый робот обладает 5 единицами энергии, максимальная величина - 13 единиц. При попадании снаряда робот теряет 1 единицу энергии. Зарядка робота осуществляется следующим образом: робот встает в одну из соседних клеток ядерного реактора и остается там некоторое время. Энергия будет расти со скоростью 1 единица за 5 тактов времени, в течение которого робот стоит рядом с реактором. Если же в соседних клетках 2 реактора, то робот будет заряжаться в 2 раза быстрее (2 ед. за 5 тактов). Ну, а если в соседних клетках окажется 3 реактора - скорость зарядки возрастет до 3 ед. за 5 тактов. 3.5 СТЕНЫ И КАМНИ Робот не может проехать сквозь стену вокруг поля боя. И не может расстрелять ее. Сквозь камень робот также не может проехать, но зато может его расстрелять из пушки, выстрелив пять раз или меньше, если в этот камень уже кто-то попадал. 3.6 ИСПОЛЬЗОВАНИЕ ПУШЕК Выстрел осуществляется одним снарядом в любую сторону, где у робота имеется пушка. Снаряд летит со скоростью 5 клеток за 1 такт боевого времени. Снаряд продолжает полет, пока не встретит препятствие. Если снаряд попадает в ящик со снарядами, то ящик взрывается и уничтожает все в квадрате 3х3 (у роботов, оказавшихся в этом квадрате, энергия уменьшается на 3 еденицы). Если же снаряд попадает в ядерный реактор, то происходит взрыв 5х5 клеток, уничтожающий все в этом квадрате (уменьшение энергии роботов на 5). Плюс к этому на месте ядерного реактора появляется яма. Если в области взрыва оказался другой ящик или другой ядерный реактор, то они также взрываются. Существует способ узнать куда попал снаряд (с помощью команды SPY). 3.7 ИСПОЛЬЗОВАНИЕ ГЛАЗ Глаза даны роботу для того чтобы видеть. Каждый глаз предоставляет роботу следующую информацию: а) тип объекта в направлении взгляда (см.3.1), б) расстояние до объекта в клетках (соседняя клетка - 1), в) дополнительная числовая информация - для робота - его энергия (1..13) - для камня - целостность камня (1..5) - для снаряда - направление полета (1 - в робота, 0 - от робота либо в сторону), 3.8 ИСПОЛЬЗОВАНИЕ РАДАРА Радар, в отличие от других приборов робота, требует затрат энергии. Однократное его использование влечет за собой уменьшение энергии на 1 единицу. Радар принимает число - тип объекта, который нужно обнаружить (см.3.1, в том числе и 0 - обнаружить ближайшее пустое место), и дает роботу информацию об относительных координатах ближайшего объекта требуемого типа (но не более того). 4. ЯЗЫК "ROBOT WARFARE 1" (RW1) 4.1 RW1-ТЕКСТ И RW0-ПСЕВДОКОД Описание поведения робота записывается в текстовый файл с расширением RW1. Если автор желает сделать текст своей программы нечитаемым для других игроков, он может откомпилировать его в RW0 псевдокод с помощью утилиты RW1_COMP.EXE, в противном случае текст, помещаемый на нашей страничке в Интернете, может быть прочитан и использован другими игроками. 4.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 4.3 ОПИСАНИЕ ЯЗЫКА "RW1" Комментарии в тексте программы начинаются символом % и продолжаются до конца строки. В каждой строке записывается лишь одна команда. Каждая команда выполняется один такт боевого времени. Программа начинается с ключевого слова ROBOT, за которым следует имя робота в кавычках. Заканчивается программа ключевым словом END. Цвет робота задается ключевым словом 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 % сзади глаз Конфигурация робота (цвет, картинка и оборудование) устанавливается только один раз после строки с ключевым словом ROBOT и до метки START. Метка - это слово, составленное из латинских букв, цифр и символа подчеркивания ('_') длиной до 16 символов, за которым следует двоеточие (':'). В программе допускается наличие не более 256 меток. Самой первой меткой в программе должна быть метка START: Следует иметь в виду, что в строке, где есть метка, наличие команды не допускается (комментарий после метки допустим). На прохождение метки такты боевого времени не тратятся. Если в программе используются массивы, то их нужно объявлять в теле программы (после метки START:) DEF name[k] где k - число от 1 до 10000. Следует отметить, что сумма количества всех переменных и суммарной длины всех описанных в программе массивов не должна превышать 10000. Переменные, в отличие от массивов, объявлять не нужно. Переменная считается существующей с момента ее первого использования. Переменные и элементы массива могут принимать значения в пределах -32768..32767. Все переменные, массивы и метки должны иметь уникальные имена, отличные от ключевых слов языка и от имен регистров робота. Не имеет значения регистр написания символов (например, имена 'Name' и 'NAME' будут обозначать одно и то же). Вот регистры робота (только для чтения): X,Y - координаты объекта относительно робота, D - расстояние, N - тип объекта (см.3.1), K - вспомогательный регистр, R - случайное число 0..999 T - значение счетчика тактов E - уровень энергии НАШЕГО робота, M - количество снарядов НАШЕГО робота, Команды языка RW1: GOTO label % переход на метку с именем "label" CALL label % вызвать подпрограмму с метки "label" RET % вернуться из подпрограммы STEP % произвести один шаг в направлении движения, % возвращает в регистре N тип объекта (см.3.1), % который помешал сделать шаг, % или 0, если шаг успешно произведен LEFT % повернуться налево RIGHT % повернуться направо SAY "строка" % робот произносит (выводит на терминал) фразу % некоторые команды записываются в форме comm n, % где comm - имя команды, % а n может быть числом, переменной или элементом массива. PRINT n % робот выводит на терминал содержимое % переменной или элемента массива. DUMP k % вывод дампа памяти массивов и переменных % в столбец шириной k (только при отладке) ACT n % задействовать оборудование (глаз или пушку), % размещенное в направлении n % ( 0-спереди, 1-справа, 2-сзади, 3-слева или % FRONT, RIGHT, BACK и LEFT соответственно ), % причем глаз возвращает информацию в следующих регистрах: % D - расстояние до объекта (1 - соседняя клетка), % N - тип объекта в выбранном направлении (см.3.1), % K - уровень энергии, если это робот, % или степень целостности, если это камень, % или направление полета, если это снаряд (см.3.7) SPY % дать информацию о том, попал ли последний % выпущенный снаряд, и куда он попал. % регистры X и Y текущие координаты снаряда % (или координаты места, куда он попал), % относительно робота, % регистр N - тип объекта (см.3.1), % если 0 - снаряд еще в полете, % если -1 - ни один снаряд еще не выпущен. RADAR n % запустить радар на поиск объекта типа n = 0..6, % координаты найденного объекта относительно НАШЕГО % робота помещаются в регистры X и Y , % если же оба регистра равны 0, то объект не найден. % в регитстре K возвращается квадрант объекта % (относительно робота - против часовой стрелки 0,1,2,3) % в регистре D - минимальное абсолютное значение координат % (последнее верно только для версии 1.8) % далее: % n - переменная, элемент массива, % m,k - число, переменная, элемент массива или регистр. IF k<m : label % если k меньше m, то перейти к метке label IF k>m : label % если k больше m, то перейти к метке label IF k<=m : label % если k меньше или равно m, то перейти к метке label IF k>=m : label % если k больше или равно m, то перейти к метке label IF k==m : label % если k равно m, то перейти к метке label IF k=m : label % если k равно m, то перейти к метке label IF k!=m : label % если k не равно m, то перейти к метке label IF k<>m : label % если k не равно m, то перейти к метке label n=m % присваивание % допустимые выражения n=-m % присваивание со сменой знака n=m+k % сложение n=m-k % вычитание n=m/k % целочисленное деление n=m*k % умножение n=m%k % остаток от деления m на k n=m&k % побитное и n=m|k % побитное или n=m^k % побитное исключающее или n=~m % побитная инверсия Следует отметить, что некорректная работа со стеком (CALL и RET) приведет робота в состояние HALT, при котором он считается погибшим. К тому же приводит большинство некорректных действий программы робота. 4.4 ТОНКОСТИ ПРОГРАММИРОВАНИЯ Язык RW1 ближе к ассемблерным языкам, чем к языкам высокого уровня. Из-за этого возникают некоторые трудности с программированием роботов. В этом разделе приводятся некоторые приемы программирования роботов, которые могут облегчить жизнь начинающим роботописателям. Во-первых, следует осознать, что программа робота должна выполняться "вечно", т.е. до убийства робота либо до окончания игры. Следовательно каркасом программы на 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 Если требуется запрограммировать условие IF-ELSE на языке RW1, то это будет выглядеть так: IF условие : LABEL1 % блок кода, если условие не выполняется ... GOTO LABEL2 LABEL1: % блок кода, если условие выполняется ... LABEL2: % дальнейший код ... Аналог цикла WHILE будет следующим: LABEL1: IF условие_выхода_из_цикла : LABEL2 % блок кода в цикле ... GOTO LABEL1 LABEL2: % дальнейший код ... Цикл FOR будет иметь следующий вид: i=0 % начальная инициализация счетчика LABEL1: IF i>=10 : LABEL2 % проверка на выход после 10 проходов % блок кода в цикле ... i=i+1 GOTO LABEL1 LABEL2: % дальнейший код ... Если какие-то куски кода программы состоят из идентичных команд, то удобнее воспользоваться подпрограммой, состоящей из этих команд, например имеем: ... 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 Также бывает полезно воспользоваться двумерными массивами. Так как язык 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] Бывает полезно пользоваться регистром 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.