https://en.wikipedia.org/wiki/Losing_chess
Questo è fondamentalmente Torneo di scacchi , ma per l'anticipazione;)
Antichess è una delle tante varianti di scacchi che sono state inventate. L'obiettivo è perdere tutti i tuoi pezzi (questo può sembrare un po 'strano, ma per un motivo si chiama antichess).
Le regole
Le regole dell'anticipo sono molto simili agli scacchi standard, ma con alcune differenze abbastanza lievi. L'obiettivo, come ho detto sopra, è quello di perdere tutti i tuoi pezzi. Perché ciò accada, se il tuo avversario ha l'opportunità di catturare uno dei tuoi pezzi, questa è l'unica mossa che può fare. Se gli dai più possibilità in un turno, l'altro giocatore può scegliere il suo turno. Un'altra cosa che è cambiata è che il re non ha poteri speciali, poiché in te non puoi dare scacco matto al tuo avversario e non puoi costringerlo a controllare.
Si applicano anche le seguenti modifiche al gioco standard (aiutano a semplificare il gioco):
- En passant sarà ignorato.
- Castling non è possibile.
- La regola delle cinquanta mosse si applica automaticamente (il che significa che il gioco termina in parità).
- I pedoni saranno in grado di scegliere ciò che promuovono.
- Se un giocatore ha bisogno di più di 2 secondi per muoversi, perderà la partita.
- Restituire una mossa non valida comporterà la perdita del gioco.
- Per vincere, i tuoi avversari devono catturare tutti i tuoi pezzi .
- Il bianco inizia il gioco.
- Il bianco viene posizionato "nella parte inferiore" del campo (y = 0), il nero si trova nella parte superiore (y = 7).
- L'accesso ad altre risorse oltre al tuo bot (internet, file, altri bot, ...) è proibito.
punteggio
- Vincere ti dà 3 punti, un pareggio 1 punto e la perdita di 0 punti.
- Ogni invio giocherà contro l'altro 10 volte (5 volte bianco, 5 nero).
Scrivi il tuo bot
Il codice del controller è qui: https://github.com/JJ-Atkinson/SimpleAntichessKOTH
Puoi scrivere il tuo bot in Java o Groovy. Per scrivere un bot è necessario estendere la Player
classe. La classe del giocatore ha un metodo astrattoMove getMove(Board board, Player enemy, Set<Move> validMoves)
.
Ecco una rapida carrellata di metodi utili:
Player
:
List<Piece> getPieces(Board board)
: Restituisci tutti i tuoi pezzi che si trovano sul tabellonePieceUpgradeType pieceUpgradeType
: Se / quando una delle tue pedine raggiunge la fine della scacchiera, dovrai definirla in base al tipo di pezzo che vuoi potenziare. Avete la scelta diROOK
,KNIGHT
,QUEEN
,BISHOP
, eKING
.
Board
:
Field getFieldAtLoc(Location loc)
: Restituisce ilField
nella posizione. Questo ha ungetAt
metodo di abbinamento in modo che se stai usando Groovy puoi scrivereboard[loc]
.Field getFieldAtLoc(int x, int y)
: Restituisce ilField
nella posizione. Questo ha ungetAt
metodo di abbinamento in modo che se stai usando Groovy puoi scrivereboard[x, y]
.Board movePiece(Player player, Move move)
: Fai una mossa sul tabellone in modo da poter vedere come andrebbe a finire. Restituisce la nuova scheda.
Se vuoi vedere i pezzi dei tuoi avversari, scrivi enemy.getPieces(board)
. Per aggiungere il tuo bot all'allineamento aggiungi la seguente riga a PlayerFactory
:
put(YourBot.class, { new YourBot() } )
Debug del tuo bot:
Ho incluso un paio di strumenti per aiutare il debug dei tuoi robot. Per vedere il tuo gioco giocato dal vivo puoi impostare la Game#DEBUG
bandiera su true. Otterrai un risultato simile al seguente:
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
...
(Il bianco è maiuscolo, il re è mostrato con i
)
Se la tua console supporta caratteri speciali utf-8, puoi persino mostrare la scacchiera con i caratteri scacchi usando Board#USE_UTF8_TO_STRING
:
♜♞♝♛♚♝—♜
♟—♟♟♟♟♟♟
————————
—♟——————
————————
♙———————
—♙♙♙♙♔♙♙
♖♘♗♕—♗♘♖
(sembra migliore con un carattere mono spaziato)
Per evitare un flusso di output indesiderato, è necessario modificare la Main#main
funzione in qualcosa del genere:
new Game(new MyBot(), new SacrificeBot()).run()
Metti il tuo robot a sinistra per giocare come bianco, mettilo a destra per giocare come nero.
Costruire il controller:
Il controller è scritto in groovy, quindi devi avere java e groovy installati. Se non si desidera installare groovy, è possibile utilizzare il file di build gradle fornito con il controller (questo non è stato testato). Se non si desidera utilizzare Groovy o Gradle, è possibile utilizzare l'ultimo vaso di rilascio ( https://github.com/JJ-Atkinson/SimpleAntichessKOTH/releases ). Se lo fai, devi creare il tuo main
metodo e aggiungere il tuo bot manualmente alla fabbrica del giocatore. Esempio:
PlayerFactory.players.put(YourBot.class, { new YourBot() } )
new Runner().runGames();
(Nota che puoi ancora impostare i flag e le cose di debug)
Qualsiasi ricerca di bug è apprezzata!
I punteggi:
SearchBot -> 101
SacrificeBot -> 81
MeasureBot -> 37
RandomBot -> 28
OnePlayBot -> 24
Si prega di notare che sono sempre disposto ad avere nuovi invii!