Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #35, ОКТЯБРЬ 2003 г.

Игры настоящих кодеров

Shen (_shen_@mail.ru)

Спецвыпуск Xakep, номер #035, стр. 035-054-2


Правила

Итак, язык, на котором пишутся программы-бойцы, называется Redcode. Рассказать в небольшой статье обо всех возможностях Redcode нереально, поэтому мы ограничимся основами, «каркасом» языка. Но прежде чем приступать непосредственно к коду, разберемся, как протекает бой в памяти.

Единица измерения памяти в CoreWar – команда, она же инструкция. В отличие от ассемблера настоящего, в Redcode все инструкции «весят» одинаково: любая строка на Redcode занимает ровно одну «команду». Поле боя обычно имеет размер 8000. Т.е. программа, состоящая из восьми тысяч команд, займет собой все поле.

Сначала pMARS загружает противников в память, размещая их на поле боя случайным образом (можно указать расположение и вручную, но по правилам турниров - random). Потом симулятор выполняет первую команду одного из бойцов (неважно какого), затем первую команду второго, вторую команду первого, вторую команду второго и т.д. Так повторяется до тех пор, пока одна из программ не будет признана проигравшей или симулятор не объявит ничью. Правила, вкратце, таковы:

1. Процесс, попытавшийся выполнить данные, а не код, погибает.

2. Программа, все процессы которой мертвы, проигрывает.

Простая программа имеет всего один процесс, процессы же сложных программ могут исчисляться десятками. Ты, наверное, не совсем понял, что значит «выполнить данные, а не код» и т.д., но после прочтения следующего раздела все должно стать кристально ясно :).

Redcode

Redcode использует ассемблерные команды, но не в привычном стиле Intel, а в синтаксисе AT&T:

<инструкция> <источник> <приемник>

А не наоборот, как привыкли любители tasm’а, masm’а и прочих ассемблеров с синтаксисом Intel’а. Первая команда, с которой мы познакомимся – MOV, так как с ее помощью уже можно написать простейшего бойца.

«MOV A, B» скопирует одну команду по адресу A, в место с адресом B. Отсчет ведется от текущей инструкции, т.е. «MOV -1, 1» скопирует команду, предшествующую MOV, на место команды, следующей после MOV. Если программа выглядит так:

Команда №1

MOV -1, 1

Команда №2

то после выполнения команды «MOV -1, 1», она примет вид:

Команда №1

MOV -1, 1

Команда №1

Просто, не так ли? Теперь мы может написать нашего первого воина. Его код состоит всего из одной строчки:

MOV 0, 1

Эта единственная команда копирует саму себя на место следующей команды:

Первый цикл:

MOV 0, 1 ; сейчас pMARS выполнит эту команду

Второй цикл:

MOV 0, 1

MOV 0, 1 ; сейчас pMARS выполнит эту команду

Третий цикл:

MOV 0, 1

MOV 0, 1

MOV 0, 1 ; сейчас pMARS выполнит эту команду

В дальнейшем слова «сейчас pMARS выполнит эту команду» мы будем заменять стрелкой «<---». Края поля боя замкнуты, т.е. после адреса 7999 снова идет 0, поэтому, приведенная выше программа, заполнив поле целиком, начнет следующий круг, и будет заполнять поле инструкциями «MOV 0, 1» до бесконечности. Это один из классических бойцов, и имя ему – Imp. Если принцип его работы на словах звучит не очень понятно, проведя в pMARS’е несколько схваток, ты точно во всем разберешься. Если сейчас мы стравим на поле боя двух Импов, симулятор провозгласит ничью: так как оба Импа имеют одинаковую скорость, они просто будут бесконечно «гоняться» друг за другом. Поэтому для испытаний нам потребуется другой боец.

Назад на стр. 035-054-1  Содержание  Вперед на стр. 035-054-3