Skip to content

A pure Python shogi library with move generation and validation and handling of common formats.

License

Notifications You must be signed in to change notification settings

gunyarakun/python-shogi

Repository files navigation

python-shogi: a pure Python shogi library

Introduction

This is the module for shogi written in Pure Python. It's based on python-chess commit

This is the scholars mate in python-shogi:

>>>importshogi>>>board=shogi.Board() >>>board.push(shogi.Move.from_usi('7g7f')) >>>board.push_usi('3c3d') Move.from_usi('3c3d') >>>board.push_usi('8h2b+') Move.from_usi('8h2b+') >>>board.push_usi('4a5b') Move.from_usi('4a5b') >>>board.push_usi('B*4b') Move.from_usi('B*4b') >>>board.push_usi('5a4a') Move.from_usi('5a4a') >>>board.push_usi('2b3a') Move.from_usi('2b3a') >>>board.is_checkmate() True

Features

  • Supports Python 3.3+.

  • Supports standard shogi (hon shogi)

  • Legal move generator and move validation.

    >>>shogi.Move.from_usi("5i5a") inboard.legal_movesFalse
  • Make and unmake moves.

    >>>last_move=board.pop() # Unmake last move>>>last_moveMove.from_usi('2b3a') >>>board.push(last_move) # Restore
  • Show a simple ASCII board.

    >>>print(board) lnsg . k+Bnl . r . . gB . . . pppppp . pp . . . . . . p . . . . . . . . . . . . . P . . . . . . PP . PPPPPP . . . . . . . R . LNSGKGSNL<BLANKLINE>S*1
  • Show a KIF style board.

    >>>print(board.kif_str()) 後手の持駒: 9 8 7 6 5 4 3 2 1 +---------------------------+|v香v桂v銀v金v玉馬v桂v香||v飛 ・ ・v金 ・ ・ ・||v歩v歩v歩v歩v歩v歩v歩v歩|| ・ ・ ・ ・ ・ ・v歩 ・ ・|| ・ ・ ・ ・ ・ ・ ・ ・ ・|| ・ ・  ・ ・ ・ ・ ・ ・|||| ・ ・ ・ ・ ・ ・ ・ |||+---------------------------+先手の持駒
  • Detects checkmates, stalemates.

    >>>board.is_stalemate() False>>>board.is_game_over() True
  • Detects repetitions. Has a half move clock.

    >>>board.is_fourfold_repetition() False>>>board.move_number8
  • Detects checks and attacks.

    >>>board.is_check() True>>>board.is_attacked_by(shogi.BLACK, shogi.A4) True>>>attackers=board.attackers(shogi.BLACK, shogi.H5) >>>attackersSquareSet(0b111000010000000000000000000000000000000000000000000000000000000000000000000000) >>>shogi.H2inattackersTrue>>>print(attackers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . 111 . . .
  • Parses and creates USI representation of moves.

    >>>board=shogi.Board() >>>shogi.Move(shogi.E2, shogi.E4).usi() '2e4e'
  • Parses and creates SFENs

    >>>board.sfen() 'lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1'>>>board.piece_at(shogi.I5) Piece.from_symbol('K')
  • Read KIFs.

    >>>importshogi.KIF>>>kif=shogi.KIF.Parser.parse_file('data/games/habu-fujii-2006.kif')[0] >>>kif['names'][shogi.BLACK] '羽生善治'>>>kif['names'][shogi.WHITE] '藤井猛'>>>kif['moves'] # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ['7g7f', '3c3d', ..., '9a9b', '7a7b+'] >>>kif['win'] 'b'
  • Export to KIFs.

    >>>importshogi>>>importshogi.KIF>>>board=shogi.Board() >>>shogi.KIF.Exporter.kif_move_from('7g7f', board) '7六歩(77)'>>>sfen_summary={'moves': ['7g7f', '3c3d'], 'sfen': 'lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1', 'names': ['羽生善治', '藤井猛'], 'win': 'w'} >>>shogi.KIF.Exporter.kif(sfen_summary) 開始日時: \r終了日時: \r手合割平手\r先手羽生善治\r後手藤井猛\r手数----指手---------消費時間-- \r1六歩(77) \r2四歩(33) \r3投了 \rまで2手で後手の勝ち\r
  • Communicate with a CSA protocol.

    Please see random_csa_tcp_match.

  • Parse professional shogi players' name

    >>> import shogi.Person
    >>> shogi.Person.Name.is_professional('羽生 善治 名人・棋聖・王位・王座') True

Performance

python-shogi is not intended to be used by serious shogi engines where performance is critical. The goal is rather to create a simple and relatively highlevel library.

You can install the gmpy2 or gmpy modules in order to get a slight performance boost on basic operations like bit scans and population counts.

python-shogi will only ever import very basic general (non-shogi-related) operations from native libraries. All logic is pure Python. There will always be pure Python fallbacks.

Installing

  • With pip:

    pip install python-shogi 

How to test

> make test 

If you want to print lines from the standard output, execute nosetests like following.

> poetry run nosetests -s 

How to release

poetry config repositories.testpypi https://test.pypi.org/legacy/ # poetry config pypi-token.testpypi "Test PyPI API Token" make test-upload # poetry config pypi-token.pypi "PyPI API Token" make upload 

ToDo

  • Support board.generate_attacks() and use it in board.is_attacked_by() and board.attacker_mask().
  • Remove rotated bitboards and support Shatranj-style direct lookup like recent python-chess.
  • Support %MATTA etc. in CSA TCP Protocol.
  • Support board.is_pinned() and board.pin().

About

A pure Python shogi library with move generation and validation and handling of common formats.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 15

Languages