Dieses King-of-the-Hill-Spiel ist ein Strategiespiel, bei dem Sie einen Wasserballon umrunden und vermeiden müssen, von Wasser bespritzt zu werden. Das Ziel ist es, die meisten Punkte zu erzielen. Sie erhalten eine Karte des Feldes und den Standort des Wasserballons. Sie können entweder zurückgeben, dass Sie den Wasserballon treffen möchten (wenn Sie nahe genug sind), oder dass Sie sich in eine bestimmte Richtung bewegen möchten.
Insbesondere: Der Wasserballon startet bei (0, 0)
30 Einheiten und fällt ab. Wenn der Wasserballon auf dem Boden aufschlägt, wird ein Spieler nach dem Zufallsprinzip ausgewählt, um 4 Punkte zu verlieren, wobei denjenigen, die sich näher am Ballon befinden, mehr Gewicht verliehen wird. Zusätzlich erhält der Spieler, der zuletzt den Ballon geschlagen hat, 3 Punkte. Wenn Sie also den Ballon gerade treffen, verlieren Sie höchstwahrscheinlich 1 Punkt.
Sie werden eine Klasse schreiben, die erweitert wird Player
. Sie müssen den Konstruktor implementieren. Der Konstruktor sieht folgendermaßen aus:
public Player1() {
super(/* Some numbers */ 3, 3, 4)
}
Diese Zahlen sind double
s. Die erste Zahl steht für die Geschwindigkeit des Spielers, die zweite für die Stärke und die dritte für das Glück. Die Zahlen müssen 10 oder weniger ergeben und keine Zahl darf kleiner oder gleich Null sein.
Zweitens müssen Sie die move
Methode implementieren . Dies ist eine Beispielmethode 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));
}
}
Hier gibt es eine Reihe wichtiger Dinge. Beachten Sie zunächst, dass das Feld als übergeben wird Map<Player, Point2D>
. Das Feld ist unendlich - es gibt keine Begrenzung, wie weit Sie gehen können. Es ist kein zweidimensionales Array oder ähnliches. Dies bedeutet außerdem, dass Sie als Standort nicht ganzzahlige Koordinaten verwenden. Das ist vollkommen in Ordnung.
Eine weitere Folge ist, dass sich Spieler und Ballon überlappen können. Tatsächlich können sich zwei Spieler genau am selben Ort befinden!
Der Ballon hat eine bestimmte Geschwindigkeit und Richtung. Im Allgemeinen sinkt die Rate um 3 Einheiten / Schritt. Es bewegt sich auch in eine x
Richtung und y
Richtung. Wenn Sie a zurückgeben Hit
, übergeben Sie die x-, y- und z-Richtungen, in die Sie die Sprechblase drücken. Sie können nicht einen Ballon , deren Höhe größer als 10 oder deren Entfernung von Ihnen (nur auf zwei Dimensionen) größer ist als 4. Zusätzlich schlagen, wenn es wahr ist , dass , x^2 + y^2 + z^2 > s^2
wo s
Ihre Stärke ist, und x
, y
und z
sind die Anweisungen , die Sie getroffen Ihre Aktion wird verworfen. Die Stärke deines Treffers wird durch eine Zufallszahl zwischen 0
und verstärkt luck
(was bedeutet, dass er sinken kann, wenn dein Glück gering ist).
Ebenso können Sie Movement
mit den Koordinaten x
und y
, die Sie bewegen, ein zurückgeben (beachten Sie, dass Sie nicht in die Luft springen können). Wenn x^2 + y^2 > s^2
wo s
deine Geschwindigkeit ist, wird deine Aktion verworfen.
Wenn der Wasserballon auf dem Boden aufschlägt, wird ein zufälliger Spieler ausgewählt, bei dem denjenigen, die am nächsten sind, mehr Gewicht beigemessen wird - aber denjenigen, die mehr Glück haben, weniger. Der gewählte Spieler verliert 4 Punkte.
Controller: https://github.com/prakol16/water-balloon-wars/tree/master
Das Spiel dauert 1000 Schritte. Am Ende wird eine Datei aufgerufen log.out
. Kopieren Sie die Daten und fügen Sie sie in diese Geige ein, um das Spiel anzuzeigen: https://jsfiddle.net/prankol57/s2x776dt/embedded/result/
Oder noch besser, sehen Sie es sich in 3D an: http://www.brianmacintosh.com/waterballoonwars (danke an BMac)
Der Spieler mit der höchsten Punktzahl nach 100 (möglicherweise mehr, aber nicht weniger) Spielen gewinnt.
Wenn Sie eine Lösung einreichen möchten, können Sie die wirklich spezifischen Details unter https://github.com/prakol16/water-balloon-wars/tree/master lesen .
Edit 3/8 :
Dies sind die Endergebnisse für den Moment (1000 Iterationen, ohne Spieler 1 und 2). Wenn Sie Ihren Beitrag bearbeiten, können Sie einen Kommentar abgeben, und ich werde die Ergebnisse wiederholen:
{
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
}
Der Gewinner war Weakling
mit durchschnittlich 39 Punkten. Der 2. Platz war Repeller
mit 21 Punkten.
speed
und strength
im Player-Konstruktor invertiert .
dirX
, dirY
und dirZ
(durch Ihr Glück verstärkt) werden einfach auf die Geschwindigkeiten des Ballons hinzugefügt. Wenn mehrere Spieler es treffen (etwas unwahrscheinlich), entscheidet sich der Spieler, der möglicherweise drei Punkte erzielt (siehe Einzelheiten)