Вступление
В этой игре игроки используют свои армии, чтобы сражаться с армиями других игроков, захватывать территории и становиться последним человеком, стоящим на ногах. Каждый ход игроки получают базовое количество армий для использования в их распоряжении. Однако, захватив территории в определенных регионах, игроки могут увеличить это число, чтобы дать им потенциальное преимущество в дальнейшем в игре. (Это по сути то же самое, что и Warlight ).
Все боты должны быть написаны на Java, C или C ++ (я бы включил другие языки, но у меня нет программного обеспечения или опыта для них). Для вашего представления необязательно расширять класс, и вы можете создавать функции, классы, интерфейсы или все, что необходимо, и использовать любой пакет или класс в стандартных API . Если вы планируете создать класс или интерфейс, рассмотрите возможность использования внутреннего класса или внутреннего интерфейса.
Пожалуйста, не пытайтесь программно изменить контроллер или другие материалы в этом конкурсе.
Игровой процесс
обзор
Двумерный массив 10х10 будет имитировать доску, каждый элемент / ячейка которой представляют «территорию». Будет 20 раундов и до 1000 ходов за раунд. Каждый ход игроки сначала размещают свои армии на любой из принадлежащих им территорий, а затем получают возможность транспортировать свои армии на соседние территории, пытаясь захватить территории своих противников, атакуя армии в них. Игроки должны развернуть все свои армии, но они не должны перемещать их при желании.
Атакующие / Передающие армии
Если игрок желает, он может отправить армии с одной территории на любую из восьми соседних. Доска «переворачивается», т. Е. Если территория игрока находится на одной стороне, армии с нее могут быть перенесены на соседнюю территорию на другой стороне. При перемещении армий с территории на этой территории должна оставаться как минимум одна армия. Например, если территория содержит пять армий, на другую территорию может быть перемещено не более четырех; если территория содержит один, эта армия не может двигаться.
Если игрок посылает n
армии с одной территории на другую, которой они владеют, эта территория получит n
армии.
Скажем, игрок отправляет n
войска со своей территории на противоположную территорию, где есть o
армии. o
уменьшится с n * .6
округлением до ближайшего целого числа; однако, в то же время, n
уменьшится с o * .7
округлением до ближайшего целого числа. Будут применяться следующие правила, касающиеся того, была ли захвачена противоборствующая территория:
- Если он
o
достигнет нуля иn
больше 0, игрок захватит территорию, на которой будут находитьсяn
армии. - Если оба
n
иo
станут равны нулю,o
автоматически будет установлено значение 1 и территория не будет захвачена. - Если
o
останется больше 0, количество армий на территории игрока увеличится,n
и территория противника не будет захвачена.
Бонусы
Группа территорий будет выбрана в качестве бонуса; если один игрок владеет всеми территориями, входящими в группу, этот игрок будет получать дополнительное количество армий за ход.
Бонусы имеют идентификационные номера для обозначения различных и значений, которые представляют дополнительное количество армий, которые игрок может получить. В каждом раунде значение бонуса будет случайным числом от 5 до 10 включительно, и на поле будет доступно десять бонусов, каждая из которых включает десять территорий, включенных в бонус.
Например, если игрок, который получает 5 армий за ход, владеет всеми территориями, составляющими бонус со значением 8, игрок получит 13 армий в следующем и последующих ходах. Однако, если игрок теряет одну или несколько территорий, составляющих бонус, он или она получит всего 5 армий за ход.
Ввод, вывод
Ваша программа должна принимать данные через аргументы командной строки, которые будут иметь следующий формат:
[id] [armies] [territories (yours and all adjacent ones)] [bonuses] ["X" (if first turn)]
id
иarmies
оба целых чисел.id
это ваш идентификатор иarmies
количество армий, которые вам нужно развернуть на ваших территориях. Вы должны развернуть все предоставленные вам армии - не больше и не меньше.territories
представляет собой последовательность строк, представляющих принадлежащие вам территории и территории, которые вам не принадлежат, которые примыкают к вашей. Строки в этом формате:[row],[col],[bonus id],[player id],[armies]
row
иcol
укажите строку и столбец доски, где находится территория,bonus id
это идентификатор бонуса, частью которогоplayer id
является эта территория, это идентификатор игрока, которому принадлежит эта территория, иarmies
количество армий, содержащихся на этой территории. Это все цифры.bonuses
это ряд строк, представляющих бонусы на доске, которыми вы можете воспользоваться. Строки в этом формате:[id],[armies],[territories left]
id
является идентификатором бонуса,armies
является количеством дополнительных армий, которые вы можете получить, владея всеми территориями в этом бонусе, иterritories left
является количеством территорий в бонусе, которые вам необходимо захватить, чтобы получить дополнительные армии.
Обратите внимание, что пятый аргумент, «X», появится, если это первый ход раунда, и его можно использовать по соображениям удобства.
Пример ввода на первом повороте:
0 5 "7,6,7,-1,2 8,7,7,-1,2 7,7,7,0,5 6,6,7,-1,2 8,8,9,-1,2 6,7,7,-1,2 7,8,9,-1,2 6,8,9,-1,2 8,6,7,-1,2" "0,5,10 1,5,10 2,9,10 3,9,10 4,9,10 5,5,10 6,5,10 7,6,9 8,7,10 9,7,10" X
Ваша программа должна вывести две строки, разделенные новой строкой, первая из которых содержит строки и столбцы территорий, к которым вы хотите добавить армии, и количество армий, которые вы хотите добавить к ней, а вторая из которых содержит строки и столбцы территорий, на которые вы хотите отправить армии, и количество армий, которые вы хотите отправить. Вывод может содержать завершающие пробелы.
Чтобы указать территорию, к которой вы хотите добавить армию, ваш вывод должен иметь следующий формат:
[row],[col],[armies]
row
а col
также строка и столбец доски, на которой находится территория, к которой вы хотите добавить армии, и armies
количество армий, которые вы хотите добавить на территорию.
Чтобы указать, на какие территории вы хотите отправить войска, ваш вывод должен иметь следующий формат:
[srow],[scol],[drow],[dcol],[armies]
srow
а scol
также строка и столбец доски, с которой находится территория, с которой вы хотите транспортировать войска, drow
а dcol
также строка и столбец доски, на которой находится территория, на которую вы хотите отправить армии, и armies
количество армий, которые вы хотите отправить. , Обратите внимание, что если вы не хотите перемещать армии, ваша программа должна напечатать пробел.
Пример вывода может быть таким:
0,0,5
0,0,0,1,3 0,0,1,0,3 0,0,1,1,3
В этом случае игрок развертывает пять армий на территорию в 0,0 и перемещает три армии от 0,0 до 0,1; три от 0,0 до 1,0; и три от 0,0 до 1,1.
Раунды и повороты
В начале каждого раунда всем игрокам будет предоставлена одна территория, расположенная в случайном месте на доске (два или более игрока могут начать игру рядом друг с другом). Территории, которые составляют бонус, также могут меняться.
В первый ход у каждого игрока будет одна территория, содержащая пять армий, и они получат пять армий, которые они могут использовать (это минимум, который они могут получить). Все остальные территории будут принадлежать NPC, которые не атакуют; каждая из них содержит две армии и имеет идентификатор -1
.
Каждый ход будет запускаться ваша программа, и будут собираться обе части выходных данных. Контроллер немедленно применяет первый выход, добавляя армии к территориям; однако, контроллер будет ждать, пока все игроки не дадут свой второй результат, свои команды атаки / передачи. Как только это будет выполнено, команды будут случайным образом перемешиваться и затем выполняться. Ваша программа должна обеспечить вывод и завершиться в течение одной секунды или меньше, чтобы участвовать в очереди.
Выигрыш и выигрыш
В любом раунде, если останется один игрок, этот игрок заработает 100 очков. В противном случае, если пройдет 1000 ходов, и все еще есть несколько игроков, 100 очков будут равномерно распределены между оставшимися игроками (т.е. 3 оставшихся игрока дают 33 очка каждый). Кто из игроков наберет наибольшее количество очков в конце 20 раундов, тот выиграет.
Материалы
Ваш пост должен содержать имя бота, язык, на котором он написан, краткое описание и код, используемый для его запуска. Пример бот будет размещен здесь в качестве примера и будет использоваться в конкурсе. Вы можете отправить столько, сколько пожелаете.
Другой
Ваша программа может создавать, записывать и читать из файла, если имя файла совпадает с именем, которое вы использовали для представления. Эти файлы будут удалены до начала турнира, но не между раундами.
Ваш ход будет пропущен, если:
- вы устранены (не имеете территорий);
- ваша программа ничего не печатает;
- ваша программа не заканчивается в течение одной секунды;
- вы размещаете слишком мало армий на своих территориях (развертывание армий на территориях, которые вам не принадлежат, будет учитываться при этом) или слишком много армий; или
- ваш вывод заставляет контроллер выдавать исключение.
Ваша команда атаки / передачи не будет выполнена, если:
- ваша программа не дает правильного вывода;
- вы выбираете территорию для перемещения армий, которые не принадлежат вам;
- вы перемещаете ноль или отрицательное количество армий со своей территории;
- вы перемещаете слишком много армий со своей территории; или
- Вы выбираете территорию для отправки армий, которая не прилегает к территории, с которой вы выбрали перемещение армий.
Вы можете найти контроллер и образец бота здесь . Бот будет участвовать в игре, но он, вероятно, не выиграет ни одного раунда (если только ему не повезет).
Результаты
Запустив контроллер после исправления ошибки, WeSwarm продолжает считаться силой, с которой приходится считаться. Для того, чтобы иметь шанс противостоять этому, потребуется бот с отличной стратегией.
As of 25-08-15, 04:40 UTC
1: WeSwarm 1420
2: java Player 120
java LandGrab 120
java Hermit 120
java Castler 120
6: java RandomHalver 80
Обратите внимание!
Исправлена ошибка, обнаруженная Zsw, из-за которой территории, развернувшие свои армии после других, имели потенциальное преимущество в игре. Редактирование было перенесено в контроллер, поэтому, пожалуйста, используйте существующую версию, найденную по ссылке выше.