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.
źródło
speed
istrength
w konstruktorze odtwarzacza.dirX
,dirY
orazdirZ
(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)Odpowiedzi:
Symulator
Mam nadzieję, że to w porządku, ponieważ tak naprawdę nie jest to wpis. Bardzo podobał mi się pomysł symulatora wizualnego i chciałem stworzyć własny, który sprawiłby, że trochę łatwiej było zobaczyć wszystko na raz (pełne 3D).
2/28 9:06 PST : aktualizacja z kontrolkami follow, kolorami
3/4 08:47 PST : aktualizacja za pomocą suwaka dla prędkości symulacji i sprawiła, że uruchomienie nowej gry faktycznie działa bez odświeżania strony (użyj Ctrl-F5, aby ponownie załadować buforowany skrypt)
Wizualizator ThreeJS online
źródło
Tam i z powrotem
Ten bot próbuje się zbliżyć i uderzyć balonem, dopóki jego wysokość nie będzie zbyt niska i spróbuje uciec.
źródło
AngryPenguin
Ten pingwin jest zły, ponieważ nie może polecieć do balonu, więc próbuje uderzyć balonem w twarz stojących wokół niego ludzi.
źródło
Słabeusz
Ten bot może tylko dotknąć balonu, ponieważ jest tak słaby, zamiast tego polega na swoim szczęściu. Dlatego działa podobnie do LuckyLoser (z którego ten bot jest zainspirowany).
Wydaje się, że wykonuje wszystkie obecne boty, w tym Repeller.
EDYCJA: zmniejszona prędkość na korzyść szczęścia
źródło
Hydrofob
Jest to jeden z najprostszych możliwych botów, ale ponieważ jest konkurencyjny, opublikuję go.
Strategia: cóż ... ten bot nienawidzi wody, więc po prostu znika.
Ponieważ bot będzie rozpryskiwany bardzo rzadko, uzyska średnio nieco poniżej 0 punktów. Suma wszystkich wyników botów wynosi -1 * [balon uderza w ziemię], więc Hydrophobe prawdopodobnie uzyska wynik powyżej średniej.
źródło
Trzymaj się z daleka
Gracz ten goni balon, dopóki jego wysokość wynosi> 2. Gdy tylko trafi w balon, uderza w balon z dala od najbliższego gracza. Gdy wysokość balonu wynosi <2, ten gracz ucieka.
Edycja: Grałem z Player1 i Player2 włącznie. W takim przypadku ten gracz wygrywa, ale przegrywa, gdy go wyjmuję. Booooo.
źródło
Szczęśliwy przegrany
Ten bot opiera się na wysokim wyniku szczęścia. Jeśli nie znajduje się w pobliżu balonu, biegnie w kierunku balonu. Gdy znajdzie się w pobliżu balonu, jeśli w zasięgu balonu będzie co najmniej 2 innych graczy, wyrzuci go na ziemię. W przeciwnym razie podrzuci go prosto.
EDYCJA: Naprawiono błąd ruchu, który sprawiał, że uciekałem nie w stronę balonu> _ <Teraz biegnę prosto w kierunku balonu, jeśli nie mogę go trafić.
źródło
Odstraszacz
Ten bot polega tylko na jednym prawdziwym ruchu i polega na tym, aby odepchnąć balon od siebie. tzn. odpycha balon.
Wygląda na to, że dobrze sobie radzi z obecną liczbą botów (LuckyLoser, AngryPenguin, Hydrophobe, BackAndForth) prawie zawsze wygrywając. Jednak Hydrophobe, przez bezczynność, jest zawsze gotowy na zwycięstwo, jeśli wszystkim innym botom uda się uzyskać wynik ujemny: P
źródło