https://en.wikipedia.org/wiki/Losing_chess
Esto es básicamente un torneo de ajedrez , pero por antichess;)
Antichess es una de las muchas variantes de ajedrez que se han inventado. El objetivo es perder todas tus piezas (esto puede parecer un poco extraño, pero se llama antichess por alguna razón).
Las normas
Las reglas de antichess son muy similares al ajedrez estándar, pero con algunas diferencias bastante menores. El objetivo como mencioné anteriormente es perder todas tus piezas. Para que esto suceda, si tu oponente tiene la oportunidad de capturar una de tus piezas, ese es el único movimiento que puede hacer. Si le das múltiples oportunidades en un turno, el otro jugador puede elegir su turno. Otra cosa que cambia es que el rey no tiene poderes especiales, ya que no puedes jaquear a tu oponente y no puedes obligarlo a jalar.
También se aplicarán los siguientes cambios en el juego estándar (ayudan a simplificar el juego):
- En passant será ignorado.
- El enroque no es posible.
- La regla de los cincuenta movimientos se aplica automáticamente (lo que significa que el juego termina en empate).
- Los peones podrán elegir a qué promocionar.
- Si un jugador necesita más de 2 segundos para moverse, perderá el juego.
- Devolver un movimiento no válido dará como resultado la pérdida del juego.
- Para ganar, tus oponentes deben capturar todas tus piezas .
- Las blancas comienzan el juego.
- El blanco se coloca "en la parte inferior" del campo (y = 0), el negro se encuentra en la parte superior (y = 7).
- Está prohibido acceder a otros recursos que no sean su bot (internet, archivos, otros bots, ...).
Puntuación
- Ganar te otorga 3 puntos, un empate de 1 punto y perder 0 puntos.
- Cada presentación jugará una contra la otra 10 veces (5 veces como blanco, 5 como negro).
Escribiendo tu bot
El código del controlador está aquí: https://github.com/JJ-Atkinson/SimpleAntichessKOTH
Puedes escribir tu bot en Java o Groovy. Para escribir un bot debes extender la Player
clase. La clase de jugador tiene un método abstracto Move getMove(Board board, Player enemy, Set<Move> validMoves)
.
Aquí hay un resumen rápido de métodos útiles:
Player
:
List<Piece> getPieces(Board board)
: Devuelve todas tus piezas que están en el tablero.PieceUpgradeType pieceUpgradeType
: Si / cuando uno de tus peones llega al final del tablero, deberás definir esto para el tipo de pieza a la que deseas actualizar. Usted tiene la opción deROOK
,KNIGHT
,QUEEN
,BISHOP
, yKING
.
Board
:
Field getFieldAtLoc(Location loc)
: Devuelva elField
en la ubicación. Esto tiene ungetAt
método de correspondencia para que si estás usando groovy puedas escribirboard[loc]
.Field getFieldAtLoc(int x, int y)
: Devuelva elField
en la ubicación. Esto tiene ungetAt
método de correspondencia para que si estás usando groovy puedas escribirboard[x, y]
.Board movePiece(Player player, Move move)
: Haz un movimiento en el tablero para que puedas ver cómo se desarrollaría. Devuelve el nuevo tablero.
Si quieres ver las piezas de tus oponentes, solo escribe enemy.getPieces(board)
. Para agregar su bot a la alineación agregue la siguiente línea a PlayerFactory
:
put(YourBot.class, { new YourBot() } )
Depuración de su bot:
He incluido un par de herramientas para ayudar a depurar sus bots. Para ver tu juego en vivo, puedes configurar la Game#DEBUG
bandera como verdadera. Obtendrá un resultado similar a este:
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
...
(El blanco es mayúscula, el rey se muestra con i
)
Si su consola admite caracteres especiales utf-8, incluso puede mostrar el tablero con los caracteres de ajedrez utilizando Board#USE_UTF8_TO_STRING
:
♜♞♝♛♚♝—♜
♟—♟♟♟♟♟♟
————————
—♟——————
————————
♙———————
—♙♙♙♙♔♙♙
♖♘♗♕—♗♘♖
(se ve mejor con una fuente monoespaciada)
Para evitar una avalancha de resultados no deseados, debe cambiar la Main#main
función a algo como esto:
new Game(new MyBot(), new SacrificeBot()).run()
Pon tu bot a la izquierda para jugar como blanco, ponlo a la derecha para jugar como negro.
Construyendo el controlador:
El controlador está escrito en groovy, por lo que debe tener java y groovy instalados. Si no desea instalar Groovy, puede usar el archivo de compilación Gradle que viene con el controlador (esto no ha sido probado). Si no desea usar groovy o gradle, puede usar el último jar de lanzamiento ( https://github.com/JJ-Atkinson/SimpleAntichessKOTH/releases ). Si haces esto, necesitas crear tu propio main
método y agregar tu bot manualmente a la fábrica de reproductores. Ejemplo:
PlayerFactory.players.put(YourBot.class, { new YourBot() } )
new Runner().runGames();
(Tenga en cuenta que aún puede configurar los indicadores de depuración y esas cosas)
¡Se aprecian todos los errores encontrados!
Puntuaciones:
SearchBot -> 101
SacrificeBot -> 81
MeasureBot -> 37
RandomBot -> 28
OnePlayBot -> 24
¡Tenga en cuenta que siempre estoy dispuesto a recibir nuevas presentaciones!