Skip to main content

Fastest python draughts library with advanced WEB UI, move generation and validation, PDN and FEN parsing and writing and advenced engine + benchmarking. Supports multiple variants of game.

Project description

py-draughts

GitHub Actions PyPI version Downloads Docs

Fast, modern draughts library with move generation, validation, PDN support, and AI engines. HUB protocol for external engines communication

[!IMPORTANT]
Best optimized draughts library utilizing bitboards for ~200x faster move generation than alternatives.

Features: multiple variants • Built-in AI engine • (HUB protocol) External engine support (Scan, Kingsrow) • RL/ML ready • Web UI

Web UI

Installation

pip install py-draughts

Core

>>> import draughts
>>> board = draughts.Board()

>>> board.legal_moves
[Move: 31->27, Move: 31->26, Move: 32->28, ...]

>>> board.push_uci("31-27")
>>> board.push_uci("18-22")
>>> board.push_uci("27x18")
>>> board.push_uci("12x23")

>>> board
 . b . b . b . b . b
 b . b . b . b . b .
 . b . b . . . b . b
 . . . . b . b . b .
 . . . b . . . . . .
 . . . . . . . . . .
 . w . w . w . w . w
 w . w . w . w . w .
 . w . w . w . w . w
 w . w . w . w . w .

>>> board.pop()  # Unmake the last move
Move: 12->23

>>> board.turn
Color.WHITE

Make and unmake moves

>>> board.push_uci("32-28")  # Make a move
>>> board.pop()              # Unmake the last move
Move: 32->28

Show ASCII board

>>> board = draughts.Board()
>>> print(board)
 . b . b . b . b . b     .  1 .  2 .  3 .  4 .  5
 b . b . b . b . b .      6 .  7 .  8 .  9 . 10 .
 . b . b . b . b . b     . 11 . 12 . 13 . 14 . 15
 b . b . b . b . b .     16 . 17 . 18 . 19 . 20 .
 . . . . . . . . . .     . 21 . 22 . 23 . 24 . 25
 . . . . . . . . . .     26 . 27 . 28 . 29 . 30 .
 . w . w . w . w . w     . 31 . 32 . 33 . 34 . 35
 w . w . w . w . w .     36 . 37 . 38 . 39 . 40 .
 . w . w . w . w . w     . 41 . 42 . 43 . 44 . 45
 w . w . w . w . w .     46 . 47 . 48 . 49 . 50 .

Detects draws and game end

>>> board.is_draw
False
>>> board.is_threefold_repetition
False
>>> board.game_over
False
>>> board.result
'-'

FEN parsing and writing

>>> board.fen
'[FEN "W:W:W31,32,33,...:B1,2,3,..."]'

>>> board = draughts.Board.from_fen("W:WK10,K20:BK35,K45")
>>> board
 . . . . . . . B . .
 . . . . . . . . . .
 . . . . . . . . . .
 . . . . . . . . . .
 . . . . . . . . . .
 . . . . . . . . . .
 . . . . W . . . . .
 . . . . . . . . . .
 . . . . W . . . . .
 B . . . . . . . . .

PDN parsing and writing

>>> board = draughts.Board()
>>> board.push_uci("32-28")
>>> board.push_uci("18-23")
>>> board.pdn
'[GameType "20"]
[Variant "Standard (international) checkers"]
[Result "-"]
1. 32-28 18-23'

>>> board = draughts.Board.from_pdn('[GameType "20"]\n1. 32-28 19-23 2. 28x19 14x23')

Variants

Variant Class Board Flying Kings Max Capture
Standard StandardBoard 10×10 Yes Required
American AmericanBoard 8×8 No Not required
Frisian FrisianBoard 10×10 Yes Required
Russian RussianBoard 8×8 Yes Not required
>>> from draughts import StandardBoard, AmericanBoard, FrisianBoard, RussianBoard

>>> board = AmericanBoard()
>>> board
 . b . b . b . b
 b . b . b . b .
 . b . b . b . b
 . . . . . . . .
 . . . . . . . .
 w . w . w . w .
 . w . w . w . w
 w . w . w . w .

SVG Rendering

>>> import draughts
>>> board = draughts.Board()
>>> draughts.svg.board(board, size=400)  # Returns SVG string
Standard draughts board
>>> board = draughts.Board.from_fen("W:WK10,K20:BK35,K45")
>>> draughts.svg.board(board, size=400)
Board with kings

Engine

Built-in alpha-beta engine with transposition tables and iterative deepening:

>>> from draughts import Board, AlphaBetaEngine

>>> board = Board()
>>> engine = AlphaBetaEngine(depth_limit=5)

>>> move = engine.get_best_move(board)
>>> move
Move: 32->28

>>> move, score = engine.get_best_move(board, with_evaluation=True)
>>> score
0.15

External Engines (Hub Protocol)

Use external engines like Scan via the Hub protocol:

>>> from draughts import Board, HubEngine

>>> with HubEngine("path/to/scan.exe", time_limit=1.0) as engine:
...     board = Board()
...     move, score = engine.get_best_move(board, with_evaluation=True)
...     print(f"Best: {move}, Score: {score}")
Best: 32-28, Score: 0.15

Compatible engines:

  • Scan - World champion level, supports 10x10
  • Kingsrow - Multiple variants, endgame databases
  • Any engine implementing the Hub protocol

Engine Benchmarking

Compare engines against each other with comprehensive statistics:

>>> from draughts import Benchmark, AlphaBetaEngine

>>> stats = Benchmark(
...     AlphaBetaEngine(depth_limit=4),
...     AlphaBetaEngine(depth_limit=6),
...     games=20
... ).run()

>>> print(stats)
============================================================
  BENCHMARK: AlphaBetaEngine (d=4) vs AlphaBetaEngine (d=6)
============================================================
  RESULTS: 2-12-6 (W-L-D)
  AlphaBetaEngine (d=4) win rate: 25.0%
  Elo difference: -191
  ...

Writing Your Own AI

Build custom agents with neural networks, MCTS, or any algorithm:

>>> from draughts import Board, BaseAgent, AgentEngine, Benchmark

>>> class GreedyAgent(BaseAgent):
...     def select_move(self, board):
...         return max(board.legal_moves, key=lambda m: len(m.captured_list))

>>> board = Board()
>>> agent = GreedyAgent()
>>> move = agent.select_move(board)

# Use with Benchmark
>>> stats = Benchmark(agent.as_engine(), AlphaBetaEngine(depth_limit=4), games=10).run()

ML-ready features:

>>> board.to_tensor()        # (4, 50) tensor for neural networks
>>> board.legal_moves_mask() # Boolean mask for policy outputs
>>> board.features()         # Material, mobility, game phase
>>> clone = board.copy()     # Fast cloning for tree search

Server

Interactive web interface for playing and engine testing:

from draughts import Board, Server, AlphaBetaEngine, HubEngine

server = Server(
    board=Board(),
    white_engine=AlphaBetaEngine(depth_limit=6),
    black_engine=HubEngine("path/to/scan.exe", time_limit=1.0)
)
server.run() # Open http://localhost:8000
image

Performance

Legal moves generation in ~10-30 microseconds:

Operation py-draughts pydraughts Speedup
Board init 2.30 µs 547.10 µs 238x faster
FEN parse 21.00 µs 358.90 µs 17x faster
Legal moves 17.40 µs 3.61 ms 207x faster
Make move 0.90 µs 507.75 µs 564x faster
Speed Comparison Chart

Engine search at various depths:

Depth Time Nodes
5 130 ms 3,525
6 350 ms 9,537
7 933 ms 25,202
8 4.9 s 122,168
Engine Benchmark

Testing

Comprehensive test suite with 260+ tests covering all variants and edge cases:

pytest test/ -v

Tests include:

  • Move generation - Push/pop roundtrips, legal move validation
  • Real game replays - PDN games from Lidraughts for all variants
  • Edge cases - Complex king captures, promotion mid-capture, draw rules
  • Engine correctness - Hash stability, transposition tables, board immutability
  • All 4 variants - Standard, American, Frisian, Russian

Contributing

Contributions welcome! Please open an issue or submit a pull request.

License

py-draughts is licensed under the GPL 3.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_draughts-1.6.4.tar.gz (143.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

py_draughts-1.6.4-py3-none-any.whl (152.8 kB view details)

Uploaded Python 3

File details

Details for the file py_draughts-1.6.4.tar.gz.

File metadata

  • Download URL: py_draughts-1.6.4.tar.gz
  • Upload date:
  • Size: 143.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for py_draughts-1.6.4.tar.gz
Algorithm Hash digest
SHA256 ad521710ac1ece4eb4f2e5de84ee943dface0242105dc7b66f4dbfc0924aeca4
MD5 f0f8b8528e0337e5784f2bd507640967
BLAKE2b-256 6e0a35c031d9838843715ddf88312b1e5ad41a85e3a2b8fca78efba2baa8a4a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_draughts-1.6.4.tar.gz:

Publisher: python-publish.yml on miskibin/py-draughts

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py_draughts-1.6.4-py3-none-any.whl.

File metadata

  • Download URL: py_draughts-1.6.4-py3-none-any.whl
  • Upload date:
  • Size: 152.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for py_draughts-1.6.4-py3-none-any.whl
Algorithm Hash digest
SHA256 2491790a9b664046e669eec97a60051129dcc38bbc8278b079f765f78e1f69e7
MD5 12c19e1a20e4e83c6756ddf138dd5c46
BLAKE2b-256 984906d2315ae06f1bdd67d052e323deaaa7bdb2d58a01fb4911046288da0fd3

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_draughts-1.6.4-py3-none-any.whl:

Publisher: python-publish.yml on miskibin/py-draughts

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page