# pydraughts
[![PyPI version](https://badge.fury.io/py/pydraughts.svg)](https://badge.fury.io/py/pydraughts) [![Tests](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/tests.yml/badge.svg)](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/tests.yml) [![Build](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/build.yml/badge.svg)](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/build.yml) [![CodeQL](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/codeql-analysis.yml) [![codecov](https://codecov.io/gh/AttackingOrDefending/pydraughts/branch/main/graph/badge.svg?token=ZSPXIVSAWN)](https://codecov.io/gh/AttackingOrDefending/pydraughts)
pydraughts is a draughts (checkers) library for Python with move generation, SVG visualizations, PDN reading and writing, engine communication and balloted openings. It is based on [ImparaAI/checkers](https://github.com/ImparaAI/checkers).
Installing
----------
Download and install the latest release:
pip install pydraughts
## Features
**Variants:**
* Standard (International)
* Frisian
* frysk!
* Antidraughts
* Breakthrough
* Russian
* Brazilian
* English/American
* Italian
* Turkish
**Engine protocols:**
* Hub
* DXP
* CheckerBoard
**PDN Reading and Writing**
<br/></br>
* Import pydraughts
```python
from draughts import Board, Move, WHITE, BLACK
```
* Create a game
```python
board = Board(variant="standard", fen="startpos")
```
* Make a move
```python
move = Move(board, steps_move=[34, 30])
board.push(move)
# Multi-capture
board2 = Board(fen="W:WK40:B19,29")
board2.push(Move(board2, pdn_move='40x14'))
```
* Get a visual representation of the board as SVG
```python
from draughts import svg
svg.create_svg(Board(fen="B:W16,19,33,34,47,K4:B17,25,26"))
```
![SVG Board](examples/board.svg)
* Get a visual representation of the board in the terminal
```python
print(board)
"""
| b | | b | | 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 |
"""
```
* Get legal moves
```python
moves = board.legal_moves()
```
* Detect wins and draws
```python
has_white_won = board.winner() == WHITE
is_draw = board.winner() == 0
winnner = board.winner()
is_game_over = board.is_over()
```
* Convert move to other types
```python
move = Move(board, board_move=moves[0].board_move).pdn_move
```
* Get fen
```python
fen = game.fen
```
* Communicate with engines
```python
from draughts.engine import HubEngine, Limit
engine = HubEngine(["scan.exe", "hub"])
engine.init()
limit = Limit(time=10)
engine_move = engine.play(board, limit, ponder=False)
```
* Read PDN games
```python
from draughts.PDN import PDNReader
games = PDNReader(filename=filepath)
game = games.games[0]
moves = game.moves
```
* Write PDN games
```python
from draughts.PDN import PDNWriter
games = PDNWriter(filename=filepath, board=board)
```
* Get a ballot
```python
from draughts.ballots import Ballots
ballots = Ballots('english')
ballot1 = ballots.get_ballot()
ballot2 = ballots.get_ballot()
```
* Run tournaments
```python
from draughts.tournament import RoundRobin
player1 = (["scan.exe", "hub"], "hub", {}, None)
player2 = ("kr_hub.exe", "hub", {}, None)
players = [player1, player2]
tournament = RoundRobin("tournament.pdn", players, start_time=20, increment=0.2, games_per_pair=4)
scores = tournament.play()
print(scores)
tournament.print_standings()
```
## Example Engines
Some engines that can be used with `pydraughts`.
| Engine | Protocol |
|:-------------------------------------------------------------------------------------------|:-------------|
| [Kingsrow (international)](https://edgilbert.org/InternationalDraughts/download_links.htm) | Hub & DXP |
| [Scan](https://hjetten.home.xs4all.nl/scan/scan.html) | Hub & DXP |
| [Moby Dam](https://hjetten.home.xs4all.nl/mobydam/mobydam.html) | DXP |
| [Kingsrow (english)](https://edgilbert.org/EnglishCheckers/KingsRowEnglish.htm) | CheckerBoard |
| [Kingsrow (italian)](https://edgilbert.org/ItalianCheckers/KingsRowItalian.htm) | CheckerBoard |
| [Cake](https://www.fierz.ch/download.php) | CheckerBoard |
| [Kallisto](https://www.igorkorshunov.narod.ru/Draughts/Kallisto4.rar) | CheckerBoard |
## Selected Projects
If you like, share your interesting project that uses pydraughts.
| Projects |
|-----------------------------------------------------------------------|
| Checkers Reinforcement Learning — https://github.com/d3da/checkers-rl |
## Acknowledgements
Thanks to [fishnet](https://github.com/lichess-org/fishnet/tree/ebd2a5e16d37135509cbfbff9998e0b798866ef5) which was modified to add support for Hub engines. Thanks to [akalverboer](https://github.com/akalverboer) for their [DXC100_draughts_client](https://github.com/akalverboer/DXC100_draughts_client) which was modified to add support for DXP engines.
## License
pydraughts is licensed under The MIT License. Check out `LICENSE` for the full text.
The licenses of the other projects that pydraughts uses are in the `other_licenses` folder.
Raw data
{
"_id": null,
"home_page": "https://github.com/AttackingOrDefending/pydraughts",
"name": "pydraughts",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "checkers, draughts, game, fen, pdn",
"author": "Ioannis Pantidis",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/3b/7d/d0fa619725e5771a102fac88f04feea2dc24c3f0118ac04c61b7fa9c7005/pydraughts-0.6.7.tar.gz",
"platform": null,
"description": "# pydraughts\r\n[![PyPI version](https://badge.fury.io/py/pydraughts.svg)](https://badge.fury.io/py/pydraughts) [![Tests](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/tests.yml/badge.svg)](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/tests.yml) [![Build](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/build.yml/badge.svg)](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/build.yml) [![CodeQL](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/AttackingOrDefending/pydraughts/actions/workflows/codeql-analysis.yml) [![codecov](https://codecov.io/gh/AttackingOrDefending/pydraughts/branch/main/graph/badge.svg?token=ZSPXIVSAWN)](https://codecov.io/gh/AttackingOrDefending/pydraughts)\r\n\r\npydraughts is a draughts (checkers) library for Python with move generation, SVG visualizations, PDN reading and writing, engine communication and balloted openings. It is based on [ImparaAI/checkers](https://github.com/ImparaAI/checkers).\r\n\r\nInstalling\r\n----------\r\n\r\nDownload and install the latest release:\r\n\r\n pip install pydraughts\r\n\r\n## Features\r\n\r\n**Variants:**\r\n* Standard (International)\r\n* Frisian\r\n* frysk!\r\n* Antidraughts\r\n* Breakthrough\r\n* Russian\r\n* Brazilian\r\n* English/American\r\n* Italian\r\n* Turkish\r\n\r\n**Engine protocols:**\r\n* Hub\r\n* DXP\r\n* CheckerBoard\r\n\r\n**PDN Reading and Writing**\r\n<br/></br>\r\n* Import pydraughts\r\n```python\r\nfrom draughts import Board, Move, WHITE, BLACK\r\n```\r\n* Create a game\r\n```python\r\nboard = Board(variant=\"standard\", fen=\"startpos\")\r\n```\r\n* Make a move\r\n```python\r\nmove = Move(board, steps_move=[34, 30])\r\nboard.push(move)\r\n\r\n# Multi-capture\r\nboard2 = Board(fen=\"W:WK40:B19,29\")\r\nboard2.push(Move(board2, pdn_move='40x14'))\r\n```\r\n* Get a visual representation of the board as SVG\r\n```python\r\nfrom draughts import svg\r\nsvg.create_svg(Board(fen=\"B:W16,19,33,34,47,K4:B17,25,26\"))\r\n```\r\n![SVG Board](examples/board.svg)\r\n* Get a visual representation of the board in the terminal\r\n```python\r\nprint(board)\r\n\r\n\"\"\"\r\n | b | | b | | b | | b | | b \r\n---------------------------------------\r\n b | | b | | b | | b | | b | \r\n---------------------------------------\r\n | b | | b | | b | | b | | b \r\n---------------------------------------\r\n b | | b | | b | | b | | b | \r\n---------------------------------------\r\n | | | | | | | | | \r\n---------------------------------------\r\n | | | | | | | | w | \r\n---------------------------------------\r\n | w | | w | | w | | | | w \r\n---------------------------------------\r\n w | | w | | w | | w | | w | \r\n---------------------------------------\r\n | w | | w | | w | | w | | w \r\n---------------------------------------\r\n w | | w | | w | | w | | w | \r\n\"\"\"\r\n```\r\n* Get legal moves\r\n```python\r\nmoves = board.legal_moves()\r\n```\r\n* Detect wins and draws\r\n```python\r\nhas_white_won = board.winner() == WHITE\r\nis_draw = board.winner() == 0\r\nwinnner = board.winner()\r\nis_game_over = board.is_over()\r\n```\r\n* Convert move to other types\r\n```python\r\nmove = Move(board, board_move=moves[0].board_move).pdn_move\r\n```\r\n* Get fen\r\n```python\r\nfen = game.fen\r\n```\r\n* Communicate with engines\r\n```python\r\nfrom draughts.engine import HubEngine, Limit\r\nengine = HubEngine([\"scan.exe\", \"hub\"])\r\nengine.init()\r\nlimit = Limit(time=10)\r\nengine_move = engine.play(board, limit, ponder=False)\r\n```\r\n* Read PDN games\r\n```python\r\nfrom draughts.PDN import PDNReader\r\ngames = PDNReader(filename=filepath)\r\ngame = games.games[0]\r\nmoves = game.moves\r\n```\r\n* Write PDN games\r\n```python\r\nfrom draughts.PDN import PDNWriter\r\ngames = PDNWriter(filename=filepath, board=board)\r\n```\r\n* Get a ballot\r\n```python\r\nfrom draughts.ballots import Ballots\r\nballots = Ballots('english')\r\nballot1 = ballots.get_ballot()\r\nballot2 = ballots.get_ballot()\r\n```\r\n* Run tournaments\r\n```python\r\nfrom draughts.tournament import RoundRobin\r\nplayer1 = ([\"scan.exe\", \"hub\"], \"hub\", {}, None)\r\nplayer2 = (\"kr_hub.exe\", \"hub\", {}, None)\r\nplayers = [player1, player2]\r\ntournament = RoundRobin(\"tournament.pdn\", players, start_time=20, increment=0.2, games_per_pair=4)\r\nscores = tournament.play()\r\nprint(scores)\r\ntournament.print_standings()\r\n```\r\n\r\n## Example Engines\r\nSome engines that can be used with `pydraughts`.\r\n\r\n| Engine | Protocol |\r\n|:-------------------------------------------------------------------------------------------|:-------------|\r\n| [Kingsrow (international)](https://edgilbert.org/InternationalDraughts/download_links.htm) | Hub & DXP |\r\n| [Scan](https://hjetten.home.xs4all.nl/scan/scan.html) | Hub & DXP |\r\n| [Moby Dam](https://hjetten.home.xs4all.nl/mobydam/mobydam.html) | DXP |\r\n| [Kingsrow (english)](https://edgilbert.org/EnglishCheckers/KingsRowEnglish.htm) | CheckerBoard |\r\n| [Kingsrow (italian)](https://edgilbert.org/ItalianCheckers/KingsRowItalian.htm) | CheckerBoard |\r\n| [Cake](https://www.fierz.ch/download.php) | CheckerBoard |\r\n| [Kallisto](https://www.igorkorshunov.narod.ru/Draughts/Kallisto4.rar) | CheckerBoard |\r\n\r\n## Selected Projects\r\nIf you like, share your interesting project that uses pydraughts.\r\n\r\n| Projects |\r\n|-----------------------------------------------------------------------|\r\n| Checkers Reinforcement Learning \u2014 https://github.com/d3da/checkers-rl |\r\n\r\n## Acknowledgements\r\nThanks to [fishnet](https://github.com/lichess-org/fishnet/tree/ebd2a5e16d37135509cbfbff9998e0b798866ef5) which was modified to add support for Hub engines. Thanks to [akalverboer](https://github.com/akalverboer) for their [DXC100_draughts_client](https://github.com/akalverboer/DXC100_draughts_client) which was modified to add support for DXP engines.\r\n\r\n## License\r\npydraughts is licensed under The MIT License. Check out `LICENSE` for the full text.\r\nThe licenses of the other projects that pydraughts uses are in the `other_licenses` folder.\r\n",
"bugtrack_url": null,
"license": null,
"summary": "A draughts library for Python with move generation, SVG visualizations, PDN reading and writing, engine communication and balloted openings",
"version": "0.6.7",
"project_urls": {
"Bug Tracker": "https://github.com/AttackingOrDefending/pydraughts/issues",
"Homepage": "https://github.com/AttackingOrDefending/pydraughts"
},
"split_keywords": [
"checkers",
" draughts",
" game",
" fen",
" pdn"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "a643249a34530f590dd041c3825fb2b4e67345c1821f93bfdb60652340b59408",
"md5": "72dbf42395c45d78ba953c47f4c5f793",
"sha256": "60ac89bbd00642ecf19dd981e9ccd4f86d3c0036f9c8d655213c4b7e1f8e7087"
},
"downloads": -1,
"filename": "pydraughts-0.6.7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "72dbf42395c45d78ba953c47f4c5f793",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 195278,
"upload_time": "2025-01-12T20:56:29",
"upload_time_iso_8601": "2025-01-12T20:56:29.632381Z",
"url": "https://files.pythonhosted.org/packages/a6/43/249a34530f590dd041c3825fb2b4e67345c1821f93bfdb60652340b59408/pydraughts-0.6.7-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3b7dd0fa619725e5771a102fac88f04feea2dc24c3f0118ac04c61b7fa9c7005",
"md5": "ff882110976a8d75fa13bd974f4a2279",
"sha256": "cbbaf4cbf3ddadf7c641e83b7155b02bb28310b5ea35963c76523add88c3c671"
},
"downloads": -1,
"filename": "pydraughts-0.6.7.tar.gz",
"has_sig": false,
"md5_digest": "ff882110976a8d75fa13bd974f4a2279",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 183361,
"upload_time": "2025-01-12T20:56:32",
"upload_time_iso_8601": "2025-01-12T20:56:32.154229Z",
"url": "https://files.pythonhosted.org/packages/3b/7d/d0fa619725e5771a102fac88f04feea2dc24c3f0118ac04c61b7fa9c7005/pydraughts-0.6.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-12 20:56:32",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "AttackingOrDefending",
"github_project": "pydraughts",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"lcname": "pydraughts"
}