Цей виклик був натхненний відмінним викликом @HelkaHomba Red vs. Blue - Pixel Team Battlebots . Цей виклик був, мабуть, найкращим, що я бачив на цьому сайті. Колись.
Моя проблема все ще сильно відрізняється, але @HelkaHomba заслуговує на заслугу натхнення.
Огляд
Це королівська команда, де ваша команда перемагає, маючи у вашій команді всіх живих. Іншими словами, остання команда виграє. Малюнки будуть повторно виконані.
Ви на дошці. Ви знаєте свою позицію в першому раунді (позначте 0). Ви також знаєте, хто в районі навколо вас:
У цьому випадку ви всі наодинці (або так ви думаєте) ні з ким навколо себе. Ви можете бачити навколишні елементи в першому аргументі вашому ontick
оброблювачу. Більше про API пізніше.
Ваша команда
Ваша команда визначається вашим ідентифікатором користувача. Щоб дізнатися це, натисніть на зображення профілю:
Потім знайдіть свій ідентифікатор користувача в адресному рядку:
Якщо це не дивно, ви в команді синіх.
Якщо це навіть, ви в червоній команді.
Запрошуємо до мальованих кіл.
Ваше (ботове) ім'я
Ім'я вашого бота починається з першої літери вашої команди ("r" або "b"). Він повинен відповідати регулярному вираженню /^(r|b)[A-Za-z_-]$/
. Крім цього, ви можете вибрати ім’я вашого бота. Будь ласка, не використовуйте вже існуючий.
Починаючи
Червоні гравці почнуться біля верхньої частини карти, а сині - біля нижньої. Вам надається спеціальна інформація про перший галочку ( environment
параметр ) параметра для ontick
функції. Я рекомендую зберігати це. Докладніше див. API.
На черзі
Порядок чергування спочатку рандомізований, але потім залишається таким же.
Повороту дій
Ви можете робити лише одну дію за оборот.
Рухатися
Коли ви хочете переїхати, ви телефонуєте
this.move(num)
в API.num
це клітинка, в яку ви хочете перейти:Відносні місця розташування чисел, на які можна перемістити, зберігаються в глобальній константі
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
Якщо ви переходите до стіни чи іншого гравця, нічого не відбувається.
Обертати
Для обертання ви дзвоните
this.rotate(num)
. Число - це напрямок, який потрібно обертати:Обертання абсолютне.
Вбити
Якщо інший гравець (від іншої команди) знаходиться у комірці, перед якою ви стикаєтесь, ви можете зателефонувати
this.kill()
та вбити їх. Якщо там нікого немає, або вони у вашій команді, це нічого не робить. Приклад:Якщо до вас звернуться
0
, ви можете вбити зеленого. Якщо вам повернуто 1, ви можете вбити синього. Якщо вам повернуть 2, ви можете вбити помаранчевий. Якщо вам повернуто 3, ви можете вбити жовтого.Бомба
Бомбардування вбиває всіх гравців, включаючи вас та товаришів по команді на 9 квадратах навколо вас. Приклад:
Чому б вам хотілося це робити? Камікадзе . Якщо в 9-ти осередках навколо вас більше гравців, які не перебувають у вашій команді, знаходяться у вашій команді, ви можете розглянути можливість бомбардування. (Я пропоную спочатку сповістити своїх товаришів!)
Помістіть міну
Це створює площу смерті для інших, хто не є у вашій команді. Розміщуючи мінну землю, ви також рухаєтесь, щоб не наступати на неї. Ви називаєте,
this.landMine(num)
де num - це квадрат, на який ви хочете піти. Приклад:Тоді ви телефонуєте
this.landMine(4)
:Бачите, що "М"? Це міна. Інші можуть це бачити ... поки що. Будь-хто, навіть той, хто не є у вашій команді, може побачити міну на галочці, яку вона розмістила. Але після цього галочка закінчилася, ніхто, навіть ви її не можете побачити. Але воно вибухне, як тільки ворог перейде над ним. Приклад:
Синій рушив на вашу міну, і БУМ! Ви щойно отримали ще одне вбивство.
За кожні 2 вбивства, які ви отримуєте (від прямого вбивства або мін), ви отримуєте 1 додаткову міну. Ви також отримуєте його на старті.
Копати
Коли копаєте, ви шукаєте мін у зоні 5х5, зосередженій навколо вас. Це не показує команди бота, яка розмістила міну. (Пам'ятайте, що вас не може вбити міна, розміщена кимось у вашій команді.) Наприклад, якщо це була сітка навколо вас:
Тоді повернене значення
this.dig()
буде:
[undefined,undefined,undefined,true,undefined,
undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,true,undefined,undefined,
true,undefined,undefined,undefined,undefined]
Індекси масиву починаються вгорі ліворуч, рухаючись праворуч, ніж вниз, не враховуючи себе:
Всього їх 23, і їх відносні місця зберігаються в глобальній константі fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
Зауважте, що копати виявляють міни, розміщені на попередніх кліщах, на відміну від aroundMe
.
Зв'язок
Коли ти хочеш з кимось поговорити, ти дзвониш this.sendMessage(recipients, team, data)
. Дані можуть бути все, що завгодно, і ви можете надсилати їх будь-кому, кому завгодно, навіть гравцям інших команд. Це можна використати для обману погано запрограмованих ботів, але всі гравці можуть бачити, хто надіслав повідомлення та в якій команді вони є.
Приклад:
Надішліть щось боту під назвою "redisbest":
this.sendMessage("redisbest", undefined, "Hi!");
Надішліть щось боту з назвою "redisbest" та "blueiscool":
this.sendMessage(["redisbest", "blueiscool"], undefined, {hello: "there"});
Надішліть щось всій команді червоних
this.sendMessage(undefined, "red", {hello: "red"});
Надішліть щось кожному
this.sendMessage(undefined, "*", {hello: "everyone"});
Надішліть щось усій червоній команді та боту під назвою "blueiscool":
this.sendMessage("blueiscool", "red", {hello: "bots"});
API
Ваш код повинен складатися з одного дзвінка до createBot
функції. Більш нічого. Приклад коду:
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, from, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
(Ви можете скопіювати та вставити це. Просто змініть його для своєї команди тощо)
Методи
ontick(environment)
Викликається, коли вам черга. Повинно повернути значення,
Promise
яке вирішиться протягом 1 секунди або менше, або воно буде проігноровано. Це з міркувань продуктивності і має хороший побічний ефект від того, що ви не вкладете вкладку.this
(коли в режимі ontick)landMines
Скільки мін залишилось у вас. Чим більше вбиваєш, тим більше набуваєш мін. За кожні 2 боти, яких ти вбиваєш, ти отримуєш ще 1 міна. Ви також отримуєте 1 для початку.direction
Напрямок, з яким ви стикаєтесь.storage
Зберігання, яке зберігається між дзвінками доonTick
таonMessage
. Порожній об’єкт на старті. Модифікуйте для будь-яких цілей, але переконайтесь, що це масив чи об’єкт завжди, щоб переконатися, що він зберігається правильно.move(num)
Перемістіться до вказаної позиції. Не робить нічого, якщо недійсний. Детальніше див. Вище.rotate(num)
Поверніть у вказане положення. Не робить нічого, якщо недійсний. Детальніше див. Вище.kill()
Вбиває гравця, з яким ви стикаєтесь, якщо він існує і не є у вашій команді. Детальніше див. Вище.bomb()
Вбиває будь-кого на 9 квадратах навколо вас, включаючи себе.landMine(num)
Розміщує мінну шахту, де ви знаходитесь, а потім переміщується у вказане положення. Не робить нічого, якщо недійснийnum
або у вас нічого не залишилося. Детальніше див. Вище.dig()
новий! Повертає масив інформації про міни в зоні 5x5, зосередженій навколо вас. Детальніше див. Вище.sendMessage(recipients, team, data)
recipients
може бути або одним ботом (рядком), масивом бота, абоundefined
/null
. Саме ви б хотіли надіслати повідомлення.team
це рядок команди, якій ви хотіли б надіслати повідомлення. Використовуйте,"*"
щоб надіслати повідомлення всім.data
це все, що може бути передано функції JS. Це відправлення одержувачам. Якщо це об'єкт або масив, він передається за посиланням , тож ви та отримувач (и) можете зберегти це до своїх,storage
а будь-які зміни об'єкта впливають на копії бота. Зверніть увагу , що одержувачі , які знаходяться в будь-якому списку бот, точно боти , зазначені в рядку, або боті по команді ви вказали, він отримає повідомлення.
environment
На першому галочці
x
: Х-позиція гравцяy
: Y-позиція гравцяgridWidth
: Ширина сітки (у клітинках)gridHeight
: Висота сітки (у клітинках)На всіх кліщах
aroundMe
: Набір гравців та мін. Гравці - це об’єкти, схожі{name: "bot name", team: "bot team"}
, а міни - це{team: "team of bot who placed mine"}
. Індекси масиву:Зауважте, що міни, розміщені на галочці, відмінній від поточної, не відображатимуться.
aroundMe
приклад:Скажімо, це сітка (ви червона):
Ви
aroundMe
будете виглядати так:
[
{name: "bexamplebluebot", team: "blue"},
undefined,//sparse array, nothing in index 1
undefined,//there is technically a landmine here, but it wasn't placed this tick, so it is not shown
undefined,//nothing in 3
{name: "yexampleyellowbot", team: "yellow"},
{team: "red"},//this is a landmine, you can tell is not a bot because it has no name. mines have the team name of the player they were placed by. This mine was placed this tick, otherwise you couldn't see it
//nothing else after index 5, so the array's length is 5.
]
Тут пояснюються індекси масиву:
Ваш бот ефективно бачить це:
onmessage(data, fromBot, fromTeam)
this
(коли під час повідомлення)sendMessage(recipients, team, data)
Стандартна функція надсилання повідомлень.storage
Стандартне зберігання.
data
Дані, надіслані від відправника.fromPlayer
Програвач, з якого було надіслано повідомлення.fromTeam
Команді повідомлення було надіслано.onkill()
this
(коли він вбиває)sendMessage(recipients, team, data)
Стандартна функція надсилання повідомлень.
Зручні (постійні) глобальні масиви:
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
Корисно для передачі даних функції переміщення, а також для інтерпретації aroundMe
. Дивись вище.
fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
Корисно для this.dig()
функції в ontick
обробнику.
Спробуй!
Контролер буде запускатися з моєї машини на localhost з міркувань продуктивності, але ви можете використовувати CodePen для тестування вашого бота.
Зауважте, що ви повинні вставити код у консоль і натиснути, Enter
перш ніж натиснути запустити. Ви можете вставити скільки завгодно ботів. "Тести-боти" - це приклади для тестування. Якщо ви можете їх бити чи зав'язувати, у вас є принаймні гідний бот.
Подання
Правила
Правила (застосовуються контролером)
- Ваш основний
ontick
код не повинен зайняти більше 1 секунди. Ми не хочемо, щоб раунди тривали назавжди. Якщо ваш код займає> 1 секунду, він буде зупинений. - Якщо ви спробуєте виконати більше 1 дії за поворот або зробите недійсну дію (наприклад,
this.move(-1)
або переміщення в стіну), це буде ігноровано. - Більше може прийти незабаром ...
Правила (застосовувані мною, можуть призвести до DQ)
- Не пишіть глобальні змінні ( читання добре ).
- Ваш код повинен працювати в Nodejs (у випадку, якщо контролер переноситься на Nodejs), так
JSON.parse(...)
це добре, алеalert()
це не так. - Вам заборонено дзвонити
createBot
чи перешкоджати контролеру жодним чином . - Не використовуйте чужий код без дозволу та значних змін. Немає копіботів.
- Будь ласка, без лазівки!
- Більше може прийти незабаром ...
Мої боти
Ось кілька ботів:
Цей бот випадковим чином вибирає дію. Ну, це зважений випадковий, але все ще досить випадковий. Якщо ви зможете вбити цього бота (він врешті-решт уб'є себе, це не рахується), тоді у вас є принаймні гідний бот. Опублікуйте його і подивіться, що станеться!
Мої боти мають назву, що починається з "x", і команда "none". Ви можете скористатись цим кодом, але будь ласка, внесіть хоч якусь модифікацію. Якщо ви не зможете принаймні підробити номер, ви не виграєте.
Форматування подання
Будь ласка, використовуйте цей формат:
# rmyamazingbot
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, fromTeam, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
Long, but cool explanation...
Запити, помилки, питання тощо?
Прокоментуйте нижче! Перевірте, чи вже є коментар до цього. Якщо такий вже є, підтвердіть його.
Хочете поговорити зі своєю командою?
Використовуйте кімнати чату для червоного та синього .
Мова
В даний час підтримується лише JS і щось, що компілюється в JS, але якщо ви знаєте спосіб отримати інші мови для роботи з Nodejs, я би радий перенести контролер до Nodejs.
Підсумкові ноти
Ідеї стратегії
Допоможіть своїй команді! Створення бота, який призначений допомогти іншому боту та працювати разом. Ця стратегія добре працювала для Red vs. Blue - Pixel Team Battlebots
Шукаючі респ
Я прийму найвищу відповідь на команду-переможницю. Майте на увазі, що попередні відповіді, як правило, отримують більше голосів, але їх слабкі місця, швидше за все, будуть виявлені та використані.
Крім того, якщо ви скоро отримаєте відповідь, ви можете отримати +100 банатів.