Ця гра короля-пагорба - це стратегічна гра, в якій ви повинні кидати навколо водної кулі і уникати бризок водою. Мета - отримати найбільшу кількість балів. Вам видадуть карту поля та місце розташування водної кулі. Ви можете або повернути, що хочете вдарити по водній кулі (якщо ви досить близько) в певному напрямку, або що хочете рухатися в певному напрямку.
Зокрема: водна куля стартує о (0, 0)
30 одиниць у висоту та опускається. Якщо водна куля потрапить на землю, гравець випадково буде обраний, щоб втратити 4 очки, при цьому більше ваги надається тим, хто ближче до повітряної кулі. Крім того, гравець, який востаннє потрапив на повітряну кулю, заробить 3 очки. Тому, якщо вдарити повітряну кулю прямо вниз, ви, швидше за все, втратите 1 бал.
Ви напишете клас, який розширюється Player
. Вам потрібно запровадити конструктор. Конструктор матиме вигляд:
public Player1() {
super(/* Some numbers */ 3, 3, 4)
}
Ці числа є double
s. Перше число відображає швидкість гравця, друге - силу, а третє - удачу. Числа повинні складати до 10 або менше, і жодне число не може бути меншим або рівним нулю.
По-друге, ви повинні реалізувати move
метод. Це приклад move
методу:
@Override
protected Action move(Map<Player, Point2D> map, Balloon b) {
// Get my own location
Point2D myself = map.get(this);
// If I'm close enough to the balloon
// then hit the balloon
if (myself.distanceSq(b.getLocation()) <= 16) {
double d = (r.nextDouble() - 0.5) * 3;
// Random y direction, z direction is what's left
return new Hit(0, d, Math.sqrt(9 - d*d));
} else {
double diffX = b.getLocation().getX() - myself.getX(),
diffY = b.getLocation().getY() - myself.getY();
// Move towards the balloon
return new Movement(Math.signum(diffX)*3/Math.sqrt(2), Math.signum(diffY)*3/Math.sqrt(2));
}
}
Тут є ряд важливих речей. Спочатку зауважте, що поле передається як Map<Player, Point2D>
. Поле нескінченне - немає меж, як далеко можна зайти. Це не двовимірний масив чи щось подібне. Крім того, це означає, що у вас буде нецілі координати як ваше місцезнаходження. Це цілком нормально.
Іншим наслідком є те, що гравці та повітряна куля можуть перекриватися. Насправді два гравці можуть знаходитися в точно такому самому місці!
Повітряна куля має певну швидкість і напрямок. Загалом вона впаде зі швидкістю 3 одиниці / крок. Він також рухається в x
напрямку і y
напрямку. Повернувшись a Hit
, ви передаєте напрямки x, y і z, якими ви натискаєте на повітряну кулю. Ви не можете натиснути на повітряній кулі, висота якого перевищує 10 або, відстань від вас (тільки в двох вимірах) більше 4. Крім того, якщо це правда , що , x^2 + y^2 + z^2 > s^2
коли s
ваша сила, і x
, y
і z
ті напрямки , які ви постраждали , ваша дія відкидається. Сила вашого удару посилюється випадковим числом між 0
і luck
(що означає, що воно може знизитися, якщо ваша удача буде низькою).
Так само ви можете повернути a Movement
з координатами, що рухаються, x
та y
координатами (зверніть увагу, що ви не можете стрибати в повітрі). Якщо x^2 + y^2 > s^2
де s
ваша швидкість, ваші дії відкидаються.
Якщо водна куля потрапляє на землю, тоді вибирається випадковий гравець, який приділятиме більше ваги тим, хто найближчий, - але меншою вагою тим, хто має більше удачі. Вибраний гравець втрачає 4 бали.
Контролер: https://github.com/prakol16/water-balloon-wars/tree/master
Гра триває 1000 кроків. Наприкінці з'явиться файл, який називається log.out
. Скопіюйте та вставте дані у цю скрипку для перегляду гри: https://jsfiddle.net/prankol57/s2x776dt/embedded/result/
Або ще краще, перегляньте його в 3D: http://www.brianmacintosh.com/waterballoonwars (завдяки BMac)
Грає з найвищою сумою балів після 100 (може бути більше, але не менше) ігор виграє.
Якщо ви хочете подати рішення, можете прочитати справді конкретні подробиці на веб- сайті https://github.com/prakol16/water-balloon-wars/tree/master .
Редагувати 3/8 :
Це підсумкові результати на даний момент (1000 ітерацій, не враховуючи гравців 1 і 2). Якщо ви відредагуєте свою публікацію, ви можете коментувати, і я повторю оцінки:
{
class players.BackAndForth=-75.343,
class players.Hydrophobe=-0.800,
class players.KeepAway=-53.064,
class players.Weakling=39.432,
class players.Repeller=21.238,
class players.LuckyLoser=-30.055,
class players.AngryPenguin=-49.310
}
Переможець отримав Weakling
із середнім показником 39 очок. 2 місце було Repeller
з 21 балом.
speed
і strength
в конструкторі програвача.
dirX
, dirY
і dirZ
(посилюється вашої удачі) просто додаються до швидкості повітряної кулі. Якщо кілька людей ударять його (дещо малоймовірно), то гравець, який міг би отримати три очки, вирішується на удачу (див. Конкретні деталі)