Давайте играть Kick The Can!
Хотя Moogie является текущим победителем, если кто-то может взять его корону, он поощряется сделать это
Kick the can - это детская игра. Вовлечение одного защитника и нескольких нападающих. Сегодня это уже не такая игра! Ваша задача - написать бота, который в нее играет, чтобы победить в стиле « король горы» !
https://en.wikipedia.org/wiki/Kick_the_can
В этой игре есть несколько ключевых отличий. Первое ключевое отличие состоит в том, что игра многопользовательская (5 на 5). Второе ключевое отличие состоит в том, что оба набора ботов могут убивать и уничтожать вражеских игроков как минами, так и брошенными бомбами! Боты не могут видеть мины (независимо от расстояния) или игроков на расстоянии более пяти кварталов!
Карта лабиринта выглядит следующим образом.
Этот лабиринт процедурно генерируется путем первого создания лабиринта с использованием алгоритма обратного отслеживания глубины. И затем помещаем показанные отверстия в (а также делаем лабиринт более «несовершенным». Лабиринт имеет ширину 65x65 блоков и индексируется ноль. Таким образом, синий флаг (can) равен 1,1, а красный флаг (can) - в 63,63. Синяя команда появляется в 2,2 и 3,3 4,4 и т. д. красная команда появляется в 62,62 и 61,61, 60,60 и т. д. Блоки в циане - это боты в синей команде, и блоки пурпурного цвета - красные боты. В игре всегда пять против пяти. Каждый бот в команде будет использовать ваш код (но может хранить другие переменные экземпляра (или создавать локальные файлы), чтобы отслеживать состояние и различать роли.
Игровой процесс
Мины могут быть размещены, как вы можете видеть в сером. И бомбы могут быть брошены на максимальном расстоянии до четырех блоков. Они проходят до четырех блоков через стены, а другие игроки убивают только врагов, которые стоят на вашем пути. После каждого шага вероятность выпадения составляет 40%. Таким образом, у них есть 100% -й шанс на 1 диапазон 60% на 2 диапазоне 36% на 3 диапазоне и 21,6% на трех дистанциях. Установка мин или бросание бомбы требует боеприпасов одной команды. Это начинается в 0 и может быть увеличено, собирая оранжевые коробки. Обратите внимание, что четыре (4) из этих кэшей боеприпасов будут удобно центрированы. Боты выстроены в ряд из двух красных и двух синих. IE RRRRRBBBBB. Разрешается скрывать флаг, но имейте в виду, что нахождение рядом с флагом (т. Е. Менее пяти блоков) приводит к замедлению и допускает только движение. каждые три оборота. Арена выбирает случайный стартер для каждого хода. Я.
Задача
Запрограммируйте своих пяти ботов (каждый из которых имеет один и тот же файл класса), чтобы успешно перемещаться по лабиринту и касаться противостоящей банки, при этом соблюдая осторожность, чтобы случайно не опрокинуть собственную банку или не наступить на мину.
программирование
Записи арены и бота в настоящее время написаны на Java, но для других языков существует оболочка stdin / out.
Код арены будет доступен, но здесь есть соответствующие детали.
Бот класс
public class YourUniqueBotName extends Bot{
public YourUniqueBotName(int x , int y, int team){
super(x,y,team);
//optional code
}
public Move move(){//todo implement this method
//it should output a Move();
//A move has two paramaters
//direction is from 0 - 3 as such
// 3
// 2-I-0
// 1
// a direction of 4 or higher means a no-op (i.e stay still)
//And a MoveType. This movetype can be
//MoveType.Throw
//MoveType.Mine
//MoveType.Defuse defuse any mine present in the direction given
//MoveType.Move
}
}
Ключевые методы доступны
Обратите внимание, что использование любых методов для изменения или доступа к данным, к которым у вас, как правило, нет доступа, не допускается и приведет к дисквалификации.
Arena.getAmmo()[team];//returns the shared ammo cache of your team
Arena.getMap();//returns an integer[] representing the map. Be careful since all enemies more than 5 blocks away (straight line distance) and all mines are replaced with constant for spaces
//constants for each block type are provided such as Bot.space Bot.wall Bot.mine Bot.redTeam Bot.blueTeam Bot.redFlag Bot.blueFlag
Arena.getAliveBots();//returns the number of bots left
getX();//returns a zero indexed x coordinate you may directly look at (but not change X)
getY();//returns a zero indexed y coordinate (y would work to, but do not change y's value)
//Although some state variables are public please do not cheat by accessing modifying these
Спецификация интерфейса оболочки StdIn / Out
Интерфейс состоит из двух режимов: инициализация и запуск.
В режиме инициализации один кадр INIT отправляется через стандартный вывод. Спецификация этого фрейма следующая:
INIT
{Team Membership Id}
{Game Map}
TINI
Где: {Team Membership Id} - это один символ: R или B. B означает синюю команду, R означает красную команду.
{Game Map} - это ряд строк символов ascii, представляющих одну строку карты. Допустимы следующие символы ascii: F = синий флаг G = красный флаг O = открытое пространство W = стена
Затем игра продолжит отправку игровых фреймов через стандартный поток каждому боту следующим образом:
FRAME
{Ammo}
{Alive Bot Count}
{Bot X},{Bot Y}
{Local Map}
EMARF
Куда:
{Ammo} - это строка цифр, значение будет 0 или больше {Alive Bot Count} - это строка цифр, значение будет 0 или больше {Box X} - это строка цифр, представляющая координату X бота на игровой карте. Значение будет 0 <= X <Ширина карты. {Box Y} - это строка цифр, обозначающая координату Y бота на игровой карте. Значение будет 0 <= Y <Высота карты. {Local Map} - это ряд строк символов ascii, представляющих всю карту, окружающую бота. Допустимы следующие символы ascii: F = синий флаг G = красный флаг O = открытое пространство W = стена R = красный командный бот B = синий командный бот M = мой A = патроны
Контроллер ожидает, что ваш бот выведет (на стандартный вывод) однострочный ответ в формате:
{Action},{Direction}
Куда:
{Action} является одним из: Move Defuse Mine Throw
{Направление} представляет собой одну цифру от 0 до 4 включительно. (см. информацию о направлении ранее)
ПРИМЕЧАНИЕ: все строки будут разделены символом \ n Конец строки.Это будет отборочный турнир. Мои примерные боты будут участвовать в качестве наполнителей, но я не буду награждать себя победой. В случае победы одного из моих ботов, титул переходит к участнику, занявшему второе место, и будет продолжаться до тех пор, пока не появится бот, не принадлежащий мне. Каждый матч состоит из 11 раундов. Если к тому времени ни одна из команд не выиграла ни одного матча, они оба выбывают. Если есть ничья с ненулевым счетом, будет сыграно одно состязание. Если связь остается, оба устраняются. Более поздние раунды могут состоять из большего количества матчей. Заполнение турнира будет основано на количестве голосов, поданных по состоянию на 31.07.16 (дата может быть изменена).
Каждый матч длится 4096 ходов. Победа дает одно очко. Галстук или проигрыш дают ноль очков. Удачи!
Не стесняйтесь смотреть на код или критиковать его на этом GitHub Repo.
https://github.com/rjhunjhunwala/BotCTF/blob/master/src/botctf/Arena.java
Обратите внимание, что на моем компьютере нет переводчиков для слишком многих языков, и мне могут понадобиться добровольцы для запуска симуляции на своем компьютере. Или я могу скачать переводчик языка. Пожалуйста, убедитесь, что ваши боты.
- Ответьте за разумное количество времени (скажем, 250 мс)
- Не повредит мой компьютер