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 doubles. 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ć movemetodę. To jest przykładowa movemetoda:
@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 xkierunku i ykierunku. 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^2tam gdzie sjest wasza siła, i x, yi zsą kierunki, które uderzają Twoje działanie zostanie odrzucone. Siła twojego trafienia jest wzmacniana przez losową liczbę pomiędzy 0i luck(co oznacza, że może spaść, jeśli twoje szczęście jest mało).
Podobnie możesz zwrócić a Movementza pomocą współrzędnych xi y, które poruszasz (pamiętaj, że nie możesz skakać w powietrzu). Jeśli x^2 + y^2 > s^2gdzie sjest 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 Repeller21 punktów.
speedi strengthw konstruktorze odtwarzacza.
dirX, dirYoraz 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)
