python-chess: a chess library for Python
========================================
.. image:: https://github.com/niklasf/python-chess/workflows/Test/badge.svg
:target: https://github.com/niklasf/python-chess/actions
:alt: Test status
.. image:: https://badge.fury.io/py/chess.svg
:target: https://pypi.python.org/pypi/chess
:alt: PyPI package
.. image:: https://readthedocs.org/projects/python-chess/badge/?version=v1.11.1
:target: https://python-chess.readthedocs.io/en/v1.11.1/
:alt: Docs
.. image:: https://badges.gitter.im/python-chess/community.svg
:target: https://gitter.im/python-chess/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
:alt: Chat on Gitter
Introduction
------------
python-chess is a chess library for Python, with move generation,
move validation, and support for common formats. This is the Scholar's mate in
python-chess:
.. code:: python
>>> import chess
>>> board = chess.Board()
>>> board.legal_moves
<LegalMoveGenerator at ... (Nh3, Nf3, Nc3, Na3, h3, g3, f3, e3, d3, c3, ...)>
>>> chess.Move.from_uci("a8a1") in board.legal_moves
False
>>> board.push_san("e4")
Move.from_uci('e2e4')
>>> board.push_san("e5")
Move.from_uci('e7e5')
>>> board.push_san("Qh5")
Move.from_uci('d1h5')
>>> board.push_san("Nc6")
Move.from_uci('b8c6')
>>> board.push_san("Bc4")
Move.from_uci('f1c4')
>>> board.push_san("Nf6")
Move.from_uci('g8f6')
>>> board.push_san("Qxf7")
Move.from_uci('h5f7')
>>> board.is_checkmate()
True
>>> board
Board('r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR b KQkq - 0 4')
Installing
----------
Requires Python 3.8+. Download and install the latest release:
::
pip install chess
`Documentation <https://python-chess.readthedocs.io/en/v1.11.1/>`__
--------------------------------------------------------------------
* `Core <https://python-chess.readthedocs.io/en/v1.11.1/core.html>`_
* `PGN parsing and writing <https://python-chess.readthedocs.io/en/v1.11.1/pgn.html>`_
* `Polyglot opening book reading <https://python-chess.readthedocs.io/en/v1.11.1/polyglot.html>`_
* `Gaviota endgame tablebase probing <https://python-chess.readthedocs.io/en/v1.11.1/gaviota.html>`_
* `Syzygy endgame tablebase probing <https://python-chess.readthedocs.io/en/v1.11.1/syzygy.html>`_
* `UCI/XBoard engine communication <https://python-chess.readthedocs.io/en/v1.11.1/engine.html>`_
* `Variants <https://python-chess.readthedocs.io/en/v1.11.1/variant.html>`_
* `Changelog <https://python-chess.readthedocs.io/en/v1.11.1/changelog.html>`_
Features
--------
* Includes mypy typings.
* IPython/Jupyter Notebook integration.
`SVG rendering docs <https://python-chess.readthedocs.io/en/v1.11.1/svg.html>`_.
.. code:: python
>>> board
.. image:: https://backscattering.de/web-boardimage/board.png?fen=r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR&lastmove=h5f7&check=e8
:alt: r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR
* Chess variants: Standard, Chess960, Suicide, Giveaway, Atomic,
King of the Hill, Racing Kings, Horde, Three-check, Crazyhouse.
`Variant docs <https://python-chess.readthedocs.io/en/v1.11.1/variant.html>`_.
* Make and unmake moves.
.. code:: python
>>> Nf3 = chess.Move.from_uci("g1f3")
>>> board.push(Nf3) # Make the move
>>> board.pop() # Unmake the last move
Move.from_uci('g1f3')
* Show a simple ASCII board.
.. code:: python
>>> board = chess.Board("r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR b KQkq - 0 4")
>>> print(board)
r . b q k b . r
p p p p . Q p p
. . n . . n . .
. . . . p . . .
. . B . P . . .
. . . . . . . .
P P P P . P P P
R N B . K . N R
* Detects checkmates, stalemates and draws by insufficient material.
.. code:: python
>>> board.is_stalemate()
False
>>> board.is_insufficient_material()
False
>>> board.outcome()
Outcome(termination=<Termination.CHECKMATE: 1>, winner=True)
* Detects repetitions. Has a half-move clock.
.. code:: python
>>> board.can_claim_threefold_repetition()
False
>>> board.halfmove_clock
0
>>> board.can_claim_fifty_moves()
False
>>> board.can_claim_draw()
False
With the new rules from July 2014, a game ends as a draw (even without a
claim) once a fivefold repetition occurs or if there are 75 moves without
a pawn push or capture. Other ways of ending a game take precedence.
.. code:: python
>>> board.is_fivefold_repetition()
False
>>> board.is_seventyfive_moves()
False
* Detects checks and attacks.
.. code:: python
>>> board.is_check()
True
>>> board.is_attacked_by(chess.WHITE, chess.E8)
True
>>> attackers = board.attackers(chess.WHITE, chess.F3)
>>> attackers
SquareSet(0x0000_0000_0000_4040)
>>> chess.G2 in attackers
True
>>> print(attackers)
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . 1 .
. . . . . . 1 .
* Parses and creates SAN representation of moves.
.. code:: python
>>> board = chess.Board()
>>> board.san(chess.Move(chess.E2, chess.E4))
'e4'
>>> board.parse_san('Nf3')
Move.from_uci('g1f3')
>>> board.variation_san([chess.Move.from_uci(m) for m in ["e2e4", "e7e5", "g1f3"]])
'1. e4 e5 2. Nf3'
* Parses and creates FENs, extended FENs and Shredder FENs.
.. code:: python
>>> board.fen()
'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'
>>> board.shredder_fen()
'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w HAha - 0 1'
>>> board = chess.Board("8/8/8/2k5/4K3/8/8/8 w - - 4 45")
>>> board.piece_at(chess.C5)
Piece.from_symbol('k')
* Parses and creates EPDs.
.. code:: python
>>> board = chess.Board()
>>> board.epd(bm=board.parse_uci("d2d4"))
'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - bm d4;'
>>> ops = board.set_epd("1k1r4/pp1b1R2/3q2pp/4p3/2B5/4Q3/PPP2B2/2K5 b - - bm Qd1+; id \"BK.01\";")
>>> ops == {'bm': [chess.Move.from_uci('d6d1')], 'id': 'BK.01'}
True
* Detects `absolute pins and their directions <https://python-chess.readthedocs.io/en/v1.11.1/core.html#chess.Board.pin>`_.
* Reads Polyglot opening books.
`Docs <https://python-chess.readthedocs.io/en/v1.11.1/polyglot.html>`__.
.. code:: python
>>> import chess.polyglot
>>> book = chess.polyglot.open_reader("data/polyglot/performance.bin")
>>> board = chess.Board()
>>> main_entry = book.find(board)
>>> main_entry.move
Move.from_uci('e2e4')
>>> main_entry.weight
1
>>> book.close()
* Reads and writes PGNs. Supports headers, comments, NAGs and a tree of
variations.
`Docs <https://python-chess.readthedocs.io/en/v1.11.1/pgn.html>`__.
.. code:: python
>>> import chess.pgn
>>> with open("data/pgn/molinari-bordais-1979.pgn") as pgn:
... first_game = chess.pgn.read_game(pgn)
>>> first_game.headers["White"]
'Molinari'
>>> first_game.headers["Black"]
'Bordais'
>>> first_game.mainline()
<Mainline at ... (1. e4 c5 2. c4 Nc6 3. Ne2 Nf6 4. Nbc3 Nb4 5. g3 Nd3#)>
>>> first_game.headers["Result"]
'0-1'
* Probe Gaviota endgame tablebases (DTM, WDL).
`Docs <https://python-chess.readthedocs.io/en/v1.11.1/gaviota.html>`__.
* Probe Syzygy endgame tablebases (DTZ, WDL).
`Docs <https://python-chess.readthedocs.io/en/v1.11.1/syzygy.html>`__.
.. code:: python
>>> import chess.syzygy
>>> tablebase = chess.syzygy.open_tablebase("data/syzygy/regular")
>>> # Black to move is losing in 53 half moves (distance to zero) in this
>>> # KNBvK endgame.
>>> board = chess.Board("8/2K5/4B3/3N4/8/8/4k3/8 b - - 0 1")
>>> tablebase.probe_dtz(board)
-53
>>> tablebase.close()
* Communicate with UCI/XBoard engines. Based on ``asyncio``.
`Docs <https://python-chess.readthedocs.io/en/v1.11.1/engine.html>`__.
.. code:: python
>>> import chess.engine
>>> engine = chess.engine.SimpleEngine.popen_uci("stockfish")
>>> board = chess.Board("1k1r4/pp1b1R2/3q2pp/4p3/2B5/4Q3/PPP2B2/2K5 b - - 0 1")
>>> limit = chess.engine.Limit(time=2.0)
>>> engine.play(board, limit)
<PlayResult at ... (move=d6d1, ponder=c1d1, info={...}, draw_offered=False, resigned=False)>
>>> engine.quit()
Selected projects
-----------------
If you like, share interesting things you are using python-chess for, for example:
+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/syzygy.png?raw=true | https://syzygy-tables.info/ |
| :height: 64 | |
| :width: 64 | |
| :target: https://syzygy-tables.info/ | A website to probe Syzygy endgame tablebases |
+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/maia.png?raw=true | https://maiachess.com/ |
| :height: 64 | |
| :width: 64 | |
| :target: https://maiachess.com/ | A human-like neural network chess engine |
+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/clente-chess.png?raw=true | `clente/chess <https://github.com/clente/chess>`_ |
| :height: 64 | |
| :width: 64 | |
| :target: https://github.com/clente/chess | Oppinionated wrapper to use python-chess from the R programming language |
+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/crazyara.png?raw=true | https://crazyara.org/ |
| :height: 64 | |
| :width: 64 | |
| :target: https://crazyara.org/ | Deep learning for Crazyhouse |
+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/jcchess.png?raw=true | `http://johncheetham.com <http://johncheetham.com/projects/jcchess/>`_ |
| :height: 64 | |
| :width: 64 | |
| :target: http://johncheetham.com/projects/jcchess/ | A GUI to play against UCI chess engines |
+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/pettingzoo.png?raw=true | `https://pettingzoo.farama.org <https://pettingzoo.farama.org/environments/classic/chess/>`_ |
| :width: 64 | |
| :height: 64 | |
| :target: https://pettingzoo.farama.org/environments/classic/chess/ | A multi-agent reinforcement learning environment |
+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+
| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/cli-chess.png?raw=true | `cli-chess <https://github.com/trevorbayless/cli-chess>`_ |
| :width: 64 | |
| :height: 64 | |
| :target: https://github.com/trevorbayless/cli-chess | A highly customizable way to play chess in your terminal |
+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+
* extensions to build engines (search and evaluation) – https://github.com/Mk-Chan/python-chess-engine-extensions
* a stand-alone chess computer based on DGT board – https://picochess.com/
* a bridge between Lichess API and chess engines – https://github.com/lichess-bot-devs/lichess-bot
* a command-line PGN annotator – https://github.com/rpdelaney/python-chess-annotator
* an HTTP microservice to render board images – https://github.com/niklasf/web-boardimage
* building a toy chess engine with alpha-beta pruning, piece-square tables, and move ordering – https://healeycodes.com/building-my-own-chess-engine/
* a JIT compiled chess engine – https://github.com/SamRagusa/Batch-First
* teaching Cognitive Science – `https://jupyter.brynmawr.edu <https://jupyter.brynmawr.edu/services/public/dblank/CS371%20Cognitive%20Science/2016-Fall/Programming%20a%20Chess%20Player.ipynb>`_
* an `Alexa skill to play blindfold chess <https://www.amazon.com/Laynr-blindfold-chess/dp/B0859QF8YL>`_ – https://github.com/laynr/blindfold-chess
* a chessboard widget for PySide2 – https://github.com/H-a-y-k/hichesslib
* Django Rest Framework API for multiplayer chess – https://github.com/WorkShoft/capablanca-api
* a `browser based PGN viewer <https://about.nmstoker.com/chess2.html>`_ written in PyScript – https://github.com/nmstoker/ChessMatchViewer
* an accessible chessboard that allows blind and visually impaired players to play chess against Stockfish – https://github.com/blindpandas/chessmart
* a web-based chess vision exercise – https://github.com/3d12/rookognition
Prior art
---------
Thanks to the Stockfish authors and thanks to Sam Tannous for publishing his
approach to `avoid rotated bitboards with direct lookup (PDF) <http://arxiv.org/pdf/0704.3773.pdf>`_
alongside his GPL2+ engine `Shatranj <https://github.com/stannous/shatranj>`_.
Some move generation ideas are taken from these sources.
Thanks to Ronald de Man for his
`Syzygy endgame tablebases <https://github.com/syzygy1/tb>`_.
The probing code in python-chess is very directly ported from his C probing code.
Thanks to `Kristian Glass <https://github.com/doismellburning>`_ for
transferring the namespace ``chess`` on PyPI.
License
-------
python-chess is licensed under the GPL 3 (or any later version at your option).
Check out ``LICENSE.txt`` for the full text.
Raw data
{
"_id": null,
"home_page": "https://github.com/niklasf/python-chess",
"name": "chess",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "chess fen epd pgn polyglot syzygy gaviota uci xboard",
"author": "Niklas Fiekas",
"author_email": "niklas.fiekas@backscattering.de",
"download_url": "https://files.pythonhosted.org/packages/74/16/53b895bb4fccede8e506de820fa94db03a2dc8bd2ca4bec0aac4a112fb65/chess-1.11.1.tar.gz",
"platform": null,
"description": "python-chess: a chess library for Python\n========================================\n\n.. image:: https://github.com/niklasf/python-chess/workflows/Test/badge.svg\n :target: https://github.com/niklasf/python-chess/actions\n :alt: Test status\n\n.. image:: https://badge.fury.io/py/chess.svg\n :target: https://pypi.python.org/pypi/chess\n :alt: PyPI package\n\n.. image:: https://readthedocs.org/projects/python-chess/badge/?version=v1.11.1\n :target: https://python-chess.readthedocs.io/en/v1.11.1/\n :alt: Docs\n\n.. image:: https://badges.gitter.im/python-chess/community.svg\n :target: https://gitter.im/python-chess/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge\n :alt: Chat on Gitter\n\nIntroduction\n------------\n\npython-chess is a chess library for Python, with move generation,\nmove validation, and support for common formats. This is the Scholar's mate in\npython-chess:\n\n.. code:: python\n\n >>> import chess\n\n >>> board = chess.Board()\n\n >>> board.legal_moves\n <LegalMoveGenerator at ... (Nh3, Nf3, Nc3, Na3, h3, g3, f3, e3, d3, c3, ...)>\n >>> chess.Move.from_uci(\"a8a1\") in board.legal_moves\n False\n\n >>> board.push_san(\"e4\")\n Move.from_uci('e2e4')\n >>> board.push_san(\"e5\")\n Move.from_uci('e7e5')\n >>> board.push_san(\"Qh5\")\n Move.from_uci('d1h5')\n >>> board.push_san(\"Nc6\")\n Move.from_uci('b8c6')\n >>> board.push_san(\"Bc4\")\n Move.from_uci('f1c4')\n >>> board.push_san(\"Nf6\")\n Move.from_uci('g8f6')\n >>> board.push_san(\"Qxf7\")\n Move.from_uci('h5f7')\n\n >>> board.is_checkmate()\n True\n\n >>> board\n Board('r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR b KQkq - 0 4')\n\nInstalling\n----------\n\nRequires Python 3.8+. Download and install the latest release:\n\n::\n\n pip install chess\n\n\n`Documentation <https://python-chess.readthedocs.io/en/v1.11.1/>`__\n--------------------------------------------------------------------\n\n* `Core <https://python-chess.readthedocs.io/en/v1.11.1/core.html>`_\n* `PGN parsing and writing <https://python-chess.readthedocs.io/en/v1.11.1/pgn.html>`_\n* `Polyglot opening book reading <https://python-chess.readthedocs.io/en/v1.11.1/polyglot.html>`_\n* `Gaviota endgame tablebase probing <https://python-chess.readthedocs.io/en/v1.11.1/gaviota.html>`_\n* `Syzygy endgame tablebase probing <https://python-chess.readthedocs.io/en/v1.11.1/syzygy.html>`_\n* `UCI/XBoard engine communication <https://python-chess.readthedocs.io/en/v1.11.1/engine.html>`_\n* `Variants <https://python-chess.readthedocs.io/en/v1.11.1/variant.html>`_\n* `Changelog <https://python-chess.readthedocs.io/en/v1.11.1/changelog.html>`_\n\nFeatures\n--------\n\n* Includes mypy typings.\n\n* IPython/Jupyter Notebook integration.\n `SVG rendering docs <https://python-chess.readthedocs.io/en/v1.11.1/svg.html>`_.\n\n .. code:: python\n\n >>> board\n\n .. image:: https://backscattering.de/web-boardimage/board.png?fen=r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR&lastmove=h5f7&check=e8\n :alt: r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR\n\n* Chess variants: Standard, Chess960, Suicide, Giveaway, Atomic,\n King of the Hill, Racing Kings, Horde, Three-check, Crazyhouse.\n `Variant docs <https://python-chess.readthedocs.io/en/v1.11.1/variant.html>`_.\n\n* Make and unmake moves.\n\n .. code:: python\n\n >>> Nf3 = chess.Move.from_uci(\"g1f3\")\n >>> board.push(Nf3) # Make the move\n\n >>> board.pop() # Unmake the last move\n Move.from_uci('g1f3')\n\n* Show a simple ASCII board.\n\n .. code:: python\n\n >>> board = chess.Board(\"r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR b KQkq - 0 4\")\n >>> print(board)\n r . b q k b . r\n p p p p . Q p p\n . . n . . n . .\n . . . . p . . .\n . . B . P . . .\n . . . . . . . .\n P P P P . P P P\n R N B . K . N R\n\n* Detects checkmates, stalemates and draws by insufficient material.\n\n .. code:: python\n\n >>> board.is_stalemate()\n False\n >>> board.is_insufficient_material()\n False\n >>> board.outcome()\n Outcome(termination=<Termination.CHECKMATE: 1>, winner=True)\n\n* Detects repetitions. Has a half-move clock.\n\n .. code:: python\n\n >>> board.can_claim_threefold_repetition()\n False\n >>> board.halfmove_clock\n 0\n >>> board.can_claim_fifty_moves()\n False\n >>> board.can_claim_draw()\n False\n\n With the new rules from July 2014, a game ends as a draw (even without a\n claim) once a fivefold repetition occurs or if there are 75 moves without\n a pawn push or capture. Other ways of ending a game take precedence.\n\n .. code:: python\n\n >>> board.is_fivefold_repetition()\n False\n >>> board.is_seventyfive_moves()\n False\n\n* Detects checks and attacks.\n\n .. code:: python\n\n >>> board.is_check()\n True\n >>> board.is_attacked_by(chess.WHITE, chess.E8)\n True\n\n >>> attackers = board.attackers(chess.WHITE, chess.F3)\n >>> attackers\n SquareSet(0x0000_0000_0000_4040)\n >>> chess.G2 in attackers\n True\n >>> print(attackers)\n . . . . . . . .\n . . . . . . . .\n . . . . . . . .\n . . . . . . . .\n . . . . . . . .\n . . . . . . . .\n . . . . . . 1 .\n . . . . . . 1 .\n\n* Parses and creates SAN representation of moves.\n\n .. code:: python\n\n >>> board = chess.Board()\n >>> board.san(chess.Move(chess.E2, chess.E4))\n 'e4'\n >>> board.parse_san('Nf3')\n Move.from_uci('g1f3')\n >>> board.variation_san([chess.Move.from_uci(m) for m in [\"e2e4\", \"e7e5\", \"g1f3\"]])\n '1. e4 e5 2. Nf3'\n\n* Parses and creates FENs, extended FENs and Shredder FENs.\n\n .. code:: python\n\n >>> board.fen()\n 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'\n >>> board.shredder_fen()\n 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w HAha - 0 1'\n >>> board = chess.Board(\"8/8/8/2k5/4K3/8/8/8 w - - 4 45\")\n >>> board.piece_at(chess.C5)\n Piece.from_symbol('k')\n\n* Parses and creates EPDs.\n\n .. code:: python\n\n >>> board = chess.Board()\n >>> board.epd(bm=board.parse_uci(\"d2d4\"))\n 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - bm d4;'\n\n >>> ops = board.set_epd(\"1k1r4/pp1b1R2/3q2pp/4p3/2B5/4Q3/PPP2B2/2K5 b - - bm Qd1+; id \\\"BK.01\\\";\")\n >>> ops == {'bm': [chess.Move.from_uci('d6d1')], 'id': 'BK.01'}\n True\n\n* Detects `absolute pins and their directions <https://python-chess.readthedocs.io/en/v1.11.1/core.html#chess.Board.pin>`_.\n\n* Reads Polyglot opening books.\n `Docs <https://python-chess.readthedocs.io/en/v1.11.1/polyglot.html>`__.\n\n .. code:: python\n\n >>> import chess.polyglot\n\n >>> book = chess.polyglot.open_reader(\"data/polyglot/performance.bin\")\n\n >>> board = chess.Board()\n >>> main_entry = book.find(board)\n >>> main_entry.move\n Move.from_uci('e2e4')\n >>> main_entry.weight\n 1\n\n >>> book.close()\n\n* Reads and writes PGNs. Supports headers, comments, NAGs and a tree of\n variations.\n `Docs <https://python-chess.readthedocs.io/en/v1.11.1/pgn.html>`__.\n\n .. code:: python\n\n >>> import chess.pgn\n\n >>> with open(\"data/pgn/molinari-bordais-1979.pgn\") as pgn:\n ... first_game = chess.pgn.read_game(pgn)\n\n >>> first_game.headers[\"White\"]\n 'Molinari'\n >>> first_game.headers[\"Black\"]\n 'Bordais'\n\n >>> first_game.mainline()\n <Mainline at ... (1. e4 c5 2. c4 Nc6 3. Ne2 Nf6 4. Nbc3 Nb4 5. g3 Nd3#)>\n\n >>> first_game.headers[\"Result\"]\n '0-1'\n\n* Probe Gaviota endgame tablebases (DTM, WDL).\n `Docs <https://python-chess.readthedocs.io/en/v1.11.1/gaviota.html>`__.\n\n* Probe Syzygy endgame tablebases (DTZ, WDL).\n `Docs <https://python-chess.readthedocs.io/en/v1.11.1/syzygy.html>`__.\n\n .. code:: python\n\n >>> import chess.syzygy\n\n >>> tablebase = chess.syzygy.open_tablebase(\"data/syzygy/regular\")\n\n >>> # Black to move is losing in 53 half moves (distance to zero) in this\n >>> # KNBvK endgame.\n >>> board = chess.Board(\"8/2K5/4B3/3N4/8/8/4k3/8 b - - 0 1\")\n >>> tablebase.probe_dtz(board)\n -53\n\n >>> tablebase.close()\n\n* Communicate with UCI/XBoard engines. Based on ``asyncio``.\n `Docs <https://python-chess.readthedocs.io/en/v1.11.1/engine.html>`__.\n\n .. code:: python\n\n >>> import chess.engine\n\n >>> engine = chess.engine.SimpleEngine.popen_uci(\"stockfish\")\n\n >>> board = chess.Board(\"1k1r4/pp1b1R2/3q2pp/4p3/2B5/4Q3/PPP2B2/2K5 b - - 0 1\")\n >>> limit = chess.engine.Limit(time=2.0)\n >>> engine.play(board, limit)\n <PlayResult at ... (move=d6d1, ponder=c1d1, info={...}, draw_offered=False, resigned=False)>\n\n >>> engine.quit()\n\nSelected projects\n-----------------\n\nIf you like, share interesting things you are using python-chess for, for example:\n\n+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+\n| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/syzygy.png?raw=true | https://syzygy-tables.info/ |\n| :height: 64 | |\n| :width: 64 | |\n| :target: https://syzygy-tables.info/ | A website to probe Syzygy endgame tablebases |\n+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+\n| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/maia.png?raw=true | https://maiachess.com/ |\n| :height: 64 | |\n| :width: 64 | |\n| :target: https://maiachess.com/ | A human-like neural network chess engine |\n+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+\n| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/clente-chess.png?raw=true | `clente/chess <https://github.com/clente/chess>`_ |\n| :height: 64 | |\n| :width: 64 | |\n| :target: https://github.com/clente/chess | Oppinionated wrapper to use python-chess from the R programming language |\n+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+\n| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/crazyara.png?raw=true | https://crazyara.org/ |\n| :height: 64 | |\n| :width: 64 | |\n| :target: https://crazyara.org/ | Deep learning for Crazyhouse |\n+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+\n| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/jcchess.png?raw=true | `http://johncheetham.com <http://johncheetham.com/projects/jcchess/>`_ |\n| :height: 64 | |\n| :width: 64 | |\n| :target: http://johncheetham.com/projects/jcchess/ | A GUI to play against UCI chess engines |\n+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+\n| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/pettingzoo.png?raw=true | `https://pettingzoo.farama.org <https://pettingzoo.farama.org/environments/classic/chess/>`_ |\n| :width: 64 | |\n| :height: 64 | |\n| :target: https://pettingzoo.farama.org/environments/classic/chess/ | A multi-agent reinforcement learning environment |\n+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+\n| .. image:: https://github.com/niklasf/python-chess/blob/master/docs/images/cli-chess.png?raw=true | `cli-chess <https://github.com/trevorbayless/cli-chess>`_ |\n| :width: 64 | |\n| :height: 64 | |\n| :target: https://github.com/trevorbayless/cli-chess | A highly customizable way to play chess in your terminal |\n+------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+\n\n* extensions to build engines (search and evaluation) \u2013 https://github.com/Mk-Chan/python-chess-engine-extensions\n* a stand-alone chess computer based on DGT board \u2013 https://picochess.com/\n* a bridge between Lichess API and chess engines \u2013 https://github.com/lichess-bot-devs/lichess-bot\n* a command-line PGN annotator \u2013 https://github.com/rpdelaney/python-chess-annotator\n* an HTTP microservice to render board images \u2013 https://github.com/niklasf/web-boardimage\n* building a toy chess engine with alpha-beta pruning, piece-square tables, and move ordering \u2013 https://healeycodes.com/building-my-own-chess-engine/\n* a JIT compiled chess engine \u2013 https://github.com/SamRagusa/Batch-First\n* teaching Cognitive Science \u2013 `https://jupyter.brynmawr.edu <https://jupyter.brynmawr.edu/services/public/dblank/CS371%20Cognitive%20Science/2016-Fall/Programming%20a%20Chess%20Player.ipynb>`_\n* an `Alexa skill to play blindfold chess <https://www.amazon.com/Laynr-blindfold-chess/dp/B0859QF8YL>`_ \u2013 https://github.com/laynr/blindfold-chess\n* a chessboard widget for PySide2 \u2013 https://github.com/H-a-y-k/hichesslib\n* Django Rest Framework API for multiplayer chess \u2013 https://github.com/WorkShoft/capablanca-api\n* a `browser based PGN viewer <https://about.nmstoker.com/chess2.html>`_ written in PyScript \u2013 https://github.com/nmstoker/ChessMatchViewer\n* an accessible chessboard that allows blind and visually impaired players to play chess against Stockfish \u2013 https://github.com/blindpandas/chessmart\n* a web-based chess vision exercise \u2013 https://github.com/3d12/rookognition\n\n\nPrior art\n---------\n\nThanks to the Stockfish authors and thanks to Sam Tannous for publishing his\napproach to `avoid rotated bitboards with direct lookup (PDF) <http://arxiv.org/pdf/0704.3773.pdf>`_\nalongside his GPL2+ engine `Shatranj <https://github.com/stannous/shatranj>`_.\nSome move generation ideas are taken from these sources.\n\nThanks to Ronald de Man for his\n`Syzygy endgame tablebases <https://github.com/syzygy1/tb>`_.\nThe probing code in python-chess is very directly ported from his C probing code.\n\nThanks to `Kristian Glass <https://github.com/doismellburning>`_ for\ntransferring the namespace ``chess`` on PyPI.\n\nLicense\n-------\n\npython-chess is licensed under the GPL 3 (or any later version at your option).\nCheck out ``LICENSE.txt`` for the full text.\n",
"bugtrack_url": null,
"license": "GPL-3.0+",
"summary": "A chess library with move generation and validation, Polyglot opening book probing, PGN reading and writing, Gaviota tablebase probing, Syzygy tablebase probing, and XBoard/UCI engine communication.",
"version": "1.11.1",
"project_urls": {
"Documentation": "https://python-chess.readthedocs.io",
"Homepage": "https://github.com/niklasf/python-chess"
},
"split_keywords": [
"chess",
"fen",
"epd",
"pgn",
"polyglot",
"syzygy",
"gaviota",
"uci",
"xboard"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "741653b895bb4fccede8e506de820fa94db03a2dc8bd2ca4bec0aac4a112fb65",
"md5": "43693a3f67e0afd63b72ebf2c7ab649c",
"sha256": "b7f66a32dc599ab260e2b688e6ac4e868dad840377a54b61357e2dec2a5fed00"
},
"downloads": -1,
"filename": "chess-1.11.1.tar.gz",
"has_sig": false,
"md5_digest": "43693a3f67e0afd63b72ebf2c7ab649c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 156529,
"upload_time": "2024-10-09T18:28:48",
"upload_time_iso_8601": "2024-10-09T18:28:48.347365Z",
"url": "https://files.pythonhosted.org/packages/74/16/53b895bb4fccede8e506de820fa94db03a2dc8bd2ca4bec0aac4a112fb65/chess-1.11.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-09 18:28:48",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "niklasf",
"github_project": "python-chess",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "chess"
}