python-chess supports several chess variants.

>>> import chess.variant
>>> board = chess.variant.GiveawayBoard()
>>> # General information about the variants
>>> type(board).uci_variant
>>> type(board).xboard_variant
>>> type(board).starting_fen
'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w - - 0 1'

See chess.Board.is_variant_end(), is_variant_win() is_variant_draw() is_variant_loss() for special variant end conditions and results.

Variant Board class UCI/XBoard Syzygy
Standard chess.Board chess/normal .rtbw, .rtbz
Suicide chess.variant.SuicideBoard suicide .stbw, .stbz
Giveaway chess.variant.GiveawayBoard giveaway .gtbw, .gtbz
Antichess chess.variant.AntichessBoard antichess .gtbw, .gtbz
Atomic chess.variant.AtomicBoard atomic .atbw, .atbz
King of the Hill chess.variant.KingOfTheHillBoard kingofthehill  
Racing Kings chess.variant.RacingKingsBoard racingkings  
Horde chess.variant.HordeBoard horde  
Three-check chess.variant.ThreeCheckBoard 3check  
Crazyhouse chess.variant.CrazyhouseBoard crazyhouse  
chess.variant.find_variant(name: str) → Type[chess.Board][source]

Looks for a variant board class by variant name.


Chess960 is orthogonal to all other variants.

>>> chess.Board(chess960=True)
Board('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1', chess960=True)

See chess.BaseBoard.set_chess960_pos(), chess960_pos(), and from_chess960_pos() for dealing with Chess960 starting positions.


class chess.variant.CrazyhousePocket(symbols: Iterable[str] = '')[source]

A Crazyhouse pocket with a counter for each piece type.

add(piece_type: int) → None[source]

Adds a piece of the given type to this pocket.

remove(piece_type: int) → None[source]

Removes a piece of the given type from this pocket.

count(piece_type: int) → int[source]

Returns the number of pieces of the given type in the pocket.

reset() → None[source]

Clears the pocket.

copy() → CrazyhousePocketT[source]

Returns a copy of this pocket.

class chess.variant.CrazyhouseBoard(fen: Optional[str] = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[] w KQkq - 0 1', chess960: bool = False)[source]
pockets = [chess.variant.CrazyhousePocket(), chess.variant.CrazyhousePocket()]


class chess.variant.ThreeCheckBoard(fen: Optional[str] = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 3+3 0 1', chess960: bool = False)[source]
remaining_checks = [3, 3]


Multi-Variant Stockfish and other engines have an UCI_Variant option. XBoard engines may declare support for variants. This is automatically managed.

>>> import chess.engine
>>> engine = chess.engine.SimpleEngine.popen_uci("stockfish-mv")
>>> board = chess.variant.RacingKingsBoard()
>>> result =, chess.engine.Limit(time=1.0))


Syzygy tablebases are available for suicide, giveaway and atomic chess.

>>> import chess.syzygy
>>> import chess.variant
>>> tables = chess.syzygy.open_tablebase("data/syzygy", VariantBoard=chess.variant.AtomicBoard)