Sie sind ein unternehmerischer Punkt, der das Land unter seiner Kontrolle vergrößern möchte. Dies ist ganz einfach: Reisen Sie außerhalb Ihres aktuellen Landes und kehren Sie in Ihr Land zurück. Alles, was sich in diesem Loop befindet, gehört Ihnen. Aber es gibt einen Haken. Wenn ein anderer Punkt irgendwie Ihre Schleife findet und sie kreuzt, sterben Sie.
Wenn Sie es noch nicht ausprobiert haben, gehen Sie zu Splix.io und probieren Sie ein Spiel aus. Verwenden Sie die Pfeiltasten, um Ihre Bewegung zu steuern.
GIF
Bildnachweis: http://splix.io/
Besonderheiten
Alle Spieler beginnen an zufälligen Positionen auf einem 200x200-Brett. (Ich behalte mir das Recht vor, dies zu ändern :). Sie müssen eine bestimmte Anzahl von Zügen ausführen, um die größtmögliche Anzahl von Punkten zu erreichen. Punkte werden gezählt von:
- Die Anzahl der getöteten Spieler beträgt 300
- Die Menge an Land, die Sie am Ende der Runde besitzen
Dies bringt den Punkt auf den Punkt, dass andere Ihr Land stehlen können. Wenn sie eine Schleife starten, die einen Teil Ihres Landes schneidet, können sie diese beanspruchen. Wenn Sie während der Runde sterben, verlieren Sie alle Punkte für diese Runde.
Jede Runde hat eine zufällig ausgewählte Gruppe von Spielern (maximal 5 einzigartige Spieler) (Änderungen vorbehalten). Jeder Spieler nimmt an einer gleichen Anzahl von Runden teil. Die endgültige Punktzahl Ihres Bots wird durch die durchschnittliche Punktzahl pro Spiel bestimmt. Jedes Spiel besteht aus 2000 Runden (Änderungen vorbehalten). Alle Bots machen ihre Züge zur gleichen Zeit.
Todesfälle
Kopfstoß
Beide Spieler sterben, wenn sie sich gegenseitig stoßen. Dies gilt auch dann, wenn sich beide Spieler am Rand ihres Feldes befinden.
Wenn sich jedoch nur einer der Spieler in seinem Land befindet, stirbt der andere Spieler.
Linienkreuz
In diesem Fall stirbt nur der lila Spieler.
Sie können Ihre eigene Linie nicht überschreiten.
Board verlassen
Wenn ein Spieler versucht, das Spielfeld zu verlassen, stirbt er und verliert alle Punkte.
Erfassungsbereich
Ein Spieler erobert ein Gebiet, wenn er eine Spur hat und er betritt wieder sein eigenes Land.
Rot füllt die beiden roten Linien aus. Der einzige Fall, in dem ein Spieler nicht ausfüllt, ist, wenn sich ein anderer Spieler in der Runde befindet. Dies gilt natürlich nur, wenn der andere Spieler selbst auf dem Laufenden ist und nicht nur Land, das ihm gehört. Ein Spieler kann Land von einer anderen Person erobern. Wenn ein Spieler das von seiner Spur umgebene Gebiet nicht ausfüllen kann, wird die Spur direkt in normales Land umgewandelt. Wenn der Spieler in der Landschleife eines anderen Spielers stirbt, wird der Bereich in dieser Schleife gefüllt. Jedes Mal, wenn ein Spieler stirbt, wird das Spielfeld auf einen Bereich überprüft, der ausgefüllt werden kann.
Steuerungsdetails
Der Controller ist hier . Es ist dem Originalspiel sehr ähnlich, aber es wurden kleine Änderungen vorgenommen, um es besser für KotH und aus technischen Gründen zu machen. Es wurde mit der KotHComm - Bibliothek von @ NathanMerrill und mit der erheblichen Hilfe von @ NathanMerrill erstellt. Bitte teilen Sie mir alle Fehler mit, die Sie auf dem Controller im Chat-Raum finden . Um mit KotHComm konsistent zu sein, habe ich Eclipse-Auflistungen im gesamten Controller verwendet, aber Bots können nur mit der Java-Auflistungsbibliothek geschrieben werden.
Alles ist in einem Uberjar auf der Github-Veröffentlichungsseite verpackt . Laden Sie es herunter und hängen Sie es an Ihr Projekt an, damit Sie es für die automatische Vervollständigung verwenden können (Anweisungen für IntelliJ , Eclipse ). Um Ihre Einsendungen zu testen, führen Sie das Glas mit java -jar SplixKoTH-all.jar -d path\to\submissions\folder
. Stellen Sie sicher, dass path\to\submissions\folder
ein Unterordner mit dem Namen vorhanden ist java
, und platzieren Sie alle Ihre Dateien dort. Verwenden Sie keine Paketnamen in Ihren Bots (obwohl dies mit KotHComm möglich ist, ist es nur ein bisschen schwieriger). Verwenden Sie, um alle Optionen anzuzeigen --help
. Verwenden Sie, um alle Bots zu laden --question-id 126815
.
Einen Bot schreiben
Um einen Bot zu schreiben, müssen Sie erweitern SplixPlayer
.
Direction makeMove(ReadOnlyGame game, ReadOnlyBoard board)
- Hier entscheidest du, welchen Zug dein Bot machen soll. Darf nicht null zurückgeben.
HiddenPlayer getThisHidden()
- Holen Sie sich die
HiddenPlayer
Version vonthis
. Nützlich, um Ihren Bot mit dem Board zu vergleichen.
- Holen Sie sich die
enum Direction
- Werte
East
(x = 1; y = 0)West
(x = -1; y = 0)North
(x = 0; y = 1)South
(x = 0; y = -1)
Direction leftTurn()
- Holen Sie sich das
Direction
, was Sie bekommen würden, wenn Sie links abbiegen würden.
- Holen Sie sich das
Direction RightTurn()
- Holen Sie sich das
Direction
, was Sie bekommen würden, wenn Sie rechts abbiegen würden.
- Holen Sie sich das
ReadOnlyBoard
Dies ist die Klasse, in der Sie auf das Board zugreifen. Sie können entweder eine lokale Ansicht (20x20) des Bretts mit den angezeigten Spielerpositionen oder eine globale Ansicht (das gesamte Brett) erhalten, in der nur angegeben ist, wer Positionen auf dem Brett besitzt und beansprucht. Hier bekommen Sie auch Ihre Position.
SquareRegion getBounds()
- Ermitteln Sie die Größe der Platine.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getGlobal()
- Holen Sie sich eine globale Karte des Boards.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getView()
- Das Gleiche wie
getGlobal()
, außer dass es auf einen Bereich von 20 x 20 um Ihren Spieler beschränkt ist und die Spielerpositionen anzeigt.
- Das Gleiche wie
Point2D getPosition(SplixPlayer me)
- Holen Sie sich die Position Ihres Spielers. Verwenden Sie als
board.getPosition(this)
.
- Holen Sie sich die Position Ihres Spielers. Verwenden Sie als
Point2D getSelfPosition(ReadOnlyBoard)
- Holen Sie sich Ihre Position auf dem Brett. Verwendung:
Point2D mypos = getSelfPosition(board)
- Holen Sie sich Ihre Position auf dem Brett. Verwendung:
ReadOnlyGame
ReadOnlyGame
Ermöglicht nur den Zugriff auf die Anzahl der verbleibenden Runden im Spiel int getRemainingIterations()
.
ReadOnlySplixPoint
HiddenPlayer getClaimer()
- Holen Sie sich die
HiddenPlayer
Version, die einen Punkt beansprucht - Claiming = eine Spur.
- Holen Sie sich die
HiddenPlayer getOwner()
- Holen Sie sich, wem ein Punkt gehört.
HiddenPlayer getWhosOnSpot()
- Wenn sich der Player an diesem Punkt befindet, geben Sie die verborgene Version davon zurück. Funktioniert nur in
getLocal()
.
- Wenn sich der Player an diesem Punkt befindet, geben Sie die verborgene Version davon zurück. Funktioniert nur in
Point2D
Im Gegensatz zu den anderen Klassen ist hier Point2D
in der KotHComm-Bibliothek enthalten.com.nmerrill.kothcomm.game.maps.Point2D
Point2D(int x, int y)
int getX()
int getY()
Point2D moveX(int x)
Point2D moveY(int y)
Point2D wrapX(int maxX)
- Wickeln Sie den
x
Wert so ein, dass er im Bereich von liegtmaxX
.
- Wickeln Sie den
Point2D wrapY(int maxY)
- Wickeln Sie den
y
Wert so ein, dass er im Bereich von liegtmaxY
.
- Wickeln Sie den
int cartesianDistance(Point2D other)
- Dies bedeutet, wie viele Runden ein Spieler brauchen würde, um von Punkt a zu Punkt b zu gelangen.
Clojure-Unterstützung
Der Clojure-Compiler ist im Lieferumfang von enthalten SplixKoTH-all.jar
, sodass Sie Clojure für Ihren Bot verwenden können! Informationen random_bot
zur Verwendung finden Sie unter my .
Einen Bot debuggen
Der Controller wird mit einem Debugger geliefert, der beim Testen von Strategien hilft. Um es zu starten, starte das Glas mit der --gui
Option.
Befolgen Sie diese Anweisungen für IntelliJ oder diese Anweisungen für Eclipse (ungetestete Eclipse-Version), um den Debugger an Ihr JAR anzuhängen .
Wenn Sie einen Debugger mit Ihrem Code verwenden, können Sie diesen verwenden, um zu visualisieren, was Ihr Bot sieht. Setzen Sie makeMove
auf Ihrem Bot einen Haltepunkt am Anfang von und stellen Sie sicher, dass nur der aktuelle Thread angehalten wird. Klicken Sie anschließend auf der Benutzeroberfläche auf die Schaltfläche "Start" und gehen Sie den Code durch.
Nun, um alles zusammen zu fassen:
Laufende Bots
Um Ihre Bots mit anderen zu betreiben, müssen Sie das jar auf der Releaseseite ausführen. Hier ist eine Liste von Flags:
--iterations
(-i
) <=int
(Standard500
)- Geben Sie die Anzahl der auszuführenden Spiele an.
--test-bot
(-t
) <=String
- Führen Sie nur die Spiele aus, in denen der Bot enthalten ist.
--directory
(-d
) <= Pfad- Das Verzeichnis, aus dem die Übermittlungen ausgeführt werden sollen. Verwenden Sie dies, um Ihre Bots auszuführen. Stellen Sie sicher, dass sich Ihre Bots in einem Unterordner des genannten Pfads befinden
java
.
- Das Verzeichnis, aus dem die Übermittlungen ausgeführt werden sollen. Verwenden Sie dies, um Ihre Bots auszuführen. Stellen Sie sicher, dass sich Ihre Bots in einem Unterordner des genannten Pfads befinden
--question-id
(-q
) <=int
(nur verwenden126815
)- Laden Sie die anderen Beiträge von der Website herunter und kompilieren Sie sie.
--random-seed
(-r
) <=int
(Standard ist eine Zufallszahl)- Geben Sie dem Läufer einen Samen, damit bei Bots, die zufällige Werte verwenden, die Ergebnisse reproduziert werden können.
--gui
(-g
)- Führen Sie den Debugger ui aus, anstatt ein Turnier auszuführen. Am besten mit
--test-bot
.
- Führen Sie den Debugger ui aus, anstatt ein Turnier auszuführen. Am besten mit
--multi-thread
(-m
) <=boolean
(Standardtrue
)- Führe ein Turnier im Multithread-Modus aus. Dies ermöglicht ein schnelleres Ergebnis, wenn Ihr Computer über mehrere Kerne verfügt.
--thread-count
(-c
) <=int
(Standard4
)- Anzahl der auszuführenden Threads, wenn mehrere Threads zulässig sind.
--help
(-h
)- Drucken Sie eine ähnliche Hilfemeldung.
Um alle Einsendungen auf dieser Seite auszuführen, verwenden Sie java -jar SplixKoTH-all.jar -q 126815
.
Formatieren Sie Ihren Beitrag
Um sicherzustellen, dass der Controller alle Bots herunterladen kann, sollten Sie dieses Format befolgen.
[BotName], Java // this is a header
// any explanation you want
[BotName].java // filename, in the codeblock
[code]
Verwenden Sie auch keine Paketdeklaration.
Anzeigetafel
+------+--------------+-----------+
| Rank | Name | Score |
+------+--------------+-----------+
| 1 | ImNotACoward | 8940444.0 |
| 2 | TrapBot | 257328.0 |
| 3 | HunterBot | 218382.0 |
+------+--------------+-----------+
Bitte lassen Sie mich wissen, wenn ein Teil der Regeln unklar ist oder wenn Sie Fehler in der Steuerung im Chatraum finden .
Habe Spaß!
quelle
Antworten:
ImNotACoward, Java
Dieser Bot ist ein Überlebensexperte für
Feiglinge. Wenn sich kein Feind in der Nähe befindet, beansprucht er einen Teil des Landes. Wenn die Schleife eines anderen Spielers sicher erreicht werden kann,sticht er den anderen Spieler in den Rücken undverwickelt den anderen Spieler in ein Duell. Wenn der andere Spieler nicht sicher angegriffen werden kann, führt dieFluchteinen strategischen Rückzug in sein eigenes Land durch.quelle
TrapBot, Java
Dies ist vielleicht der einfachste Bot. Alles, was es tut, ist, die Kante des Bretts aufzuspüren und sich auf sich selbst zu verdoppeln, um das Risiko zu verringern, getötet zu werden.
quelle
random_bot, Clojure
Dies ist RandomBot , aber ich musste mich an die Namenskonventionen halten, und einige Probleme hinderten mich daran, den Bindestrich im Namen zu verwenden. Der
make-move
Fn gibt einen VEC zurück, wobei der erste Gegenstand derjenige ist, in denDirection
Sie einziehen möchten, und der zweite der Zustand ist, den Sie in der nächsten Runde zurückgeben möchten. Verwenden Sie keine externen Atome, da dieser Code möglicherweise mehrere Spiele gleichzeitig ausführt.quelle
HunterBot, Java
Einer der grundlegendsten Bots. Es durchsucht das Spielfeld nach Stellen, an denen andere getötet werden können, und folgt dem kürzesten Weg, um eine Tötungsposition zu erreichen. Wenn es sich außerhalb seines Territoriums befindet, führt es zufällige Züge aus, bis es eine weitere Öffnung hat, um einen anderen Spieler zu töten. Es hat eine Logik, um zu verhindern, dass es über sich selbst läuft, und wenn alle anderen Spieler tot sind, kehrt es zu seiner Heimat zurück. Zuhause angekommen geht es nur noch auf einem kleinen Platz.
quelle