https://en.wikipedia.org/wiki/Losing_chess
Dies ist im Grunde ein Schachturnier , aber für Antichess;)
Antichess ist eine der vielen erfundenen Schachvarianten . Das Ziel ist es, alle deine Teile zu verlieren (das mag etwas seltsam erscheinen, aber es wird aus einem bestimmten Grund Antichess genannt).
Die Regeln
Die Regeln für Antichess sind denen für Standardschach sehr ähnlich - allerdings mit ein paar kleineren Unterschieden. Das Ziel, wie ich oben erwähnte, ist es, alle Ihre Stücke zu verlieren. Wenn Ihr Gegner die Möglichkeit hat, eine Ihrer Figuren zu erobern, ist dies der einzige Zug, den er ausführen kann. Wenn Sie ihm mehrere Chancen in einer Runde geben, kann der andere Spieler seine Runde wählen. Eine andere Sache, die geändert wird, ist, dass der König keine besonderen Kräfte hat - wie in können Sie Ihren Gegner nicht schachmatt setzen, und Sie können ihn nicht in Schach zwingen.
Die folgenden Änderungen am Standardspiel werden ebenfalls angewendet (sie helfen, das Spiel zu vereinfachen):
- En passant wird ignoriert.
- Rochade ist nicht möglich.
- Die Fünfzig-Züge-Regel gilt automatisch (dh das Spiel endet unentschieden).
- Bauern können wählen, wofür sie werben.
- Wenn ein Spieler länger als 2 Sekunden braucht, um sich zu bewegen, verliert er das Spiel.
- Wenn Sie einen ungültigen Zug wiederholen, verlieren Sie das Spiel.
- Um zu gewinnen, müssen Ihre Gegner alle Ihre Spielsteine erobern .
- Weiß beginnt das Spiel.
- Weiß steht "unten" im Feld (y = 0), Schwarz oben (y = 7).
- Der Zugriff auf andere Ressourcen als Ihren Bot (Internet, Dateien, andere Bots, ...) ist verboten.
Wertung
- Das Gewinnen gewährt Ihnen 3 Punkte, ein Unentschieden 1 Punkt und das Verlieren 0 Punkte.
- Jede Einreichung wird 10 Mal gegeneinander gespielt (5 Mal so weiß, 5 Mal so schwarz).
Schreibe deinen Bot
Der Controller-Code ist hier: https://github.com/JJ-Atkinson/SimpleAntichessKOTH
Sie können Ihren Bot entweder in Java oder Groovy schreiben. Um einen Bot zu schreiben, müssen Sie die Player
Klasse erweitern. Die Spielerklasse hat eine abstrakte Methode Move getMove(Board board, Player enemy, Set<Move> validMoves)
.
Hier ein kurzer Überblick über nützliche Methoden:
Player
:
List<Piece> getPieces(Board board)
: Gib alle deine Teile zurück, die auf dem Brett liegen.PieceUpgradeType pieceUpgradeType
: Wenn / wenn einer Ihrer Bauern das Ende des Bretts erreicht, müssen Sie dies auf den Typ der Spielfigur festlegen, auf die Sie upgraden möchten. Sie haben die WahlROOK
,KNIGHT
,QUEEN
,BISHOP
, undKING
.
Board
:
Field getFieldAtLoc(Location loc)
: Geben Sie dasField
am Standort zurück. Dies hat eine passendegetAt
Methode, so dass Sie schreiben können, wenn Sie Groovy verwendenboard[loc]
.Field getFieldAtLoc(int x, int y)
: Geben Sie dasField
am Standort zurück. Dies hat eine passendegetAt
Methode, so dass Sie schreiben können, wenn Sie Groovy verwendenboard[x, y]
.Board movePiece(Player player, Move move)
: Machen Sie eine Bewegung auf dem Brett, damit Sie sehen können, wie es ausgehen würde. Es gibt das neue Board zurück.
Wenn Sie die Teile Ihres Gegners sehen möchten, schreiben Sie einfach enemy.getPieces(board)
. Um Ihren Bot zur Aufstellung hinzuzufügen, fügen Sie die folgende Zeile hinzu PlayerFactory
:
put(YourBot.class, { new YourBot() } )
Debuggen Ihres Bots:
Ich habe ein paar Tools beigefügt, die Ihnen beim Debuggen Ihrer Bots helfen sollen. Um Ihr Spiel live zu sehen, können Sie das Game#DEBUG
Flag auf true setzen. Sie erhalten eine Ausgabe wie diese:
Game started. Players: [OnePlayBot(WHITE), SacrificeBot(BLACK)]
...
BLACKs turn.
validMoves: [Move(Piece(BLACK, PAWN, Loc(0, 6)), Loc(0, 5)), ...]
board:
RKBQIBKR
PPPPPPPP
--------
--------
--------
p-------
-ppppppp
rkbqibkr
captureless turns: 1
chosen move: Move(Piece(BLACK, PAWN, Loc(7, 6)), Loc(7, 4))
Game over? false
==============================
WHITEs turn.
validMoves: [Move(Piece(WHITE, ROOK, Loc(0, 0)), Loc(0, 1)), ...]
board:
RKBQIBKR
PPPPPPP-
--------
-------P
--------
p-------
-ppppppp
rkbqibkr
...
(Weiß ist Großbuchstabe, der König wird mit angezeigt i
)
Wenn Ihre Konsole utf-8-Sonderzeichen unterstützt, können Sie das Brett sogar mit den Schachzeichen anzeigen, indem Sie Folgendes verwenden Board#USE_UTF8_TO_STRING
:
♜♞♝♛♚♝—♜
♟—♟♟♟♟♟♟
————————
—♟——————
————————
♙———————
—♙♙♙♙♔♙♙
♖♘♗♕—♗♘♖
(es sieht besser aus mit einer Mono-Schriften)
Um eine Flut unerwünschter Ausgaben zu vermeiden, sollten Sie die Main#main
Funktion folgendermaßen ändern :
new Game(new MyBot(), new SacrificeBot()).run()
Platziere deinen Bot links, um als Weiß zu spielen, und rechts, um als Schwarz zu spielen.
Aufbau des Controllers:
Der Controller ist in Groovy geschrieben, Sie müssen also Java und Groovy installiert haben. Wenn Sie Groovy nicht installieren möchten, können Sie die mit dem Controller gelieferte Gradle-Build-Datei verwenden (diese wurde nicht getestet). Wenn Sie Groovy oder Gradle nicht verwenden möchten, können Sie das neueste Release-Jar verwenden ( https://github.com/JJ-Atkinson/SimpleAntichessKOTH/releases ). In diesem Fall müssen Sie Ihre eigene main
Methode erstellen und Ihren Bot manuell zur Player-Factory hinzufügen. Beispiel:
PlayerFactory.players.put(YourBot.class, { new YourBot() } )
new Runner().runGames();
(Beachten Sie, dass Sie immer noch die Debug-Flags und Sachen setzen können)
Jede und jede Fehlersuche ist erwünscht!
Scores:
SearchBot -> 101
SacrificeBot -> 81
MeasureBot -> 37
RandomBot -> 28
OnePlayBot -> 24
Bitte beachte, dass ich immer bereit bin, neue Beiträge einzureichen!
quelle
Antworten:
SearchBot
Bisher langsamster Bot, aber immer noch schneller als 2 Sekunden pro Zug, und übertrifft alle derzeit geposteten Bots. Es wird geprüft, was nach einem der gültigen Züge passiert und was nach jedem Zug nach diesen Zügen passieren könnte, und es wird entschieden, was das beste Ergebnis wäre. Leider kann es nicht tiefer suchen, da es dann mehr als 2 Sekunden dauern würde.
quelle
SacrificeBot
Dieser Bot überprüft alle Züge des anderen Spielers und prüft, ob sie sich überschneiden (dh die Figur wird getötet). (Das macht eine Menge besser als ich jemals erwartet hatte;)
quelle
OnePlayBot
Toter einfacher Bot mit nur einem Spiel. Es wird zu einem Turm aufgewertet.
quelle
RandomBot
Dies ist der obligatorische Zufallsbot. Es wird immer zu einem Turm aufgewertet.
quelle
MeasureBot
Dies ist der Bot, mit dem ich angefangen habe; Ich habe daran gearbeitet, es zu erweitern, aber dann bin ich auf den Deep-Clone-Bug gestoßen. Dann dachte ich: "Nun, lasst uns diesen Bot einfach schon einsenden, er funktioniert besser als RandomBot und OnePlayBot, und ich kann später immer noch einen neuen Bot einsenden." , hier ist es also:
MeasureBot sieht aus, ob etwas erfasst werden muss. Wenn dies nicht der Fall ist, wird nur eine zufällige Bewegung ausgeführt. Wenn dies der Fall ist, entscheidet er, welches Stück er nehmen möchte: Es wird eines mit einem niedrigeren Stückwert ausgewählt, da diese weniger eigene Stücke erfassen können. Und wenn es mehrere Möglichkeiten gibt, ein Teil mit dem niedrigstmöglichen Wert aufzunehmen, wird es mit dem Teil mit dem höchstmöglichen Wert aufgenommen. In diesem Fall wird das aufgenommene Teil näher an andere Teile herangeführt (am Anfang des Abschnitts) Spiel, zumindest) und Sie würden lieber ein höherwertiges als ein niedrigerwertiges Stück verlieren.
Dies ist eine Liste der Stückwerte, die ich verwendet habe:
Wenn ein Bauer befördert, wird er immer zu einem König befördert, da es sich um das Stück mit dem niedrigsten Wert handelt.
quelle