Це виклик короля пагорба у круглої робіни. Це битва, щоб знайти найкращого збройовика заходу!
Щоб мати можливість змагатися в цьому конкурсі, вам потрібно зробити дві функції. Перший встановлює атрибути вашого збройовика, а другий - головну логічну функцію для збройовика.
Функція атрибутів
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
- справжнє / хибне значення, за допомогою якого ви можете змусити перезавантажувати свою зброю
Поєдинок
Змагання слідкують за системою круглої форми 1 проти 1. Кожен бойовик має 50 патронів проти кожного іншого зброяря. Раунд триває до тих пір, поки когось не вдарить куля або поки не пройде 66 оборотів (поворот - це коли обидва гравці вистрілили).
Навідник може заробити 2 очки, вбивши свого опонента, 1 бал, якщо вони обоє загинуть за один і той же поворот, або 0 балів, якщо вони досягнуть межі 66 оборотів. Ширина поля для зйомки - 24 простори (1-24 включно). Щоб вдарити гравця і виграти раунд, вам потрібно стріляти в тому ж просторі, на якому він зараз стоїть.
Ось покрокове керівництво про те, як працює поєдинок. Це стосується також усіх недійсних команд та спеціальних правил:
- На початку кожного поєдинку обидва гравці ставлять на пробіл 12, а їх револьвери повністю завантажені
- Викликається головна функція, і бойовик робить свою першу команду переміщення і вибирає, куди хоче стріляти
- Спочатку бойовики переїжджають на своє нове місце. Якщо будь-який недійсний ввід зроблено в команді переміщення (позиції нижче 1 або вище 24 або вони перемістили більше пробілів, то їм також дозволено) вони залишаються в тому ж самому положенні.
- Наступне перезавантаження перевіряється, якщо у попереднього ходу у вас закінчилися кулі або ви назвали перезавантаження, ваш бойовик переходить у цикл перезавантаження. Він перезаряджається стільки ж оборотів, скільки ви встановлюєте своє
reloadSpeed
значення. Якщо ви вирішили стояти нерухомо (повертаючи те саме ціле пробіл, що і ви, коли стоїте перед або просто повертаєте недійсне значення), то лічильник перезарядження знижується на 2 витки замість одного. - Тепер приходить перевірка ваших значень для стрілянини, кожен виток ви можете вводити стільки місць зйомки, скільки вам подобається, вони завжди будуть відрізані до фактичної дійсної суми, яка визначається: Кількістю пострілів за оборот та кількістю куль у вашому револьвері ( що нижче). Ваша
shotsPerTurn
цінність збільшується на 1, якщо ви вирішите стояти на цьому рубежі, тому ви можете зробити додатковий знімок, якщо вирішите стояти на місці. Якщо ви перебуваєте в циклі перезавантаження, у вас є 0 пострілів. Тепер іде фактична зйомка, є два способи, як це може знизитися. Якщо обоє збройовика мають однакову ходу швидкості, то вони обидва стріляють одночасно і можуть одночасно вбивати один одного. У випадку, якщо вони мають різний хід швидкості, статистика бота з вищим станом рухається швидкістю, починає стріляти першим, і якщо він вбиває опонента, він виграє цей раунд. Якщо бойовик може вистрілити одну або декілька куль в один раунд, то він дотримується тих же правил, що і вище, за винятком кількох циклів, як приклад: Скажімо, що bot1 має 3 кулі і швидше, а бот 2 має 2 кулі, то це піде так :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
Це виглядало б так само, якби вони мали однакові ходи, тільки коли б Bot1 потрапив у Bot2 в тому ж циклі, Bot2 також міг би потрапити до Bot1, і це було б зв'язано.
ПРАВИЛА
Спочатку я копіюю деякі правила із запису Хобі Кальвіна, які також застосовуються тут.
При оголошенні нової змінної 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, не буде оновлений (але пізніше або якщо ви внесете більші зміни, які я пропоную робити, просто додайте текст наприкінці). Ось сайт: codelink
<!---->
для розділення блоків коду "невидимо" (без цього !
).