Dies ist ein König der Hügel Herausforderung für Dots and Boxes (auch bekannt als Pen the Pig). Das Spiel ist einfach, wenn Sie an der Reihe sind, ziehen Sie einfach eine Linie auf einen leeren Zaun. Jedes Mal, wenn Sie ein Quadrat vervollständigen, erhalten Sie einen Punkt. Da wir nach den Regeln der Meisterschaft spielen , erhalten Sie einen zusätzlichen Zug, wenn Sie mindestens ein Feld in Ihrem Zug vervollständigen. Dies ist ein Round-Robin-Turnier, bei dem jeder Bot zweimal zwölf Mal in einem 9x9-Raster gegeneinander spielt . Schauen Sie sich dieses Match zwischen zwei Schwergewichts-Titanen an, bei dem ChainCollector das Hackfleisch des amtierenden Co-Champions Asdf zubereitet:
Regeln
- 0,5 Sekunden Zeitlimit pro Zug.
- Keine Beeinträchtigung anderer Bots.
- Verwenden Sie PigPen.random () und PigPen.random (int) für die Zufälligkeit.
- Kein Schreiben in Dateien.
- Der Bot und alle seine persistenten Daten werden jedes Mal zurückgesetzt, wenn sich der Gegner ändert (alle 12 Runden).
Bots
Jeder Bot erweitert Player.java:
package pigpen;
public abstract class Player {
public abstract int[] pick(Board board, int id, int round);
}
Board
ist das Spielbrett, das hauptsächlich dazu dient, Ihnen den Zugang zu Pen
Klassen zu ermöglichen, und id
ist Ihre Spieler-ID (gibt an, ob Sie der Erste oder der Zweite sind) und round
gibt an, in welcher Runde Sie gegen denselben Gegner spielen (1 oder 2). Der Rückgabewert ist ein int[]
, wobei das erste Element die penID (1-indiziert) und das zweite Element die fenceID (0-indiziert) ist. In finden Sie Pen.pick(int)
eine einfache Möglichkeit, diesen Rückgabewert zu generieren. Auf der Github- Seite finden Sie Beispiele für Player und JavaDoc. Da wir nur ein quadratisches Gitter verwenden, ignorieren Sie alle Funktionen und Felder, die sich auf Sechsecke beziehen.
Wie man läuft
- Quelle von Github herunterladen.
- Schreiben Sie Ihren Controller-Bot (achten Sie darauf, ihn einzuschließen
package pigpen.players
) und legen Sie ihn in densrc/
Ordner. - Kompilieren mit
javac -cp src/* -d . src/*.java
. Ausführen mitjava pigpen.Tournament 4 9 9 false
(Die letzten beiden Zahlen können geändert werden, umtrue
die Rastergröße anzupassen. Die letzte Variable sollte nur festgelegt werden, wenn Sie die Software pp_record verwenden möchten.)
Scores
- ChainCollector: 72
- Asdf: 57
- Lazybones: 51
- Finisher: 36
- = LinearPlayer: 18
- = BackwardPlayer: 18
- RandomPlayer: 0
Siehe auch:
Hinweis : Dieses Spiel ist eine Herausforderung für den Wettbewerb und nicht leicht zu lösen, da die Spieler einen zusätzlichen Zug zum Ausfüllen einer Schachtel erhalten.
Vielen Dank an Nathan Merrill und Darrel Hoffman für die Beratung zu dieser Herausforderung!
Aktualisierungen :
- Der
moves(int player)
Klasse "Brett" wurde eine Methode hinzugefügt , um eine Liste aller von einem Spieler ausgeführten Züge abzurufen.
Unbestimmte Prämie (100 Wiederholungen) :
Die erste Person, die eine Lösung veröffentlicht, die jede Runde gewinnt und eine Strategie anwendet (Anpassung des Spiels basierend auf der Beobachtung, wie der Gegner spielt).
quelle
Antworten:
Faulpelz
Dieser Bot ist faul. Er wählt einen zufälligen Punkt und eine zufällige Richtung und baut in dieser Richtung weiter, ohne sich zu sehr zu bewegen. Es gibt nur 2 Fälle, in denen er etwas anderes macht:
quelle
pen.n(Pen.LEFT)
(Nachbarfunktion).pick()
Methode hat jetzt einenint round
Parameter am Ende, wenn Sie das also bitte hinzufügen könnten.ChainCollector
Dieser Bot mag Ketten 1 . Er will so viel wie möglich von ihnen. Manchmal opfert er sogar einen kleinen Teil einer Kette, um einen größeren zu gewinnen.
[1] Eine Kette besteht aus Stiften, die durch offene Zäune verbunden sind, wobei jeder Stift 1 oder 2 offene Zäune hat. Wenn ein einzelner Stift der Kette fertiggestellt werden kann, kann aufgrund der Meisterschaftsregel auch die gesamte Kette fertiggestellt werden.
quelle
Finisher
Verwendet einen Komparator, um den Stift mit den meisten verfügbaren Zäunen auszuwählen. Stiften mit nur einem verfügbaren Zaun wird jedoch Vorrang eingeräumt. (7 wird anstelle von 5 verwendet, damit dieser Code auch im Hexagon-Modus funktioniert.)
quelle
Asdf
Weist jedem Zaun eine Punktzahl zu und wählt dann das Beste aus ihnen aus. Beispiel: Ein Stift mit einem offenen Zaun hat eine Punktzahl von 10, während ein Stift mit zwei offenen Zäunen eine Punktzahl von -8 hat.
Es scheint, als würde Lazybones eine ähnliche Strategie anwenden , weil sie mit diesem Bot verbunden ist.
quelle
LinearPlayer
Der einfachste Weg, diesen Bot zu schreiben, ist tatsächlich
return null
, weil ein ungültiger Eintrag automatisch den ersten verfügbaren Zaun auswählt. Dieser Code verwendet keine Verknüpfungsmethoden und generiert den Rückgabewert manuell.quelle
BackwardPlayer
Dieser Code verwendet die Shortcut-Methode
Pen.pick(int)
, um den Rückgabewert zu generieren. Wenn der obere Zaun nicht verfügbar ist, wählt er den nächsten verfügbaren Zaun im Uhrzeigersinn aus.quelle
RandomPlayer
Entspricht dem BackwardPlayer, wählt jedoch einen Stift nach dem Zufallsprinzip aus. Beachten Sie, dass die
+1
Stifte 1-indiziert sind.quelle