Турнир программ "Легионеры": Руководство участника


Что к чему?

Турнир программ даёт Вам возможность посоревноваться в несколько иных навыках, нежели требуются для классических олимпиад по программированию. В этот раз вы побудете в роли стратега-завоевателя. А если быть более точным, то в роли создателя алгоритма работы стратега-завоевателя. В вашем распоряжении легионы войск и целый незавоёванный континент, ждущий ваших побед. Дерзайте!

Наши и Ваши планы

Этап обсуждения и планирования

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

Во время этого этапа вы можете обсуждать алгоритм, устройство Вашей программы и правила игры с кем угодно — со своей командой, со своими тренерами, с другими командами и другими тренерами и вообще со всеми, кто не будет этому сопротивляться. :-)

Этап кодирования

В конце этапа обсуждения и планирования вы будете допущены в компьютерные классы, в которых будет установлено необходимое программное обеспечение для создания Вашей программы-участника. Это и будет начало этапа кодирования.

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

Ваша задача — разработать, протестировать и отправить жюри вашу программу-участника.

Турнир

Итак, Ваша команда должна будет отправить жюри готовую программу-участника. Если Ваша команда отправит её несколько раз, то в турнире будет участвовать последняя отправленная версия.

После окончания этапа кодирования, в указанное в расписании чемпионата время, будет проводиться собственно сам турнир программ. Все желающие смогут следить за ходом турнира, а участники — ещё и болеть за свои программы!

Правила игры

Игровой мир представляет собой квадратное поле n x n клеток-провинций. На поле есть две провинции-города (по одной на каждого игрока). В нашем турнире, это всегда будут провинции с координатами (0, 0) и (n-1, n-1)

Игроки ходят по очереди. В начале хода в городе игрока появляется 5 легионов.

Легион может пройти по захваченной дружественными легионами территории и попытаться захватить любую провинцию.

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

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

Размещать по два легиона в провинции нельзя — умрут с голода. Посылать атаковать соседние провинции больше легионов, чем нужно, тоже ни к чему, а если послать меньше, чем нужно, например два легиона против ветеранов, то атакующие бесславно погибнут, а защитники к следующему ходу залечат свои раны, восстановят прежние силы, да еще и станут ветеранами (если ими не были).

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

Провинцию-город охраняет один легион новичков. Как только одна из провинций-городов захвачена легионерами противника, игра заканчивается досрочно.

Один ход — это передвижение одним из игроков пяти своих вновь собранных легионов. Игра продолжается n x n ходов (или меньше, в случае досрочного окончания). В конце игры подсчитываются очки:

Пример игры

Ниже приведён пример игры на поле размером 7 клеток, начиная со второго хода. Крестиками и ноликами изображаются легионы-новички, а квадратами и кружками, соответственно, легионы-ветераны. Как видно, в примере после 13 хода побеждают крестики.

ход 2, счёт 5: 5
Ход 2
ход 3, счёт 10: 4
Ход 3
ход 4, счёт 7: 8
Ход 4
ход 5, счёт 12: 7
Ход 5
ход 6, счёт 10: 12
Ход 6
ход 7, счёт 14: 10
Ход 7
ход 8, счёт 11: 14
Ход 8
ход 9, счёт 16: 12
Ход 9
ход 10, счёт 14: 17
Ход 10
ход 11, счёт 18: 14
Ход 11
ход 12, счёт 15: 18
Ход 12
ход 13, счёт 98: 0
Ход 13

Правила проведения турнира

Турнир будет проводиться в два этапа.

На первом, отборочном этапе все игроки разделяются на 2k групп, и в каждой группе проводится турнир по схеме каждый с каждым. По результатам, в каждой группе определяется лидер, который проходит на второй этап. Определение лидера происходит по следующему алгоритму: У каждого игрока подсчитывается сумма очков, заработанных за все проведённые игры. Игрок, набравший сумму, большую, чем остальные считается лидером. Если есть несколько претендентов на лидерство с одинаковой суммой очков, то преимущество у того, чья программа раньше других была передана жюри.

Второй этап проводится по системе "игра до двух поражений" (double-elimination tournament также известный как "двойной нокаут"). В такой схеме каждый игрок имеет возможность проиграть одну игру (кроме финала), не потеряв шанса стать победителем. Но после того как игрок проиграет вторую игру, он покидает турнир.

Создание программы-участника

Для создания программы-участника можно использовать любой доступный на основном соревновании язык программирования и любую доступную среду программирования:

Программа-игрок представляет собой исходный код программы, принимающей на вход текущее описание игрового поля, а на выход выдаёт описание очередного хода.

На сетевом диске X:\Legions\samples доступны примеры программ-игроков, на всех доступных языках программирования с уже реализованными подпрограммами ввода и вывода данных. Их можно (и нужно!) использовать в качестве отправной точки при разработке собственного игрока.

Формат ввода

Весь ввод-вывод осуществляется через консоль без использования дополнительных файлов. На вход программе-участику поступают следующие данные:

В первой строке — номер игрока, за которого играет программа (0 или 1). Во второй строке — число n — размер игрового мира (во время турнира n = 17). В третьей и четвёртой строках находятся под одной паре чисел, являющихся координатами городов нулевого и первого игроков, соответственно.

В следующих n строках находится описание карты — по одной строке на каждую строку карты. Каждая строка состоит из n описаний ячеек, разделённых знаком табуляции. Описание ячейки состоит либо из одного символа ".", если соответствующая клетка карты пуста, либо из двух символов c1 и c2, записанных подряд, если клетка занята легионерами. В последнем случае, c1 — может быть либо латинской буквой N (или n) в случае, если клетка занята новичками, либо латинской буквой V (или v), если клетка занята ветеранами. Верхний регистр означает, что клетка соединена дружескими провинциями с городом. Нижний регистр означает обратное. Символ c2 является цифрой, обозначающей номер игрока, чьи легионы занимают клетку.

Система координат задана следующим образом:

Формат вывода

В случае если на вход не было подано никаких данных, программа должна вывести своё имя - одну строку, не более 16 символов длиной.

В противном случае, на выходе программа-участник должна выдать описание своего хода в нескольких строках.

Каждая строка представляет собой одну команду легионам и должна состоять из трёх чисел, разделённых пробелами: X, Y, C — координаты провинции и количество легионов, направленных в указанную провинцию. 0 ≤ X, Yn. Суммарное количество направленных куда-либо легионов не должно превосходить 5. Указанные программой команды будут выполняться последовательно.

Примеры ввода-вывода

Ниже иллюстрируется ввод-вывод на примере 6-ого хода игры из раздела "Пример игры" (см выше).

Пример ввода:

1
7
0 0
6 6
N0	N0	.	.	.	.	.
.	N0	.	.	.	.	.
.	N0	.	.	.	.	.
.	N0	N0	N0	v1	.	.
.	.	N0	.	v1	.	.
.	.	N0	N0	V0	.	.
.	.	.	.	N1	N1	N1

Пример вывода:

3 6 1
3 5 2
2 5 2

Тестирование и отладка

В течение всего этапа кодирования у вас будет возможность протестировать и отладить свою программу. На сетевом диске в директории X:\Legions\bin будет находиться программа "Полигон", предназначенная для тестирования создаваемого вами игрока. Полигон запускается файлом polygon.bat и предоставляет простой и понятный интерфейс, для проведения игр между программами игроками.

Внимание! Перед использованием необходимо скопировать всё содержимое директории X:\Legions\bin на свой локальный диск.

В поддиректории X:\Legions\players находятся несколько простых программ-игроков, при помощи которых вы можете тестировать вашу собственную программу.

В процессе отладки своей программы вы можете воспользоваться отладочным выводом. Для этого в программе достаточно писать текст на стандартное устройство вывода ошибок (stderr в С++, ErrOutput в Delphi, System.Console.Error в C#). Весь текст, выведенный на это устройство, будет показан в Полигоне в специальном окне отладочного лога.

Отправка программы-игрока

В конце этапа кодирования Вы должны будете отправить свою программу-игрока жюри. Для этого нужно использовать штатное программное обеспечение соревнования.

Возможные проблемы и чего стоит избегать

При написании программы-игрока запрещено: