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!
fuente
Respuestas:
SearchBot
El bot más lento hasta ahora, pero aún más rápido que 2 segundos por movimiento y supera a todos los bots publicados actualmente. Analiza lo que sucede después de cualquiera de los movimientos válidos y lo que podría suceder después de cualquier movimiento después de esos movimientos y decide cuál sería el mejor resultado. Desafortunadamente, no puede buscar más profundo porque tomaría más de 2 segundos entonces.
fuente
SacrificioBot
Este bot verificará todos los movimientos que tiene el otro jugador y verificará si alguno de ellos se cruza (es decir, la pieza será eliminada). (Esto es muchísimo mejor de lo que esperaba;)
fuente
OnePlayBot
Bot simple muerto con una sola jugada. Se actualizará a una torre.
fuente
RandomBot
Este es el bot aleatorio obligatorio. Siempre se actualizará a una torre.
fuente
MeasureBot
Este es el bot con el que comencé; Estaba trabajando para expandirlo, pero luego me encontré con el error de clones profundos, y luego pensé "bueno, simplemente enviemos este bot ya, funciona mejor que RandomBot y OnePlayBot, y siempre puedo enviar un nuevo bot más tarde" , asi que aqui esta:
MeasureBot busca si necesita capturar algo: si no lo hace, simplemente realiza un movimiento aleatorio. Si lo hace, decidirá qué pieza tomar: elegirá una con un valor de pieza más bajo porque esas pueden capturar menos piezas propias. Y si hay varias formas de tomar una pieza con el valor más bajo posible, la capturará con la pieza con el valor más alto posible: si lo hace, acercará la pieza de captura a otras piezas (al comienzo del juego, al menos) y preferirías perder una pieza de mayor valor que una de menor valor.
Esta es una lista de los valores de pieza que utilicé:
Cuando un peón asciende, siempre se convertirá en rey, porque es la pieza de menor valor.
fuente