У спустошеному, розірваному війною світі, де міста були переповнені злодіями і злодіями, цивілізація відродилася у вигляді невеликих, ізольованих, промислових кооперативів, розкиданих по раніше нежилому ландшафту. Існування цих громад залежить від колективів найманців, які називаються "скрапперами", які шукають на неприйнятій території цінні матеріали для продажу кухарям. Оскільки ці матеріали стали дефіцитнішими, металобрухт стає все більш важкою та небезпечною професією. Тендітних людей в основному були замінені на віддалені робототехнічні стоянки, звані "ботами", а типовий найман, швидше за все, буде більш кваліфікованим програмістом, ніж озброєним зварником. Оскільки присутність людини у відходах зменшилась, так і повага між корисливими групами одна до одної. Боти обладнані не тільки для збору брухту, але і для його захисту, а в деяких випадках приймають його силою. Програмісти ботів невтомно розробляють нові стратегії, щоб перехитрити суперників-скраптерів, що призводить до все більш агресивних ботів і ще однієї небезпеки для людей, які ризикують за стінами своїх громад.
(так, логотип весело обрізається)
Ласкаво просимо до Scrappers!
Це рання версія Scrappers, в якій збирання брухту та фабрики не впроваджені. Це в основному "вистрілити їх".
Ви - найманський програміст, якому доручено створити програму, щоб віддалено вести своїх ботів до перемоги над конкуруючими скреперськими групами. Ваші боти - це павукоподібні машини, що складаються з енергогенераторів та щитових генераторів, які оточені багатьма придатками, оснащеними захопленнями, різанням та нападаючими знаряддями. Генератор живлення здатний виробляти 12 енергоблоків (pu) за тик (одиниця часу скрепера). Ви контролюєте, як ця сила розподіляється між трьома основними потребами бота: рухом, щитами та вогневою силою.
Боти для скребків - надзвичайно спритні машини, і вони можуть легко переміщатися над, під і навколо будь-яких перешкод, з якими вони стикаються. Таким чином, зіткнення - це не те, що потрібно враховувати вашій програмі. Ви можете безкоштовно виділити всі, деякі або жодні з 12пу, доступних вашому боту для руху, якщо ви маєте цілу кількість. Виділення функції 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% менше шкоди за кожну довжину бота, який він подорожує.
Роботи Scrapper достатньо автономні для роботи з основними функціями, але покладайтесь на вас, їх програміста, щоб зробити їх корисними як група. Як програміст, ви можете видавати наступні команди для кожного окремого бота:
- MOVE: Вкажіть координати, до яких рухатиметься бот.
- МЕТА: Визначте бота, на який слід націлюватись та стріляти, коли дозволяє розподіл потужності.
- ДІЯЛЬНІСТЬ: Перерозподіляйте силу між рухом, щитами та вогневою силою.
Технічні деталі гри
Є три програми, з якими вам потрібно буде ознайомитися. Game Engine є важким атлет і забезпечує TCP API , що програми гравець підключення. Програма програвача - це те, що ви напишете, і я надав кілька прикладів із бінарними файлами . Нарешті, Рендер обробляє вихід з ігрового двигуна для створення GIF бою.
Ігровий двигун
Ви можете завантажити ігровий движок звідси . Коли гра запускається, вона почне слухати на порту 50000 (на даний момент не налаштовується) для підключень гравців. Як тільки він отримує два підключення гравця, він надсилає ГОТОВОГО повідомлення гравцям і починає гру. Програми гравців посилають команди в гру через API TCP. Коли гра закінчена, створюється файл JSON з назвою scrappers.json (також, наразі не налаштовується). Це те, що рендер використовує для створення GIF гри.
API TCP
Програми гравців та ігровий механізм спілкуються, передаючи рядки JSON, що закінчуються рядками назад, і четверте через TCP-з'єднання. Існує лише п'ять різних повідомлень JSON, які можна надсилати чи отримувати.
Готове повідомлення
Повідомлення READY надсилається з гри програвачам гравця і надсилається лише один раз. Це повідомлення повідомляє програмі програвача, що таке його ідентифікатор гравця (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 repo, gist тощо. Будь-яка мова є прийнятною, але ви повинні припустити, що я нічого не знаю про мову та включіть інструкції щодо запуску програми. Створіть скільки завгодно матеріалів, і обов'язково дайте їм імена!
Програми зразків гравців будуть включені в турнір, тому я дуже рекомендую протестувати свого бота проти них. Турнір розпочнеться приблизно через два тижні після отримання чотирьох унікальних програм. Удачі!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
Інша важлива інформація
- Гра працює зі швидкістю 12 тиків на секунду, тому ви не будете отримувати повідомлення частіше, ніж кожні 83 мілісекунди.
- Кожен бот має діаметр 60du. Щит не займає додаткового місця. Із точністю +/- 2,5% шанси удару бота на певній відстані представлені цим графіком:
- Розпад лазерного пошкодження на відстань представлений цим графіком:
- Точність бота і лазерний розпад поєднуються для обчислення середнього шкоди за постріл. Тобто, середній збиток, який бот нанесе, коли він стріляє з певної відстані. Пошкодження за постріл представлені цим графіком:
- Лазер бота бере початок на півдорозі між центром бота та його краєм. Таким чином, укладання ваших ботів призведе до доброзичливого вогню.
- Ворожі боти породили приблизно 1440ду один від одного.
- Гра закінчується, якщо пройде 120 тиків (10 секунд) без будь-якої шкоди.
- Переможець - гравець з більшою кількістю ботів, то найбільше здоров'я, коли гра закінчується.
Розуміння відображеного зображення
- Гравець 1 представлений колами, а гравець 2 - шестикутниками.
- Колір бота представляє його розподіл потужності. Більше червоного кольору означає більше енергії для стрільби. Більше синього кольору означає більше щита. Більше зеленого кольору означає більше руху.
- "Дірка" в тілі бота являє собою пошкодження. Чим більше отвір, тим більше шкоди було завдано.
- Білі кола навколо бота - це щит. Якщо бот має щит в кінці повороту, він відображається. Якщо щит вискочив ушкодженням, він не показаний.
- Червоні лінії між ботами відображають зроблені кадри.
- Коли бота вбито, показується великий червоний «вибух».




