Эта проблема закончилась. Чтобы увидеть итоговые оценки участников, нажмите здесь
В этом задании каждая заявка представляет собой одного бота. Каждый бот должен быть функцией Javascript. Боты будут сражаться, чтобы получить наивысшую общую стоимость золота. Золото можно добывать на ферме или зарабатывать на убийстве других ботов, и оно используется для улучшения лечения, атаки, защиты и ведения сельского хозяйства.
Задача:
В течение нескольких раундов, содержащих до 1000 ходов (заканчивается, когда остается только один бот), бот с наибольшей общей стоимостью (сумма всего полученного золота) становится победителем.
Повороты:
В каждом ходу каждый живой бот (> 0 HP) запускается один раз. Он может вернуть ход, который может быть одним из следующих:
- Лечение: восстанавливает HP
- Атака: удаляет HP из другого бота
- Щит: защищает от последующих атак
- Оглушение: пропускает следующий ход другого бота
- Ферма: зарабатывает золото за счет HP
- Обновление: сделать определенные шаги лучше
Все боты вернут свой ход до того, как они будут выполнены, поэтому оглушение, лечение, атака, щит и т. Д. Не повлияют на ботов, движущихся позже в этом ходу. Например, если бот A оглушает бот B, а бот B следует за ботом A в порядке хода, бот B все равно будет двигаться позже в том же ходу, и оглушение произойдет в следующем ходу.
Бой, фермерство и модернизация:
Каждый бот имеет максимальный HP 100 и назначенный UID от 0 до 99. Этот UID меняется после каждого раунда, и как боты отслеживают друг друга.
Лечение - один из самых простых ходов, добавляющий количество HP, определяемое его уровнем (начинается с 5 HP). Бот не может лечить более 100 HP.
Атака бота по его UID - это еще один возможный ход с базовым уроном 5 HP на уровне 0. Боты также могут быть оглушены, пропуская свой следующий ход, который также использует UID.
Боты имеют дополнительный щит HP, который не имеет ограничений. Этот щит HP поглощает урон от прямых атак других ботов и добавляется защитой. На уровне 0 экранирование добавляет 5 щитовых HP.
Фермерство заработает 5 золотых на уровне 0, за 2 HP. Эти 2 HP не могут быть защищены. Единственное использование для золота (кроме выигрыша) - улучшать ходы. Исцеление, атака и защита имеют базовую стоимость 5 HP, а фарм начинается с 5 золота. Каждый из этих ходов имеет индивидуальные уровни, которые начинаются с 0. Эти формулы будут определять значение в HP или золоте хода, где L - уровень:
- Лечение:
L + 5
- Атакующий:
1.25L + 5
- Экранирование:
1.5L + 5
- Сельское хозяйство:
2L + 5
Стоимость улучшения любого хода одинакова для определенного уровня и определяется тем 2.5L² + 2.5L + 10
, где L - текущий уровень. Бот может использовать функцию cost(currentLevel)
в качестве ярлыка, чтобы определить это.
Боты начинают с 25 золотых, что позволяет им быстро улучшить либо два хода до уровня 1, либо один ход до уровня 2. Это начальное золото не засчитывается в общую стоимость ботов. Убив бота, вы получаете половину его общей стоимости в золоте, округленную в большую сторону, и если два бота убивают другого в одном ходу, они оба получают вознаграждение.
Ввод, вывод:
Для связи с контроллером возвращаемое значение функции используется для отправки информации о перемещении. Один из них должен быть возвращен:
- Лечение:
heal()
- Атака:
attack(uid)
- Щит:
shield()
- Оглушение:
stun(uid)
- Ферма:
farm()
- Обновить:
upgrade("heal" / "attack" / "shield" / "farm")
Чтобы пропустить поворот (ничего не делать), ничего не возвращать или возвращать ложное значение.
Чтобы получить номер текущего хода (начинается с 1), используйте turn()
.
Аргументы вашей функции будут включать информацию о вашем боте, UID других ботов и хранилище между поворотами. Первый аргумент является объектом со следующими свойствами: uid
, hp
, gold
, и shield
. Это копии текущей информации вашего бота. Существует также несомый объект levels
, с номерами уровня heal
, attack
, shield
и farm
.
Второй аргумент перетасованного массив всех других , чем ваша живых ботов, отформатированные как объект , содержащий свойства uid
, hp
(плюс щит), worth
и attack
(уровень атаки). Третий аргумент - пустой объект, который можно использовать для хранения между поворотами.
Пример ботов:
Этот бот будет фармить до тех пор, пока не сможет повысить свою атаку до уровня 5, а затем атаковать случайного бота каждый ход, пока он не умрет (или не победит). Не очень эффективно из-за отсутствия лечения / защиты.
function freeTestBotA(me, others, storage) {
if (me.levels.attack < 5) {
if (me.gold < cost(me.levels.attack))
return farm();
return upgrade("attack");
}
return attack(others[0].uid);
}
Этот бот имеет два режима: атакующий и оборонительный. Он будет либо оглушать случайного бота, либо лечить в режиме защиты, а также атаковать или защищать в режиме атаки. Он будет пытаться обновить свои атаки, когда это возможно.
function freeTestBotB(me, others, storage) {
if (me.gold >= cost(me.levels.attack))
return upgrade("attack");
if (me.hp < 50)
if (Math.random() < 0.5)
return stun(others[0].uid);
else
return heal();
else
if (Math.random() < 0.5)
return attack(others[0].uid);
else
return shield();
}
Правила:
- Стандартные лазейки запрещены
- Боты не могут читать, изменять или добавлять какие-либо переменные вне своей области, не могут пытаться обманывать и не могут вызывать какие-либо определенные контроллером или функции DOM
- Возвращаемое значение должно быть ложным, или один из вышеуказанных выходов функции
- Боты не должны быть предназначены для конкретного бота, но могут быть разработаны, чтобы использовать преимущества общих стратегий
- Боты не могут атаковать самих себя (обнаружено из-за комментария @Ness)
- Боты должны достаточно отличаться от любых других ботов, чтобы их можно было разумно считать отдельными записями
- Объединение в команду теперь не разрешено
- Контроллер можно найти здесь
- Chatroom
Отладка нового контроллера:
Используя файл gold-battle-log.js
, вы можете установить значение debug
свойства бота в botData
0 (без регистрации), 1 (перемещение журналов) или 2 (перемещение журналов, hp, золото, уровни и т. Д.)
Вызов заканчивается в 17:00 UTC в пятницу, 9 августа.
[closed]
в конце, вероятно, заставит случайных зрителей пропустить чтение моего вызова, так как они предполагают, что это низкое качество или не по теме.