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() TrueSupports 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 7六歩(77) \r2 3四歩(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
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.
With pip:
pip install python-shogi
> make test
If you want to print lines from the standard output, execute nosetests like following.
> poetry run nosetests -s
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
- 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().