В пустынном, разрушенном войной мире, где города были захвачены головорезами и ворами, цивилизация заново изобрела себя в виде небольших изолированных промышленных кооперативов, разбросанных по ранее необитаемому ландшафту. Существование этих сообществ зависит от групп наемных рабочих, называемых «скребками», которые ищут на необузданной территории ценные материалы для продажи в курятники. По мере того как эти материалы становятся все более скудными, утилизация становится все более сложной и опасной профессией. Хрупкие люди-работники в основном были заменены удаленными роботизированными помощниками, называемыми «ботами», и типичный наемник с большей вероятностью будет опытным программистом, чем вооруженным сварщиком. По мере того, как уменьшалось присутствие людей на слом, также росло и уважение между наемными группами друг к другу. Боты экипированы не только для сбора лома, но и для его защиты, а в некоторых случаях забирают его силой. Программисты ботов работают не покладая рук, разрабатывая новые стратегии, чтобы перехитрить конкурирующих скребков, что приводит к росту агрессивности ботов и еще одной опасности для людей, которые выходят за пределы своих сообществ.
(да, логотип обрезается весело)
Добро пожаловать в Scrappers!
Это ранняя версия Scrappers, в которой сбор отходов и фабрики не были реализованы. Это в основном «стреляй».
Вы - наемный программист, которому поручено создать программу для удаленного ведения ваших ботов к победе над конкурирующими группами. Ваши боты - это паукообразные машины, состоящие из силовых и щитовых генераторов в своей основе, окруженные множеством придатков, оснащенных захватными, режущими и атакующими орудиями. Генератор энергии способен производить 12 единиц энергии (пу) за такт (единица времени скребка). Вы контролируете, как эта сила распределяется между тремя основными потребностями бота: движением, щитами и огневой мощью.
Скрепер-боты являются исключительно гибкими машинами и могут легко перемещаться, преодолевать любые препятствия, с которыми они сталкиваются. Таким образом, столкновение - это не то, что нужно учитывать вашей программе. Вы можете свободно распределять все, некоторые или ни одного из 12pu, доступных вашему боту для движения, если вы имеете дело с целыми числами. Назначение 0pu функциям движения бота сделает его неподвижным. Выделение 2pu позволит боту перемещаться на 2 единицы расстояния (du) за тик, 5pu - 5du / тик, 11pu - 11du / тик и так далее.
Генераторы щитов ваших ботов проецируют пузырь отклоняющей энергии вокруг их тела. Щит может отразить до 1 урона, прежде чем лопнуть, оставляя вашего бота незащищенным до тех пор, пока генератор щита не наберет достаточно энергии, чтобы вернуть его на место. Вы можете свободно распределить все, некоторые или ни одного из 12pu, доступных вашему боту, на его щит. Выделение 0pu на щит бота означает, что он никогда не сгенерирует щит. Выделение 2pu позволит боту генерировать новый щит 2 из 12 тиков или один раз каждые 6 тиков. 5pu приведет к регенерации щита 5 из каждых 12 тиков и так далее.
Накапливая заряд в своих сварочных лазерах, ваши боты могут стрелять повреждающими лучами на короткие расстояния с достаточной точностью. Подобно генерации щитов, скорость стрельбы ваших ботов зависит от мощности, выделяемой их лазерам. Выделение 0pu лазерам бота означает, что он никогда не сработает. Выделение 2pu позволит боту запустить 2 из каждых 12 тиков и так далее. Лазер бота будет путешествовать до тех пор, пока не натолкнется на предмет или не рассеется в бесполезности, поэтому помните о дружественном огне. Хотя ваши боты довольно точны, они не идеальны. Вы должны ожидать +/- 2,5 градуса отклонения в точности. По мере того, как лазерный луч перемещается, его частицы постепенно отклоняются атмосферой, пока луч не станет эффективно безвредным на достаточном расстоянии. Лазер наносит 1 урон в упор, и на 2,5% меньше урона на каждую длину бота.
Боты-скреперы достаточно автономны, чтобы справляться с базовыми функциями, но полагаются на вас, их программиста, чтобы они были полезны как группа. Как программист, вы можете выполнить следующие команды для каждого отдельного бота:
- MOVE: укажите координаты, по которым бот будет двигаться.
- ЦЕЛЬ: Определить бота, на которого можно нацелиться и выстрелить, когда позволяет распределение мощности.
- СИЛА: перераспределить силу между движением, щитами и огневой мощью.
Технические детали игры
Есть три программы, с которыми вам нужно ознакомиться. Game Engine является тяжелым атлет и обеспечивает TCP API , что программы игрок подключения. Программа для плеера - это то, что вы напишите, и я привел здесь несколько примеров с бинарными файлами . Наконец, Renderer обрабатывает выходные данные из Game Engine для создания GIF битвы.
Игровой движок
Вы можете скачать игровой движок здесь . Когда игра запускается, она начинает прослушивать порт 50000 (в настоящее время не настраивается) для подключения игроков. Как только он получает соединения двух игроков, он отправляет сообщение ГОТОВ игрокам и начинает игру. Программы игрока посылают команды в игру через TCP API. Когда игра заканчивается, создается файл JSON с именем scrappers.json (также в настоящее время не настраиваемый). Это то, что рендерер использует для создания GIF-кода игры.
TCP API
Программы игрока и игровой движок обмениваются данными, передавая строки JSON с завершающей строкой назад и четвертый через TCP-соединение. Существует только пять различных сообщений JSON, которые можно отправлять или получать.
Готовое сообщение
Сообщение ГОТОВ отправляется из игры в программы игрока и отправляется только один раз. Это сообщение сообщает программе игрока, каков ее идентификатор игрока (PID), и предоставляет список всех ботов в игре. PID - единственный способ определить, какие боты дружественны против врага. Подробнее о полях ботов ниже.
{
"Type":"READY", // Message type
"PID":1, // Player ID
"Bots":[ // Array of bots
{
"Type":"BOT",
"PID":1,
"BID":1,
"X":-592,
...
},
...
]
}
Бот Сообщение
Сообщение BOT отправляется из игры в программы игрока и отправляется при изменении атрибутов бота. Например, когда проецируются щиты или меняется состояние, отправляется сообщение BOT. Идентификатор бота (BID) уникален только для конкретного игрока.
{
"Type":"BOT", // Message type
"PID":1, // Player ID
"BID":1, // Bot ID
"X":-592, // Current X position
"Y":-706, // Current Y position
"Health":12, // Current health out of 12
"Fired":false, // If the Bot fired this tick
"HitX":0, // X position of where the shot landed
"HitY":0, // Y position of where the shot landed
"Scrap":0, // Future use. Ignore.
"Shield":false // If the Bot is currently shielded.
}
Переместить сообщение
Сообщение MOVE - это команда от программы игрока к игре (но воспринимайте ее как команду для бота). Просто укажите бота, которого вы хотите переместить, и координаты. Предполагается, что вы командуете своим собственным ботом, поэтому PID не требуется.
{
"Cmd":"MOVE",
"BID":1, // Bot ID
"X":-592, // Destination X coordinate
"Y":-706, // Destination Y coordinate
}
Целевое сообщение
Сообщение TARGET говорит одному из ваших ботов, чтобы он нацелен на другого бота.
{
"Cmd":"TARGET",
"BID":1, // Bot ID
"TPID":0, // The PID of the bot being targeted
"TBID":0, // The BID of the bot being targeted
}
Сообщение силы
Сообщение POWER перераспределяет 12pu, доступное вашему боту, между движением, огневой мощью и щитами.
{
"Cmd":"POWER",
"BID":1, // Bot ID
"FPow":4, // Set fire power
"MPow":4, // Set move power
"SPow":4, // Set shield power
}
Конкурс
Если вы достаточно смелы, чтобы исследовать необузданные земли, вы попадете в турнир с двойным выбыванием против своих наемников. Пожалуйста, создайте ответ для своей заявки и вставьте свой код или укажите ссылку на git-репо, gist и т. Д. Любой язык приемлем, но вы должны предположить, что я ничего не знаю о языке, и включать инструкции по запуску вашей программы. Создайте столько заявок, сколько захотите, и обязательно дайте им имена!
Программы- примеры игроков будут включены в турнир, поэтому я настоятельно рекомендую протестировать вашего бота на них. Турнир начнется примерно через две недели после того, как мы получим четыре уникальных представления программы. Удачи!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
Другая важная информация
- Игра идет со скоростью 12 тиков в секунду, поэтому вы не будете получать сообщения чаще, чем каждые 83 миллисекунды или около того.
- Каждый бот 60du в диаметре. Щит не занимает дополнительного места. С точностью +/- 2,5% вероятность попадания бота на определенное расстояние представлена на следующем графике:
- Распад лазерного повреждения на расстоянии представлен этим графиком:
- Точность бота и лазерный распад объединяются, чтобы вычислить его средний урон за выстрел. То есть средний урон, который бот будет причинять при стрельбе с определенного расстояния. Урон за выстрел представлен этим графиком:
- Лазер бота возникает на полпути между центром бота и его краем. Таким образом, сложение ваших ботов приведет к дружескому огню.
- Вражеские боты появляются примерно на 1440du друг от друга.
- Игра заканчивается, если пройдут 120 тиков (10 секунд) без нанесенного урона.
- Победителем становится игрок с наибольшим количеством ботов, а затем наибольшее количество здоровья, когда игра заканчивается.
Понимание отрендеренного изображения
- Игрок 1 представлен кругами, а игрок 2 - шестиугольниками.
- Цвет бота представляет его распределение мощности. Больше красного означает, что больше энергии было выделено для стрельбы. Больше синего означает больше щита. Больше зеленого означает больше движения.
- «Дыра» в теле бота представляет собой повреждение. Чем больше отверстие, тем больше урона было получено.
- Белые круги вокруг бота - это его щит. Если у бота есть щит в конце хода, он показывается. Если щит был поврежден при получении урона, он не отображается.
- Красные линии между ботами обозначают сделанные снимки.
- Когда бот убит, появляется большой красный «взрыв».
источник
Ответы:
Экстремистский (Питон 3)
Этот бот всегда будет посвящать всю свою силу одной вещи: экранированию, если он не экранирован, перемещению, если он не в своем положении, и стрельбе в противном случае. Бьет всех образцовых ботов, кроме смертельной тарелки.
источник
Менее безрассудный ( Go )
Первоначально я планировал немного изменить образец программы Reckless Abandon, чтобы боты не запускались, если мешал дружественный бот. Я оказался с ботами, которые выбирают новые цели, когда друг мешает, что, я думаю, лучше. Это побьет первые две программы.
Код не идеален. Логика определения четкости выстрела использует довольно случайные догадки.
Кажется, не существует механизма, нацеленного на «никого». Это может быть хорошей особенностью, чтобы добавить.
TCP API хорош тем, что на нем может играть любой язык, но это также означает много стандартного кода. Если бы я не был знаком с языком, на котором написаны примеры ботов, у меня, вероятно, не было бы мотивов поиграть с этим. Коллекция шаблонных образцов на разных языках станет отличным дополнением к вашим другим репозиториям git.
(большая часть следующего кода - копирование / вставка из одного из примеров ботов)
источник
Trigger Happy - Java 8
Trigger Happy - это простая эволюция моего оригинального, но уже не жизнеспособного бомбардного бота. Это очень простой бот, который просто стреляет по целевому противнику, если есть точный выстрел, в противном случае выполняет случайную прогулку, чтобы попытаться занять лучшую позицию. Все время пытаюсь получить щит.
Однако при всей своей простоте он очень эффективен. И с готовностью уничтожит образцы ботов.
Обратите внимание, что у бота есть несколько ошибок, таких как иногда стрельба, даже если это не точный выстрел, и он может не поддерживать щит ... но он все еще эффективен, поэтому просто отправит эту запись как есть
Блюдо смерти против Триггера Хэппи
Код следующим образом:
Для компиляции: javac TriggerHappy.java
Для запуска: Java TriggerHappy
источник