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
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
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
>>> board = draughts.Board.from_fen("W:WK10,K20:BK35,K45")
>>> draughts.svg.board(board, size=400)
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
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 |
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 |
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ad521710ac1ece4eb4f2e5de84ee943dface0242105dc7b66f4dbfc0924aeca4
|
|
| MD5 |
f0f8b8528e0337e5784f2bd507640967
|
|
| BLAKE2b-256 |
6e0a35c031d9838843715ddf88312b1e5ad41a85e3a2b8fca78efba2baa8a4a4
|
Provenance
The following attestation bundles were made for py_draughts-1.6.4.tar.gz:
Publisher:
python-publish.yml on miskibin/py-draughts
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
py_draughts-1.6.4.tar.gz -
Subject digest:
ad521710ac1ece4eb4f2e5de84ee943dface0242105dc7b66f4dbfc0924aeca4 - Sigstore transparency entry: 809334048
- Sigstore integration time:
-
Permalink:
miskibin/py-draughts@df2861884cada176afb7253f0ac4136c7bb6190a -
Branch / Tag:
refs/tags/v1.6.4 - Owner: https://github.com/miskibin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@df2861884cada176afb7253f0ac4136c7bb6190a -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2491790a9b664046e669eec97a60051129dcc38bbc8278b079f765f78e1f69e7
|
|
| MD5 |
12c19e1a20e4e83c6756ddf138dd5c46
|
|
| BLAKE2b-256 |
984906d2315ae06f1bdd67d052e323deaaa7bdb2d58a01fb4911046288da0fd3
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
py_draughts-1.6.4-py3-none-any.whl -
Subject digest:
2491790a9b664046e669eec97a60051129dcc38bbc8278b079f765f78e1f69e7 - Sigstore transparency entry: 809334049
- Sigstore integration time:
-
Permalink:
miskibin/py-draughts@df2861884cada176afb7253f0ac4136c7bb6190a -
Branch / Tag:
refs/tags/v1.6.4 - Owner: https://github.com/miskibin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@df2861884cada176afb7253f0ac4136c7bb6190a -
Trigger Event:
push
-
Statement type: