Asymmetrische KOTH: Fangen Sie die Katze
UPDATE : Die Gist-Dateien werden aktualisiert (einschließlich neuer Untermischungen), da die Controller.java keine Ausnahmen abfängt (nur Fehler). Es werden nun Fehler und Ausnahmen abgefangen und auch gedruckt.
Diese Herausforderung besteht aus zwei Fäden, dies ist der Fadenfänger ist, kann die Katze Thread gefunden werden hier .
Der Controller kann hier heruntergeladen werden .
Dies ist eine asymmetrische KOTH: Jede Vorlage ist entweder eine Katze oder ein Fänger . Es gibt Spiele zwischen jedem Paar einer Katze und einem Fänger. Die Katzen und die Fänger haben getrennte Ranglisten.
Fänger
Es gibt eine Katze auf einem sechseckigen Gitter. Ihre Aufgabe ist es, es so schnell wie möglich zu fangen. In jeder Runde können Sie einen Wassereimer auf eine Gitterzelle stellen, um zu verhindern, dass die Katze dorthin kann. Aber die Katze ist (vielleicht) nicht so dumm, und wenn Sie einen Eimer platzieren, bewegt sich die Katze in eine andere Gitterzelle. Da das Gitter sechseckig ist, kann die Katze in 6 verschiedene Richtungen gehen. Ihr Ziel ist es, die Katze mit Wassereimern zu umgeben, je schneller desto besser.
Katze
Sie wissen, dass der Fänger Sie fangen möchte, indem er Wassereimer um Sie herum stellt. Natürlich versuchst du auszuweichen, aber da du eine faule Katze bist (so wie Katzen), machst du genau einen Schritt nach dem anderen. Dies bedeutet, dass Sie nicht an dem Ort bleiben können, an dem Sie sich befinden, sondern an einem der sechs umliegenden Orte. Immer wenn Sie sehen, dass der Fänger einen neuen Wassereimer aufgestellt hat, gehen Sie in eine andere Zelle. Natürlich versuchen Sie, so lange wie möglich auszuweichen.
Gitter
Das Gitter ist hexagonal, aber da wir keine hexagonalen Datenstrukturen haben, nehmen wir ein 11 x 11
quadratisches 2D-Array und ahmen das hexagonale "Verhalten" nach, das die Katze nur in 6 Richtungen bewegen kann:
Die Topologie ist toroidal, dh wenn Sie eine Zelle außerhalb des Arrays betreten, werden Sie nur in die entsprechende Zelle auf der anderen Seite des Arrays übertragen.
Spiel
Die Katze startet an einer bestimmten Position im Gitter. Der Fänger kann den ersten Zug machen, dann bewegen sich die Katze und ihr Fänger abwechselnd, bis die Katze gefangen ist. Die Anzahl der Schritte ist die Punktzahl für dieses Spiel. Die Katze versucht eine möglichst hohe Punktzahl zu erzielen, der Fänger versucht eine möglichst niedrige Punktzahl zu erzielen. Die durchschnittliche Summe aller Spiele, an denen Sie teilgenommen haben, ist die Punktzahl Ihrer Einreichung. Es gibt zwei separate Ranglisten, eine für die Katze und eine für die Fänger.
Regler
Der angegebene Controller ist in Java geschrieben. Als Fänger oder Katze müssen Sie jeweils eine Java-Klasse komplett implementieren (es gibt bereits einige primitive Beispiele) und diese in die platzierenplayers
Paket einfügen (und die Liste der Katzen / Fänger in der Controller-Klasse aktualisieren). Sie können jedoch auch schreiben zusätzliche Funktionen innerhalb dieser Klasse. Der Controller wird mit jeweils zwei Arbeitsbeispielen für einfache Katzen- / Fängerklassen geliefert.
Das Feld ist ein 11 x 11
2D- int
Array, das die Werte der aktuellen Zustände der Zellen speichert. Wenn eine Zelle leer ist, hat sie einen Wert 0
, wenn es eine Katze gibt, hat sie einen Wert -1
und wenn es einen Eimer gibt, gibt es einen 1
.
Es gibt ein paar bestimmten Funktionen , die Sie verwenden können: isValidMove()
/ isValidPosition()
sind zu überprüfen , ob Ihr Zug (cat) / Position (Fänger) gültig ist.
Jedes Mal, wenn Sie an der Reihe sind, wird Ihre Funktion takeTurn()
aufgerufen. Das Argument enthält eine Kopie des aktuellen Rasters und verfügt über Methoden read(i,j)
zum Lesen der Zelle (i,j)
unter sowie zum isValidMove()/ isValidPosition()
Überprüfen der Gültigkeit Ihrer Antwort. Hiermit wird auch das Umbrechen der Toroid-Topologie verwaltet. Das bedeutet, dass Sie auch dann auf die Zelle (-5,13) zugreifen können, wenn das Raster nur 11 x 11 ist.
Die Methode sollte ein int
Array von zwei Elementen zurückgeben, die mögliche Bewegungen darstellen. Für die Katzen sind {-1,1},{0,1},{-1,0},{1,0},{0,-1},{1,-1}
dies die relativen Positionen, in die die Katze gehen möchte, und die Fänger geben die absoluten Koordinaten zurück, in die sie einen Eimer stellen möchten {i,j}
.
Wenn Ihre Methode einen ungültigen Zug ergibt, wird Ihr Beitrag disqualifiziert. Der Umzug gilt als ungültig, wenn sich an Ihrem Ziel bereits ein Eimer befindet oder der Umzug nicht erlaubt / das Ziel bereits belegt ist (als Katze) oder wenn sich bereits ein Eimer / eine Katze (als Fänger) befindet. Das können Sie vorher mit den angegebenen Funktionen überprüfen.
Ihre Einreichung sollte relativ schnell funktionieren. Wenn Ihre Methode für jeden Schritt länger als 200 ms dauert, wird sie ebenfalls disqualifiziert. (Am liebsten viel weniger ...)
Die Programme dürfen Informationen zwischen den Schritten speichern.
Einreichungen
- Sie können so viele Beiträge einreichen, wie Sie möchten.
- Bitte ändern Sie Ihre bereits eingereichten Beiträge nicht wesentlich.
- Bitte jede Einsendung in einer neuen Antwort.
- Jeder Beitrag sollte vorzugsweise einen eindeutigen Namen haben.
- Die Einreichung sollte aus dem Code Ihrer Klasse sowie einer Beschreibung bestehen, aus der hervorgeht, wie Ihre Einreichung funktioniert.
- Sie können die Zeile
<!-- language: lang-java -->
vor Ihrem Quellcode schreiben , um eine automatische Hervorhebung der Syntax zu erhalten.
Wertung
Alle Katzen treten gleich oft gegen alle Fänger an. Ich werde versuchen, die aktuellen Ergebnisse regelmäßig zu aktualisieren. Die Gewinner werden ermittelt, wenn die Aktivität abgenommen hat.
Diese Herausforderung ist von diesem alten Flash-Spiel inspiriert
Vielen Dank an @PhiNotPi für das Testen und das konstruktive Feedback.
Aktuelle Ergebnisse (100 Spiele pro Paarung)
Name Score Rank Author
RandCatcher 191674 8 flawr
StupidFill 214246 9 flawr
Achilles 76820 6 The E
Agamemnon 74844 5 The E
CloseCatcher 54920 4 randomra
ForwordCatcher 94246 7 MegaTom
Dijkstra 46500 2 TheNumberOne
HexCatcher 48832 3 randomra
ChoiceCatcher 43828 1 randomra
RandCat 77928 7 flawr
StupidRightCat 81794 6 flawr
SpiralCat 93868 5 CoolGuy
StraightCat 82452 9 CoolGuy
FreeCat 106304 3 randomra
RabidCat 77770 8 cain
Dijkstra's Cat 114670 1 TheNumberOne
MaxCat 97768 4 Manu
ChoiceCat 113356 2 randomra
PRINT_STEPS = true
genauere Einstellungen in der Datei vornehmen MyFrame.java
). Dann habe ich das mit LICEcap aufgenommen und mit GIMP bearbeitet . Bei weiteren Fragen einfach fragen!