В этом испытании вы должны создать вид одноклеточных организмов, чтобы сражаться до смерти на арене чашки Петри. Арена представлена в виде прямоугольной сетки, где каждая клетка занимает одно пространство:
.....x....
...x...o..
...x.c..o.
.......o..
Атрибуты
Каждая клетка имеет три атрибута. При указании вида клеток в начале игры вы выделяете 12 баллов среди этих атрибутов.
- Очки здоровья (HP): если HP клетки падает до нуля, она умирает. Новые клетки имеют полный HP.
- Когда клетка умирает, она оставляет труп, который другие клетки могут съесть для получения энергии.
- Ячейка не может восстановить потерянное HP, но она может создать новую ячейку с полным HP путем деления.
- Энергия : большинство действий, которые клетка может предпринять, требуют энергии. Активно отдыхая, клетка может восстановить потерянную энергию до максимума своего вида.
- Вид клетки с энергией менее 5, скорее всего, потерпит неудачу, потому что он не может делиться, чтобы создать новые клетки.
- Клетка не может восстановить энергию сверх максимальной ценности своего вида.
- Вновь созданная ячейка имеет начальное значение энергии, скопированное из ее родителя (и максимальное значение, определяемое спецификацией вида).
- Кислотность : если ячейка взорвалась, уровень кислотности ячейки используется при расчете ущерба соседним ячейкам.
действия
Каждый ход, каждая клетка может выполнять одно действие:
Перемещение: клетка перемещается на одну клетку в любом направлении (N / S / E / W / NE / NW / SE / SW) за 1 энергию.
- Клетка не может перейти в пространство, занимаемое другой живой клеткой.
- Ячейка не может сдвинуться с сетки.
- Переход на клеточный труп уничтожает труп.
Атака: клетка атакует соседнюю клетку, нанося от 1 до 3 урона, затрачивая от 1 до 3 единиц энергии.
- Ячейка может атаковать в любом направлении (N / S / E / W / NE / NW / SE / SW).
- Законно нападать на дружественные ячейки.
Разделить: ячейка делится и создает новую ячейку в соседнем пространстве, затратив 5 энергии.
- Ячейка может делиться в любом направлении (N / S / E / W / NE / NW / SE / SW).
- Новая ячейка имеет полный HP согласно вашей оригинальной спецификации ячейки.
- Новая ячейка имеет столько же энергии, сколько ее родительская ячейка после вычитания стоимости деления. (Например, родительская ячейка с начальными 8 энергетическими точками будет уменьшена до 3 энергии и произведет дочернюю ячейку с 3 энергиями).
- Новая клетка не может действовать до вашего следующего хода.
- Клетка не может делиться на пространство, занимаемое живой клеткой, но она может делиться на пространство, занимаемое трупом мертвой клетки (это уничтожает труп).
Ешьте: клетка съедает труп соседней клетки, получая 4 энергии.
- Клетка может питаться в любом направлении (N / S / E / W / NE / NW / SE / SW).
Отдых: клетка ничего не делает за один ход, восстанавливая 2 энергии.
Взрыв: Когда ячейка имеет 3 или меньше HP и больше энергии, чем HP, она может взорваться, нанося урон всем восьми соседним клеткам.
- Повреждение каждой соседней клетки
(exploding cell HP) + (explodng cell acidity)
- Взорванная клетка умирает и оставляет труп, как и любые клетки, погибшие при взрыве.
- Повреждение каждой соседней клетки
протокол
Настроить
Ваша программа будет работать со строкой, указанной BEGIN
в stdin. Ваша программа должна записать в стандартный вывод , разделенных пробелами список 3 неотрицательных целых чисел, представляющих HP, энергию и кислотность для вашего вида клеток: например, 5 6 1
. Числа должны быть до 12. Кислотность может быть 0
, если хотите. (Другие атрибуты также могут быть нулевыми, но при этом функционально проигрывает игру!)
Вы начинаете с одной клетки, в северо-западном или юго-восточном углу, в одном месте от любого края. Начальная клетка имеет полное здоровье и энергию.
Каждая клетка действует
Каждый ход ваша программа будет вызываться один раз для каждой ячейки в вашей команде (кроме ячеек, только что созданных в этот ход), чтобы эта ячейка могла действовать. Ваша программа снабжена данными о stdin, которые включают состояние чашки Петри и информацию об этой конкретной ячейке:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
Первые два числа указывают ширину и высоту арены: здесь есть арена 10 на 4.
- Эти
o
клетки являются вашими; чтоx
клетки ваши враги. (Это всегда так; каждый игрок всегда видит свои клетки какo
.) - В
.
пространствах пусто. - В
c
пространствах представляют собой съедобные трупы клеток.
Числа после пустой строки представляют информацию об этой ячейке:
- Первые два числа являются
x,y
координатами, проиндексированными0,0
в верхнем левом углу (так что6 3
здесь относится к самой южнойo
ячейке). - Третье число - HP клетки; четвертое число - энергия клетки.
Ваша программа должна вывести (на стандартный вывод) действие. В приведенных ниже примерах мы будем использовать N
в качестве примера направление, но это может быть любое направление, допустимое для этого действия ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ SW
). Вся программа выводится без учета регистра, но в примерах будет использоваться верхний регистр. Любое выходное действие, которое является недопустимым (либо потому, что оно имеет недопустимый синтаксис, либо пытается выполнить недопустимое действие), игнорируется и приводит к ячейке REST
(и, таким образом, получает 2 энергии).
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- число представляет силу атаки (1 - 3)REST
EXPLODE
Ход вашей команды состоит из того, что всем вашим клеткам предоставляется возможность действовать один за другим. Все ваши клетки действуют до того, как действуют какие-либо клетки противника. Как только все ваши клетки сработают, ваш ход заканчивается, и начинается ход вашего оппонента. Как только все клетки вашего оппонента начнут действовать, ваш ход начинается снова. В течение вашего хода каждой ячейке предоставляется приоритет в зависимости от ее возраста: самые старые ячейки в вашей команде действуют в первую очередь перед более молодыми.
пример
Вот как может вести себя программа. Ввод от stdin обозначается здесь ведущими >
стрелками (отделенными от фактического ввода поясняющим пробелом), а вывод на stdout имеет <
стрелки.
> BEGIN
< 5 6 1
Затем программа вызывается снова:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
После хода вашего оппонента (который решил DIVIDE W
с одной стартовой ячейкой) ваша программа вызывается дважды, один раз для каждой ячейки:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
Для второго вызова на вашем ходу:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
Обратите внимание, что эта вторая ячейка видит обновленное состояние доски на основе движения другой ячейки ранее в ваш ход. Также обратите внимание, что эта ячейка была создана с 1 энергией, потому что родительская ячейка имела 6 энергий, когда она выполняла деление в последний ход (таким образом, первоначальные 6, за вычетом затрат на 5 энергий деления, создали дочернюю ячейку с 1 энергией).
Теперь ваш ход окончен и начинается ход вашего противника. Две противоположные ячейки получат возможность действовать, и тогда начнется ваш следующий ход.
победа
Вы можете выиграть одним из следующих способов:
- Уничтожение всех противостоящих клеток, или
- Наличие большего количества клеток, чем у вашего противника после того, как каждый игрок завершил 150 ходов
Подсчет очков будет зависеть от количества побед в 100 играх друг против друга. В половине симуляций ваша программа будет запущена первой.
Связные игры (то есть одинаковое количество клеток после 150 ходов или единственные оставшиеся клетки погибают вместе в результате взрыва) не учитываются при подсчете побед ни одного из игроков.
Дополнительная информация
- Ваша программа не должна пытаться поддерживать состояние (помимо использования состояния чашки Петри): одноклеточные организмы не имеют очень хорошей памяти и реагируют на мир мгновенно за мгновением. В частности, запись в файл (или другое хранилище данных), связь с удаленным сервером или установка переменных среды явно запрещены.
- Материалы будут запускаться / компилироваться в Ubuntu 12.04.4.
- Специфика 100 выигрышных игр еще не подтверждена, но они, вероятно, будут включать несколько размеров арены (например, 50 трасс на маленькой арене и 50 трасс на большей арене). Для более крупной арены я могу увеличить максимальное число ходов, чтобы обеспечить правильное сражение.
Ресурсы
Вот код драйвера, который запускает симуляцию, написанную для Node.js и вызываемую node petri.js 'first program' 'second program'
. Например, сопоставление написанной на Python ячейки с написанной на Java ячейкой может выглядеть следующим образом node petri.js 'python some_cell.py' 'java SomeCellClass'
.
Кроме того, я понимаю, что чтение и синтаксический анализ нескольких строк в stdin может быть огромной болью, поэтому я подготовил несколько полных примерных ячеек на разных языках, на которых вы можете свободно строить, полностью пересматривать или полностью игнорировать.
- Клетка Java
- Ячейка питона
- Ячейка JavaScript (для использования с Node.js)
Конечно, вы можете написать ячейку на другом языке; Это просто три языка, для которых я решил написать стандартный код для экономии времени.
Если у вас есть какие-либо проблемы с запуском драйвера, не стесняйтесь пинговать меня в чате, который я создал для этой задачи . Если у вас недостаточно репутации для чата, просто оставьте комментарий.
'node c:/cell/cell_template.js'
для каждого аргумента, точно так же, как вам нужно указать'java CellTemplate'
для кода Java. Я сделаю это более ясным в тексте задачи. Если у вас все еще возникли проблемы, мы (и все остальные, у кого есть технические проблемы) можем продолжить это обсуждение в чате, который я только что создал .