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.
quelle
speed
undstrength
im Player-Konstruktor invertiert .dirX
,dirY
unddirZ
(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)Antworten:
Simulator
Ich hoffe das ist okay, da es eigentlich kein Eintrag ist. Ich mochte die Idee des visuellen Simulators sehr und wollte meinen eigenen erstellen, der es ein wenig einfacher macht, alles auf einmal zu sehen (volles 3D).
28.02.09 : 06 Uhr PST : Update mit folgenden Steuerelementen, Farben
04.03., 08:47 Uhr PST : Aktualisierung mit einem Schieberegler für die Simulationsgeschwindigkeit und Start eines neuen Spiels ohne Aktualisierung der Seite (verwenden Sie Strg-F5, um das zwischengespeicherte Skript neu zu laden)
Online ThreeJS Visualizer
quelle
Hin und her
Dieser Bot versucht, sich dem Ballon zu nähern und ihn zu treffen, bis seine Höhe zu niedrig ist und er versucht zu entkommen.
quelle
AngryPenguin
Dieser Pinguin ist wütend, weil er nicht zum Ballon fliegen kann und versucht, den Ballon in das Gesicht von Menschen zu schlagen, die um ihn herum stehen.
quelle
Schwächling
Dieser Bot kann den Ballon nur berühren, weil er so schwach ist, stattdessen verlässt er sich nur auf sein großes Glück. Es verhält sich daher ähnlich wie LuckyLoser (von dem dieser Bot inspiriert ist).
Er scheint alle aktuellen Bots zu übertreffen, einschließlich Repeller.
EDIT: Geschwindigkeit zugunsten des Glücks reduziert
quelle
Hydrophob
Dies ist einer der einfachsten möglichen Bot, aber da es wettbewerbsfähig ist, werde ich es veröffentlichen.
Strategie: Nun ... dieser Bots hasst Wasser, also geht es einfach weg.
Da der Bot sehr selten bespritzt wird, erzielt er im Durchschnitt etwas weniger als 0 Punkte. Die Summe aller Bots ergibt -1 * (Ballonschlag), sodass Hydrophobe wahrscheinlich überdurchschnittlich gut abschneidet.
quelle
Bleib weg
Dieser Spieler jagt den Ballon, solange seine Höhe> 2 ist. Sobald er den Ballon treffen kann, schlägt er den Ballon vom nächsten Spieler weg . Wenn der Ballon eine Höhe von <2 hat, rennt dieser Spieler davon.
Edit: Ich habe mit Player1 und Player2 gespielt. Dieser Spieler gewinnt in diesem Fall, verliert aber, wenn ich ihn herausnehme. Booooo.
quelle
Glücklicher Verlierer
Dieser Bot verlässt sich auf seine hohe Glücksquote. Wenn es sich nicht in der Nähe des Ballons befindet, läuft es in Richtung des Ballons. Sobald er sich dem Ballon nähert und sich mindestens zwei andere Spieler in Reichweite des Ballons befinden, stößt er ihn auf den Boden. Andernfalls klopft er sofort an.
BEARBEITEN: Bewegungsfehler behoben, der dazu führte, dass ich nicht zum Ballon rannte> _ <Jetzt renne ich direkt zum Ballon, wenn ich ihn nicht treffen kann.
quelle
Repeller
Dieser Roboter muss nur eine einzige echte Bewegung ausführen, und zwar, um den Ballon weiter von sich wegzuschieben. dh stößt den Ballon ab.
Es scheint eine gute Leistung gegen die aktuelle Ernte von Bots (LuckyLoser, AngryPenguin, Hydrophobe, BackAndForth) zu bringen, die fast immer gewinnen. Durch Untätigkeit ist Hydrophobe jedoch immer bereit zu gewinnen, wenn die anderen Bots alle eine negative Punktzahl erzielen: P
quelle