Якщо ви коли-небудь грали у Spacewar! , ви знаєте, це була весела гра. Якщо ви цього не зробили, знайте це: це була (і є) одна з перших і найважливіших комп'ютерних ігор. І це все одно весело! Клон, на якому я виріс, - це цей , мабуть, і, на жаль, тільки Windows. Так я відтворив це!
Тут розміщується KotH : PPCG - Spacewar! Король пагорба . Я закликаю вас грати як людина проти хоча б ще одного бота, щоб відчути, як працює гра.
Гра
- Один кадр - 30 мілісекунд (таким чином, близько 33 кадрів в секунду).
- Поле становить 800 пікселів у ширину та 600 пікселів у висоту.
- Поле є тороїдальним, тобто космічні кораблі та ракети, які рухаються поза полем, з’являються на протилежному боці.
- Є два космічні кораблі, червоний і синій.
- Червоний розміщується у x = 50, а випадковий y між 50, (висота поля - 50) пікселів.
- Синій розміщений у x = (ширина поля - 50), а випадковий y між 50, (висота поля - 50) пікселів.
- Обидві грані x = (ширина поля) / 2.
- Доступні елементи управління:
- Поверніть ліворуч - 5 градусів на кадр проти годинникової стрілки.
- Поверніть праворуч - 5 градусів на кадр за годинниковою стрілкою.
- Вогнева ракета - рухається із додатковою швидкістю 10 пікселів на кадр, на додаток до швидкості руху корабля, у напрямку, яким судно вказувало.
- Пожежна машина - прискорює космічний корабель на рівні 0,30 пікселів на кадр у напрямку, який показує космічний корабель.
- Гіперпростірний стрибок - телепортується до деяких випадкових координат у полі, з 25% шансом вибухнути. Ці випадкові координати можуть знаходитися на вершині Сонця.
- Максимальна швидкість для суден - 15 пікселів на кадр при потужності двигуна і 40 пікселів на кадр при посиленні сили тяжіння.
- Під час руху швидше 15 пікселів на кадр тяга двигуна може змінювати лише напрямок або сповільнюватись.
- Що стосується ракет:
- Ракети рухаються по прямій лінії.
- Ракети можуть бути вистрілені з максимальною швидкістю 1 за 0,1 секунди.
- Термін експлуатації ракет - 2,25 секунди.
- Кораблі мають максимум 20 ракет у кожній.
- Ракети - це точкові частинки всередині.
- В самому центрі знаходиться сонце, яке надзвичайно небезпечно для вашого корабля. Найменший контакт зі смертельними наслідками. Це сонце також знищує ракети.
- Сонце має гравітацію. Отримане прискорення становить 5000 / (відстань ^ 2) пікселів / кадр ^ 2, де відстань у пікселях. Постраждали космічні кораблі та ракети.
- Обидва кораблі мають три зони удару: ніс, ліве крило і праве крило.
- Удар в ніс - це моментальна смерть.
- Удар по будь-якому крилу зменшує частоту повороту космічного корабля та прискорення двигуна вдвічі.
- Якщо обидва крила знищені, космічний корабель не може маневрувати і може вести лише ракети.
- Кораблі можуть стикатися між собою.
- Удар носа в ніс є смертельним для обох кораблів.
- Удар крилом носа руйнує крило.
- Криловий удар руйнує обидва крила.
- Мертві кораблі тверді і заморожені, поки вони не вибухнуть через 1 секунду.
- Після того, як принаймні один корабель загинув, поле скидається через 3 секунди. До цього часу сонце та будь-які інші ракети залишаються небезпечними.
У оригінальній грі також є смертельні та незнищенні астероїди, але я не включатиму їх.
Правила
- Ваш бот повинен бути написаний на JavaScript.
- Ваш бот повинен обмежити своє рішення приблизно 10 мілісекундами. Якщо я помічаю постійне відставання від вашого бота , я його дискваліфікую та повідомляю, щоб ви могли його виправити.
- Боти матимуть доступ до таких:
- Ширина поля та висота поля
- Положення та радіус сонця
- Положення, обертання, швидкість, форма, запас ракет і стан гіперпростору обох кораблів
- Положення та швидкість всіх ракет
- Коли буде запропоновано, ваш бот повинен повернути список рядків.
- Ці рядки повинні бути один з наступних:
turn left
,turn right
,fire engine
,fire missile
,hyperspace
. Будь-який інший рядок буде проігноровано. - Якщо є дублікати, відзначається лише перший.
hyperspace
має перевагу над усіма іншими.turn left
іturn right
в той же час не матиме ефекту.fire engine
не матиме ефекту, якщо судно має лише ніс або мертве.fire missile
не матиме ефекту, якщо ракета була випущена занадто недавно.
- Ці рядки повинні бути один з наступних:
- У зміні від звичного вашому боту дозволяється використовувати поведінку інших ботів. Я хочу заохочувати метаграми.
- Боти можуть не імітувати інших ботів. (Тобто, не читаючи розуму.)
- Боти можуть не встановлювати змінних, використовуваних кодом гри та фізики. (Тобто, не обман.)
Деталі реалізації бота
Я буду зберігати ваш бот у власному файлі JavaScript, який автоматично включається, з ім'ям файлу bot_<name>.js
. Тому не вводьте пробіли чи символи, які б заважали цьому чи іменували функцію в JavaScript. Це тому, що слід визначити наступні функції: <name>_setup(team)
і <name>_getActions(gameInfo, botVars)
. Далі на сторінці є текстові області для користувача , які ви можете відредагувати, щоб перевірити свій код.
<name>_setup(team)
Ця функція допоможе вам визначити будь-які змінні, які ви хочете зберегти. team
буде "red"
або "blue"
. Ця функція повинна повертати об'єкт. Визначте такі змінні:
var vars = {};
vars['example'] = "example";
return vars;
Цей vars
об'єкт буде передано іншій функції:
<name>_getActions(gameInfo, botVars)
botVars
це об'єкт, повернутий <name>_setup(team)
. gameInfo
є об'єктом, що містить такі змінні:
redScore
blueScore
timeLeft
fieldWidth
fieldHeight
sun_x
sun_y
sun_r //sun's radius
gravityStrength //acceleration in pixels/frame^2 at 1 pixel away from the sun's center
engineThrust //acceleration in pixels/frame^2
speedLimit //maximum speed under engine power
maxSpeed //maximum speed from gravity boosts
red_x
red_y
red_rot //rotation in degrees
red_xv //x velocity
red_yv //y velocity
red_shape //one of "full ship", "left wing", "right wing", "nose only"
red_missileStock //the number of missiles red has left
red_inHyperspace //true if red is in hyperspace
red_exploded //until red explodes, it is still solid and hazardous
red_alive
// likewise for blue //
numMissiles
missiles //this is a list of objects, each with the following variables
x
y
xv
yv
Ваш бот має повний доступ до них. Я майже впевнений, що ви можете писати до них і не впливати на оригінальні змінні, але не робити це все одно. Примітка про обертання: кораблі вказують у напрямку + y, вниз, тому все, що ви хочете вирівняти з судном, слід змістити на 90 градусів. Також позитивне обертання відбувається за годинниковою стрілкою.
Ця функція повинна повертати список рядків, що представляють дії вашого бота. Наприклад, ["turn right","thrust"]
. Більш докладно про це - у розділі Правила .
Додаткові відомості
Ви також можете скористатися наступним:
LineIntersection(L1, L2)
L1 і L2 - це двоелементні масиви двоелементних масивів. Тобто L1 := [[x1,y1],[x2,y2]]
і L2 := [[u1,v1],[u2,v2]]
. Ця функція обчислює перетин двох ліній і повертає це: [[x,y], [a,b]]
. [x,y]
є координатами точки перетину і [a,b]
є парою співвідношень, які виражають, наскільки далеко по кожній прямій знаходиться точка перетину. Як і в, a = 0.25
означало б, що точка перетину - це чверть шляху від [x1,y1]
до [x2,y2]
, і так само для b
. Якщо перетину немає, повертається порожній масив.
window["shipShapes"]
var shipShapes = {
'full ship': [[-8,16],[0,-8],[8,16]],
'left wing': [[-8,16],[0,-8],[4,4],[0,8],[0,16]],
'right wing':[[-4,4],[0,-8],[8,16],[0,16],[0,8]],
'nose only': [[-4,4],[0,-8],[4,4],[0,8]]
};
Це координати багатокутників кораблів. Щоб полегшити отримання поточних координат, ви також можете використовувати ...
getShipCoords(<color>)
getShipCoords("red")
поверне поточні координати вершин корабля Red, а також для getShipCoords("blue")
Blue. Ці координати в списку , як так: [[x1,y1],[x2,y2],[x3,y3],...]
. Полігони неявно замкнуті, тому між першою і останньою координатами є лінія.
Ви не можете отримати доступ або змінити будь-які інші змінні чи функції, якими користується гра / веб-сайт. І точно не називайте свої функції однаковими. Я не передбачаю, що це буде проблемою, але якщо ваш бот порушує ігровий код, це одна з можливостей. Не відбувається реєстрації та вилучення винятків.
Перемога
- Кожне спарювання ботів відтворюється щонайменше 10 разів в обидва напрями. (Отже, щонайменше 20 ігор.)
- Намагайтеся мати найвищі коефіцієнти виграшу / втрати в цілому . Якщо ваш бот дуже добре проти одного іншого бота, але програє проти інших трьох, це не так добре, як виграти проти двох і програти проти двох (як загальне правило).
- Для кожного бота будуть розраховані співвідношення (виграш + 1) / (втрати + 1), потім буде розраховано середнє та стандартне відхилення цих коефіцієнтів. Вища середня матиме пріоритет, і якщо засоби знаходяться в межах однієї одиниці один одного, нижча дисперсія матиме пріоритет.
- Підрахунок балів розпочнеться або через тиждень з сьогоднішнього дня, або через три дні без подання нових заявок. Це так, що мені не потрібно повторювати жодне спарювання ботів.
Перш за все, весело провести час!
Таблиця лідерів (08.08.2016 05:15):
# Name Mean StdDev
1. Helios 13.625 6.852
2. EdgeCase 8.335 8.155
3. OpponentDodger 8.415 8.186
4. OrbitBot 5.110 6.294
5. SunAvoider 5.276 6.772
6. DangitBobby 3.320 4.423
7. SprayAndPray 3.118 4.642
8. Engineer 3.903 6.315
9. RighthandedSpasms 1.805 2.477
10. AttackAndComeBack 2.521 2.921
11. PanicAttack 2.622 3.102
12. FullSpeedAhead 2.058 3.295
13. UhhIDKWhatToCallThisBot 2.555 3.406
14. MissilesPlusScore 0.159 0.228
15. Hyper 0.236 0.332
16. RandUmmm 0.988 1.329
17. Kamikaze 0.781 1.793
Примітка. Це може змінитися, оскільки я запускаю більше ігор. Плюс, впорядкування рангів 9-13 мене турбує, тому я можу налаштувати метод балів, щоб краще відповідати власної інтуїції того, як їх слід ранжувати.
(Засоби та стандартні відхилення округлюються до трьох десяткових цифр. Також Hyper
має бути, HYPER
але це заплутує виділення.: P)
LineIntersection
на непересічні сегменти повертає порожній масив.