|

Игры настоящих кодеров
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
|