Это испытание «Король горы» в круговой игре. Это битва, чтобы найти лучшего боевика на западе!
Чтобы участвовать в этом конкурсе, вам нужно выполнить две функции. Первый устанавливает атрибуты вашего стрелка, а второй - это основная логическая функция для стрелка.
Функция атрибута
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
Функция атрибута включает в себя 5 переменных, которые вам нужно будет установить в соответствии с некоторыми правилами (за исключением того, name
что это может быть любая строка). Вы должны потратить в общей сложности 15 баллов на своего стрелка - боевики, которые не потратят все 15 баллов, не имеют права. Вот как работают атрибуты:
numbOfBullets
- определяет, сколько пуль держит ваш пистолет.Начальное и минимальное значение
numbOfBullets
равно 1. Каждая дополнительная пуля стоит 1 балл, максимальная - 16 пуль при потраченных 15 баллах.reloadSpeed
- определяет, сколько оборотов ваш стрелок должен перезарядить, после того как у него кончились пули.Базовое и максимальное значение равно 4, при этом минимальное значение равно 1. Уменьшение этого атрибута на 1 стоит 2 балла.
shotsPerTurn
- определяет, сколько раз ваш стрелок может стрелять за один ход.Базовое и минимальное значение равно 1. Каждое увеличение на 1 стоит 3 очка, поэтому вы можете получить максимум 6 выстрелов за раунд при потраченных 15 очках. Повышение этого атрибута выше
numbOfBullets
контрпродуктивно, так как вы не можете стрелять больше, чем ваш пистолет.moveSpeed
- определяет, сколько пробелов ваш стрелок может пробежать за один ход.Базовое и минимальное значение равно 1. Каждое увеличение на 1 стоит 3 очка с максимальной скоростью 6 при потраченных 15 очках. Стрелок может бегать влево или вправо каждый ход до максимальной скорости своего движения. Он также может стоять на месте, что дает ему бонус (подробнее об этом позже).
В приведенном выше примере функция имеет 6 очков на пули, 6 очков на скорость перезарядки и 3 балла на движение.
Основная функция
function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
var move = yourMovement[yourMovement.length - 1] + 2
var play = [];
play.shots = shots;
play.move = move;
play.reload = false;
return play;
}
Параметры:
bulletsLeft
количество пуль осталось в вашем пистолетеyourShots
Это массив массивов всех прошлых позиций, по которым стрелял ваш боевик.Пример для боевика, который может выстрелить 1 пулей за раунд:
[[12],[4],[22],...]
Пример для стрелка, который может стрелять по 3 пули за раунд:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
- так же, как и выше, но для вашего врагаyourMovement
- массив всех ваших прошлых позиций движенияenemyMovement
так же, как и выше, но для вашего врага
Что нужно вернуть:
Вам необходимо вернуть переменную, которая имеет 3 атрибута:
shots
- массив чисел, которые определяют, в каком пространстве / с ваш стрелок будет стрелятьmove
- одно число, которое определяет, в какое пространство ваш боевик будет пытаться переместитьсяreload
- значение true / false, с помощью которого вы можете перезарядить своего стрелка
Дуэль
Соревнование проводится по системе круговой проверки 1 против 1. Каждый боевик имеет 50 раундов против любого другого боевика. Раунд длится до тех пор, пока кто-то не попадет в пулю, или пока не пройдет 66 ходов (ход, когда оба игрока стреляют).
Стрелок может заработать 2 очка, убивая своего противника, 1 очко, если они оба умрут в одном ходу, или 0 очков, если они достигнут предела в 66 ходов. Стрельбище имеет ширину 24 места (1-24 включительно). Чтобы ударить игрока и выиграть раунд, вам нужно стрелять в то же пространство, на котором он сейчас стоит.
Вот пошаговое руководство о том, как работает дуэль. Это также охватывает все недопустимые команды и специальные правила:
- В начале каждого поединка оба игрока помещаются в пространство 12, и их револьверы полностью загружены.
- Вызывается основная функция, и боевик делает команду первого хода и выбирает, куда он хочет стрелять.
- Сначала боевики переезжают на новое место. Если какой-либо неверный ввод был сделан по команде перемещения (позиции ниже 1 или выше 24 или они переместились на большее расстояние, чем им разрешено), они остаются на той же позиции.
- Следующая перезагрузка проверяется, если у вас кончились патроны на предыдущем ходу или вы вызвали перезарядку, ваш стрелок входит в цикл перезарядки. Он перезагружается столько раз, сколько вы устанавливаете свою
reloadSpeed
ценность. Если вы решили стоять на месте (возвращая то же число пробелов, что и на прежнем месте, либо просто возвращая недопустимое значение), то счетчик перезагрузки уменьшается на 2 оборота вместо одного. - Теперь приходит проверка ваших значений выстрела, каждый ход вы можете ввести столько мест для выстрела, сколько вам нужно, они всегда будут обрезаны до фактического действительного количества, которое определяется: количеством выстрелов за ход и количеством пуль в вашем револьвере ( что ниже). Ваша
shotsPerTurn
ценность увеличивается на 1, если вы решите остановиться в этом ходу, поэтому вы можете сделать дополнительный выстрел, если решите стоять на месте. Если вы находитесь в цикле перезагрузки, у вас есть 0 выстрелов. Теперь идет фактическая стрельба, есть 2 способа, которыми это может пойти вниз. Если оба боевика имеют одинаковую статистику скорости движения, то они оба стреляют одновременно и могут одновременно убивать друг друга. В случае, если у них разные характеристики скорости движения, бот с более высоким показателем скорости движения начинает стрелять первым, и если он убивает своего противника, он выигрывает в этом раунде. Если бандит может выстрелить одну или несколько пуль в один раунд, то он следует тем же правилам, что и выше, за исключением нескольких циклов в качестве примера: допустим, что у bot1 есть 3 пули и он быстрее, а у bot 2 2 пули, тогда он будет выглядеть следующим образом :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
Это выглядело бы одинаково, если бы у них была одинаковая скорость движения, только если бы теперь Bot1 ударил Bot2 в том же цикле, Bot2 мог бы также ударить Bot1, и это было бы ничьей.
ПРАВИЛА
Сначала я копирую некоторые правила из записи Calvin's Hobbies, которые также применяются здесь.
При объявлении новой переменной JavaScript вы должны использовать ключевое слово var. Это связано с тем, что переменная, объявленная без var, становится глобальной, а не локальной, поэтому было бы легко случайно (или намеренно) связываться с контроллером или свободно общаться с другими игроками. Должно быть ясно, что вы не пытаетесь обмануть.
При объявлении функций лучше всего также использовать ключевое слово var, т. Е. Использовать var f = function(...) {...}
вместо « function f(...) {...}.
Я не совсем уверен, почему», но иногда кажется, что это имеет значение.
В вашем коде вы не можете ...
- попытаться получить доступ или изменить контроллер или код другого игрока.
- попытаться изменить что-либо встроенное в JavaScript.
- делать веб-запросы.
- делать иначе злые вещи.
Мои дополнительные правила:
- Пользователи могут создавать столько боевиков, сколько они хотят, и изменять свои функции за любой период времени.
- Я удалю любую запись из игры, которая либо занимает слишком много времени, либо пытается обмануть любым способом, который я считаю нужным
- Имена атрибутов, которые должна возвращать ваша функция, должны быть такими же, как в примерах с той же структурой!
Ваш ответ должен быть в этом формате, первая функция - функция атрибута, а вторая - логическая функция. Обратите внимание, что я использовал восклицательный знак, потому что если вы просто создадите новые строки между блоками кода, то парсер не увидит два разных блока кода, поэтому вам придется использовать любой символ (просто используйте восклицательный знак) для их разделения:
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 2 > 1)
testBot_moveUp = false
shots.push(Math.floor((Math.random() * 24) + 1))
var move = 0
if (testBot_moveUp)
move = yourMovement[yourMovement.length - 1] + 2
else
move = yourMovement[yourMovement.length - 1] - 2
move = 12
var play = []
play.shots = shots
play.move = move
play.reload = false
return play
А вот и контроллер: КОНТРОЛЛЕР ИГРЫ . Просто откройте ссылку и дождитесь загрузки ботов, затем выберите того, кого вы хотите в бою (вероятно, всех), и нажмите кнопку запуска.
В качестве ответа я также добавляю тестового робота, который также служит примером того, как должна выглядеть структура ответа. Как примечание, если вы допустите небольшую ошибку и отредактируете свой ответ, алгоритм stackexchanges может не сразу его забрать, и сайт, который использует контроллер, созданный stackexchange, не обновится (но будет позже или если вы внесете более значительные изменения, которые я предлагаю делать, просто добавить текст в конце). Вот сайт: кодовая ссылка
<!---->
для разделения кодовых блоков "невидимо" (без !
).