python-chess-bughouse


Namepython-chess-bughouse JSON
Version 0.28.0 PyPI version JSON
download
home_pagehttps://github.com/niklasf/python-chess
SummaryA pure Python 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.
upload_time2023-05-08 23:10:09
maintainer
docs_urlNone
authorNiklas Fiekas
requires_python>=3.5
licenseGPL-3.0+
keywords chess fen epd pgn polyglot syzygy gaviota uci xboard bughouse
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            python-chess: a pure Python chess library
=========================================

.. image:: https://travis-ci.org/niklasf/python-chess.svg?branch=v0.28.0
    :target: https://travis-ci.org/niklasf/python-chess

.. image:: https://ci.appveyor.com/api/projects/status/y9k3hdbm0f0nbum9/branch/v0.28.0?svg=true
    :target: https://ci.appveyor.com/project/niklasf/python-chess

.. image:: https://coveralls.io/repos/github/niklasf/python-chess/badge.svg?branch=master
   :target: https://coveralls.io/github/niklasf/python-chess?branch=master

.. image:: https://badge.fury.io/py/python-chess.svg
    :target: https://pypi.python.org/pypi/python-chess

.. image:: https://readthedocs.org/projects/python-chess/badge/?version=v0.28.0
    :target: https://python-chess.readthedocs.io/en/v0.28.0/

Introduction
------------

python-chess is a pure Python chess library 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')

`Documentation <https://python-chess.readthedocs.io/en/v0.28.0/>`__
--------------------------------------------------------------------

* `Core <https://python-chess.readthedocs.io/en/v0.28.0/core.html>`_
* `PGN parsing and writing <https://python-chess.readthedocs.io/en/v0.28.0/pgn.html>`_
* `Polyglot opening book reading <https://python-chess.readthedocs.io/en/v0.28.0/polyglot.html>`_
* `Gaviota endgame tablebase probing <https://python-chess.readthedocs.io/en/v0.28.0/gaviota.html>`_
* `Syzygy endgame tablebase probing <https://python-chess.readthedocs.io/en/v0.28.0/syzygy.html>`_
* `UCI/XBoard engine communication <https://python-chess.readthedocs.io/en/v0.28.0/engine.html>`_
* `Variants <https://python-chess.readthedocs.io/en/v0.28.0/variant.html>`_
* `Changelog <https://python-chess.readthedocs.io/en/v0.28.0/changelog.html>`_

Features
--------

* Supports Python 3.5+ and PyPy3.

* IPython/Jupyter Notebook integration.
  `SVG rendering docs <https://python-chess.readthedocs.io/en/v0.28.0/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

* 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/v0.28.0/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.is_game_over()
      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(0x0000000000004040)
      >>> 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/v0.28.0/core.html#chess.Board.pin>`_.

* Reads Polyglot opening books.
  `Docs <https://python-chess.readthedocs.io/en/v0.28.0/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/v0.28.0/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/v0.28.0/gaviota.html>`__.

* Probe Syzygy endgame tablebases (DTZ, WDL).
  `Docs <https://python-chess.readthedocs.io/en/v0.28.0/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/v0.28.0/engine.html>`__.

  .. code:: python

      >>> import chess.engine

      >>> engine = chess.engine.SimpleEngine.popen_uci("stockfish")
      >>> engine.id.get("name")
      'Stockfish 10 64 POPCNT'

      >>> 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()

Installing
----------

Download and install the latest release:

::

    pip install python-chess

Selected use cases
------------------

If you like, let me know if you are creating something intresting with
python-chess, for example:

* a stand-alone chess computer based on DGT board – http://www.picochess.org/
* a website to probe Syzygy endgame tablebases – https://syzygy-tables.info/
* deep learning for Crazyhouse – https://github.com/QueensGambit/CrazyAra
* a bridge between Lichess API and chess engines – https://github.com/careless25/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
* a JIT compiled chess engine – https://github.com/SamRagusa/Batch-First
* a GUI to play against UCI chess engines – http://johncheetham.com/projects/jcchess/
* teaching Cognitive Science – `https://jupyter.brynmawr.edu <https://jupyter.brynmawr.edu/services/public/dblank/CS371%20Cognitive%20Science/2016-Fall/Programming%20a%20Chess%20Player.ipynb>`_

Acknowledgements
----------------

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.

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": "python-chess-bughouse",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.5",
    "maintainer_email": "",
    "keywords": "chess fen epd pgn polyglot syzygy gaviota uci xboard bughouse",
    "author": "Niklas Fiekas",
    "author_email": "niklas.fiekas@backscattering.de",
    "download_url": "https://files.pythonhosted.org/packages/4e/cb/cbcec1049b7e117415898206704c765e53c78f31a1cc4b7e98aa4d570649/python-chess-bughouse-0.28.0.tar.gz",
    "platform": null,
    "description": "python-chess: a pure Python chess library\n=========================================\n\n.. image:: https://travis-ci.org/niklasf/python-chess.svg?branch=v0.28.0\n    :target: https://travis-ci.org/niklasf/python-chess\n\n.. image:: https://ci.appveyor.com/api/projects/status/y9k3hdbm0f0nbum9/branch/v0.28.0?svg=true\n    :target: https://ci.appveyor.com/project/niklasf/python-chess\n\n.. image:: https://coveralls.io/repos/github/niklasf/python-chess/badge.svg?branch=master\n   :target: https://coveralls.io/github/niklasf/python-chess?branch=master\n\n.. image:: https://badge.fury.io/py/python-chess.svg\n    :target: https://pypi.python.org/pypi/python-chess\n\n.. image:: https://readthedocs.org/projects/python-chess/badge/?version=v0.28.0\n    :target: https://python-chess.readthedocs.io/en/v0.28.0/\n\nIntroduction\n------------\n\npython-chess is a pure Python chess library with move generation, move\nvalidation 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\n`Documentation <https://python-chess.readthedocs.io/en/v0.28.0/>`__\n--------------------------------------------------------------------\n\n* `Core <https://python-chess.readthedocs.io/en/v0.28.0/core.html>`_\n* `PGN parsing and writing <https://python-chess.readthedocs.io/en/v0.28.0/pgn.html>`_\n* `Polyglot opening book reading <https://python-chess.readthedocs.io/en/v0.28.0/polyglot.html>`_\n* `Gaviota endgame tablebase probing <https://python-chess.readthedocs.io/en/v0.28.0/gaviota.html>`_\n* `Syzygy endgame tablebase probing <https://python-chess.readthedocs.io/en/v0.28.0/syzygy.html>`_\n* `UCI/XBoard engine communication <https://python-chess.readthedocs.io/en/v0.28.0/engine.html>`_\n* `Variants <https://python-chess.readthedocs.io/en/v0.28.0/variant.html>`_\n* `Changelog <https://python-chess.readthedocs.io/en/v0.28.0/changelog.html>`_\n\nFeatures\n--------\n\n* Supports Python 3.5+ and PyPy3.\n\n* IPython/Jupyter Notebook integration.\n  `SVG rendering docs <https://python-chess.readthedocs.io/en/v0.28.0/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\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/v0.28.0/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.is_game_over()\n      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(0x0000000000004040)\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/v0.28.0/core.html#chess.Board.pin>`_.\n\n* Reads Polyglot opening books.\n  `Docs <https://python-chess.readthedocs.io/en/v0.28.0/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/v0.28.0/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/v0.28.0/gaviota.html>`__.\n\n* Probe Syzygy endgame tablebases (DTZ, WDL).\n  `Docs <https://python-chess.readthedocs.io/en/v0.28.0/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/v0.28.0/engine.html>`__.\n\n  .. code:: python\n\n      >>> import chess.engine\n\n      >>> engine = chess.engine.SimpleEngine.popen_uci(\"stockfish\")\n      >>> engine.id.get(\"name\")\n      'Stockfish 10 64 POPCNT'\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\nInstalling\n----------\n\nDownload and install the latest release:\n\n::\n\n    pip install python-chess\n\nSelected use cases\n------------------\n\nIf you like, let me know if you are creating something intresting with\npython-chess, for example:\n\n* a stand-alone chess computer based on DGT board \u2013 http://www.picochess.org/\n* a website to probe Syzygy endgame tablebases \u2013 https://syzygy-tables.info/\n* deep learning for Crazyhouse \u2013 https://github.com/QueensGambit/CrazyAra\n* a bridge between Lichess API and chess engines \u2013 https://github.com/careless25/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* a JIT compiled chess engine \u2013 https://github.com/SamRagusa/Batch-First\n* a GUI to play against UCI chess engines \u2013 http://johncheetham.com/projects/jcchess/\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\nAcknowledgements\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\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 pure Python 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": "0.28.0",
    "project_urls": {
        "Homepage": "https://github.com/niklasf/python-chess"
    },
    "split_keywords": [
        "chess",
        "fen",
        "epd",
        "pgn",
        "polyglot",
        "syzygy",
        "gaviota",
        "uci",
        "xboard",
        "bughouse"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bd0ba71aefcb45368ef362218cc4b40821404ac59e84ba5d14e9455677685da2",
                "md5": "496f633d0cc7d9a8f596d714a73e041d",
                "sha256": "95bae7eedb5047f2d18689eeed6c71b0e5b582f56eb4afd15f0d69f190d378e4"
            },
            "downloads": -1,
            "filename": "python_chess_bughouse-0.28.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "496f633d0cc7d9a8f596d714a73e041d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.5",
            "size": 131462,
            "upload_time": "2023-05-08T23:10:02",
            "upload_time_iso_8601": "2023-05-08T23:10:02.594993Z",
            "url": "https://files.pythonhosted.org/packages/bd/0b/a71aefcb45368ef362218cc4b40821404ac59e84ba5d14e9455677685da2/python_chess_bughouse-0.28.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4ecbcbcec1049b7e117415898206704c765e53c78f31a1cc4b7e98aa4d570649",
                "md5": "e1418a662b467aff6c635e4214444be9",
                "sha256": "dd3fbd4ab581bb6cb0ce2a99143493c169e28bc235b136e5b9f0edc744ec9bdf"
            },
            "downloads": -1,
            "filename": "python-chess-bughouse-0.28.0.tar.gz",
            "has_sig": false,
            "md5_digest": "e1418a662b467aff6c635e4214444be9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.5",
            "size": 5950771,
            "upload_time": "2023-05-08T23:10:09",
            "upload_time_iso_8601": "2023-05-08T23:10:09.469952Z",
            "url": "https://files.pythonhosted.org/packages/4e/cb/cbcec1049b7e117415898206704c765e53c78f31a1cc4b7e98aa4d570649/python-chess-bughouse-0.28.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-05-08 23:10:09",
    "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": "python-chess-bughouse"
}
        
Elapsed time: 0.09673s