Этот вызов был вдохновлен великолепным испытанием @HelkaHomba Red Battle против 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)
. 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)
Вызывается, когда твоя очередь. Должен вернуть a,
Promise
который разрешается за 1 секунду или меньше, иначе он будет проигнорирован. Это из соображений производительности и имеет приятный побочный эффект - отсутствие зависания вкладки.this
(когда оник)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
обработчике.
Попробуйте!
Контроллер будет запускаться с моей машины на локальном хосте из соображений производительности, но вы можете использовать CodePen для тестирования своего бота.
Обратите внимание, что вы должны вставить свой код в консоль и нажать, Enter
прежде чем нажать Run. Вы можете вставить столько ботов, сколько захотите. «Испытательные боты» - это примеры для тестирования. Если вы можете победить или связать их всех, у вас есть хотя бы приличный бот.
Материалы
правила
Правила (применяются контроллером)
- Ваш основной
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 к награде.