Ta gra na wzgórzu to gra strategiczna, w której musisz rzucić balonem z wodą i unikać rozpryskiwania się przez wodę. Celem jest zdobycie jak największej liczby punktów. Otrzymasz mapę pola i lokalizację balonu z wodą. Możesz albo wrócić, że chcesz uderzyć balonem z wodą (jeśli jesteś wystarczająco blisko) w określonym kierunku lub że chcesz ruszyć w określonym kierunku.
W szczególności: Balon wodny rozpocznie się przy wysokości (0, 0)
30 jednostek i spadnie. Jeśli balon wodny uderzy o ziemię, gracz zostanie losowo wybrany, aby stracić 4 punkty, przy czym większa waga zostanie przyznana tym, którzy są bliżej balonu. Ponadto gracz, który ostatni uderzył w balon, zdobędzie 3 punkty. Dlatego jeśli uderzysz balon prosto w dół, najprawdopodobniej stracisz 1 punkt.
Napiszecie klasę, która się rozszerza Player
. Musisz wdrożyć konstruktor. Konstruktor będzie wyglądał następująco:
public Player1() {
super(/* Some numbers */ 3, 3, 4)
}
Te liczby to double
s. Pierwsza liczba oznacza prędkość gracza, druga oznacza siłę, a trzecia oznacza szczęście. Liczby muszą się sumować do 10 lub mniej i żadna liczba nie może być mniejsza lub równa zero.
Po drugie, musisz zaimplementować move
metodę. To jest przykładowa move
metoda:
@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));
}
}
Jest tu wiele ważnych rzeczy. Najpierw zauważ, że pole jest przekazywane jako Map<Player, Point2D>
. Pole jest nieskończone - nie ma ograniczenia co do odległości. To nie jest dwuwymiarowa tablica ani nic takiego. Ponadto oznacza to, że jako lokalizację będziesz mieć współrzędne inne niż całkowite. To jest całkowicie w porządku.
Inną konsekwencją jest to, że gracze i balon mogą się nakładać. W rzeczywistości dwóch graczy może znajdować się dokładnie w tej samej lokalizacji!
Balon ma określoną prędkość i kierunek. Zasadniczo spadnie w tempie 3 jednostek / krok. Porusza się także w x
kierunku i y
kierunku. Kiedy wracasz a Hit
, mijasz kierunki x, y i z, które pchasz balon. Nie może trafić balon, którego wysokość jest większa niż 10 lub którego odległość od Ciebie (tylko w dwóch wymiarach) jest większa niż 4. Ponadto, jeśli prawdą jest, że x^2 + y^2 + z^2 > s^2
tam gdzie s
jest wasza siła, i x
, y
i z
są kierunki, które uderzają Twoje działanie zostanie odrzucone. Siła twojego trafienia jest wzmacniana przez losową liczbę pomiędzy 0
i luck
(co oznacza, że może spaść, jeśli twoje szczęście jest mało).
Podobnie możesz zwrócić a Movement
za pomocą współrzędnych x
i y
, które poruszasz (pamiętaj, że nie możesz skakać w powietrzu). Jeśli x^2 + y^2 > s^2
gdzie s
jest twoja prędkość, twoje działanie jest odrzucane.
Jeśli balon wodny uderzy o ziemię, wybierany jest losowy gracz, z większą wagą dla najbliższych - ale mniejszą dla tych, którzy mają więcej szczęścia. Wybrany gracz traci 4 punkty.
Kontroler: https://github.com/prakol16/water-balloon-wars/tree/master
Gra trwa 1000 kroków. Na końcu będzie plik o nazwie log.out
. Skopiuj i wklej dane do tego skrzypca, aby wyświetlić grę: https://jsfiddle.net/prankol57/s2x776dt/embedded/result/
Lub jeszcze lepiej, zobacz w 3D: http://www.brianmacintosh.com/waterballoonwars (dzięki BMac)
Gracz z najwyższą sumą wyników po 100 (może być więcej, ale nie mniej) grach wygrywa.
Jeśli chcesz przesłać rozwiązanie, możesz przeczytać naprawdę szczegółowe informacje na stronie https://github.com/prakol16/water-balloon-wars/tree/master .
Edytuj 3/8 :
Na razie są to końcowe wyniki (1000 iteracji, bez uwzględnienia graczy 1 i 2). Jeśli edytujesz swój post, możesz komentować, a ja powtórzę wyniki:
{
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
}
Zwycięzca uzyskał Weakling
średnio 39 punktów. Drugie miejsce zajęło Repeller
21 punktów.
speed
i strength
w konstruktorze odtwarzacza.
dirX
, dirY
oraz dirZ
(wzmacniany przez szczęścia) są po prostu dodaje się do prędkości balonu. Jeśli trafi go wiele osób (nieco mało prawdopodobne), gracz, który może zdobyć trzy punkty, decyduje o szczęściu (zobacz szczegółowe informacje)