Board クラス
rsshogi.core.Board(sfen=None)
将棋の盤面を管理するメインクラスです。局面の状態、指し手の適用、合法手生成、 ゲーム状態の判定などの機能を提供します。
Board クラスは以下の機能を持ちます:
- 局面の初期化と SFEN 形式での読み書き
PositionStateを介した raw-state の export / import- 指し手の適用と取り消し(
apply_move/undo_move) - 合法手と擬似合法手の生成
- ゲーム状態の判定(王手、詰み、千日手など)
- 手番や手数などのメタ情報の取得
引数
- sfen:
str | None(デフォルト:None) 初期局面を SFEN 形式で指定します。Noneの場合は平手初期局面になります。
メソッド一覧
| カテゴリ | 主なメソッド・プロパティ |
|---|---|
| 局面の設定と取得 | to_sfen / set_sfen / copy / reset / to_position_state / set_position_state / set_usi_position / to_csa / to_bod / validate / is_valid / validate_all |
| 局面の設定と取得(シリアライズ) | to_packed_sfen / set_packed_sfen / to_hcp / set_hcp / to_psv / to_hcpe / apery_move32_from_move / apery_move32_from_move32 |
| 指し手の適用と取り消し | apply_move / apply_move32 / apply_usi / apply_csa / push_move / push_move32 / push_usi / push_usi_with_delta / undo_move / undo_move32 / pop / last_move |
| 盤上の駒の取得 | piece_on / is_square_empty / empties |
| 持ち駒と玉の位置 | hand / hand_counts / king_square / iter_pieces |
| 駒のビットボード | pieces / pieces_by_type / pieces_by_color / pieces_for / golds / bishop_horse / rook_dragon |
| 攻撃判定 | attackers_to / attackers_to_color / attackers_to_color_current / attacks_by / is_attacked_by |
| 合法手の生成と判定 | legal_moves / legal_moves_move32 / pseudo_legal_moves / pseudo_legal_moves_move32 / is_legal_move / is_legal_move32 |
| ゲーム状態の判定 | turn / game_ply / is_in_check / is_mated / repetition_state / is_repetition / can_declare_win / evaluate_declaration / solve_mate_in_one / zobrist_hash / move32_from_move / move_from_csa / to_svg |
例外ポリシー
- 型が不正:
TypeError - 値は型として正しいが内容が不正(不正な文字列・違法手など):
ValueError - 履歴が空など「未存在」:
Noneを返す(例:last_move(),pop())
局面の設定と取得
to_sfen()
board.to_sfen() -> str
現在局面を SFEN 形式の文字列で返します。
戻り値:
str: SFEN 形式の局面文字列
使用例:
board = rsshogi.core.Board()
print(board.to_sfen())
# => "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1"
copy()
board.copy() -> Board
現在局面のコピーを返します。
戻り値:
Board: コピーされた盤面
使用例:
board = rsshogi.core.Board()
board.apply_usi("7g7f")
clone = board.copy()
print(clone.to_sfen() == board.to_sfen()) # => True
reset()
board.reset() -> None
盤面を平手初期局面に戻します。
使用例:
board = rsshogi.core.Board()
board.apply_usi("7g7f")
board.reset()
print(board.to_sfen())
set_sfen(sfen)
board.set_sfen(sfen: str) -> None
盤面を指定した SFEN で上書きします。
引数:
- sfen:
str- 設定する SFEN 文字列
例外:
ValueError: SFEN のパースに失敗した場合
使用例:
board = rsshogi.core.Board()
board.set_sfen("lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1")
to_position_state()
board.to_position_state() -> PositionState
現在局面を SFEN 文字列ではなく、編集可能な raw-state として取得します。
使用例:
from rsshogi.core import Board
board = Board()
state = board.to_position_state()
print(state.to_sfen())
set_position_state(state)
board.set_position_state(state: PositionState) -> None
PositionState から局面を再構築します。SFEN 文字列を経由しない import 用 API です。
この import は unchecked なので、必要に応じて validate() / validate_all() を呼んでください。
使用例:
from rsshogi.core import Board
from rsshogi.types import Color, Piece, PieceType, Square
board = Board()
state = board.to_position_state()
state.set_piece(Square.from_usi("7g"), Piece(0))
state.set_piece(Square.from_usi("7f"), Piece.from_color_type(Color.BLACK, PieceType.PAWN))
state.side_to_move = Color.WHITE
board.set_position_state(state)
set_usi_position(position)
board.set_usi_position(position: str) -> None
USI の position 形式文字列から局面を設定します。
受け付ける形式:
startposposition startpossfen <board> <turn> <hand> <ply>position sfen <board> <turn> <hand> <ply>- 上記に
moves <usi1> <usi2> ...を付加した形式
moves がある場合は手順を順に適用します(不正手・非合法手は ValueError)。
引数:
- position:
str- USI position 文字列
例外:
ValueError: position 文字列が不正、または手順に不正手/非合法手が含まれる場合
使用例:
from rsshogi.core import Board
board = Board()
board.set_usi_position("position startpos moves 7g7f 3c3d")
print(board.to_sfen())
# => "lnsgkgsnl/1r5b1/pppppp1pp/6p2/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL b - 3"
to_packed_sfen(out=None)
board.to_packed_sfen(out=None) -> bytes | None
現在局面を PackedSfen (psfen) 形式で取得します。
引数:
- out:
bytearray | numpy.ndarray | None
出力先バッファ。Noneの場合はbytesを返します。
指定する場合は以下のいずれか:- 長さ 32 の writable
uint8配列 dtype=[("sfen", uint8, 32)]のnumpy.ndarray(shape(1,))
- 長さ 32 の writable
戻り値:
bytes | None:out is Noneならbytes、outを渡した場合はNone
使用例:
board = rsshogi.core.Board()
psfen = board.to_packed_sfen()
print(len(psfen)) # => 32
out = bytearray(32)
board.to_packed_sfen(out)
to_hcp(out=None)
board.to_hcp(out=None) -> bytes | None
現在局面を cshogi / Apery 互換の HuffmanCodedPos(32 バイト)で取得します。
out: writableuint8[32]またはHuffmanCodedPosndarray(shape(1,))
import numpy as np
from rsshogi.core import Board
from rsshogi.numpy import HuffmanCodedPos
board = Board()
hcp = board.to_hcp()
print(len(hcp)) # => 32
out = np.zeros(1, dtype=HuffmanCodedPos)
board.to_hcp(out)
to_psv(mv=None, score=0, game_result=None, game_ply=None, out=None)
board.to_psv(mv=None, score=0, game_result=None, game_ply=None, out=None) -> bytes | None
現在局面から PackedSfenValue 1件分(40バイト)を直接生成します。
out=None の場合は bytes を返し、out 指定時は None を返します。
mv:Move | Move32 | int | str | None(未指定時はMOVE_NONE)score:int16game_result:GameResult | int | str | None(未指定時はINVALID)game_ply:int | None(未指定時はboard.game_ply)out: writableuint8[40]またはPackedSfenValuendarray(shape(1,))
to_hcpe(best_move=None, score=0, game_result=None, out=None)
board.to_hcpe(best_move=None, score=0, game_result=None, out=None) -> bytes | None
現在局面から HuffmanCodedPosAndEval 1件分(38 バイト)を生成します。
best_move:AperyMove | AperyMove32 | Move | Move32 | int | str | Nonescore:int16game_result:GameResult | int | strDraw/BlackWin/WhiteWinに変換できる値のみ受理します。
out: writableuint8[38]またはHuffmanCodedPosAndEvalndarray(shape(1,))
best_move は最終的に Apery 16bit (bestMove16) へ正規化されます。
Move32 や USI 文字列を渡した場合も、局面に応じて AperyMove に変換してから書き出します。
game_result は必須です。未指定のまま hcpe を出力することはできません。
import numpy as np
from rsshogi.core import Board
from rsshogi.numpy import HuffmanCodedPosAndEval
board = Board()
hcpe = board.to_hcpe(best_move="7g7f", score=84, game_result="BLACK_WIN")
print(len(hcpe)) # => 38
out = np.zeros(1, dtype=HuffmanCodedPosAndEval)
board.to_hcpe(best_move="7g7f", score=84, game_result=1, out=out)
set_packed_sfen(psfen)
board.set_packed_sfen(psfen) -> None
PackedSfen (psfen) 形式の 32 バイト列から局面を設定します。 psfen は 互換の PackedSfen 形式(32 バイト)です。
引数:
- psfen: 次のいずれか
bytes/bytearray- 長さ 32 の
Sequence[int] - 長さ 32 の
numpy.ndarray(uint8) dtype=[("sfen", uint8, 32)]のnumpy.ndarray(shape(1,))
例外:
ValueError: 長さが 32 バイトでない場合TypeError: 受け取り型が不正な場合
使用例:
board = rsshogi.core.Board()
psfen = board.to_packed_sfen()
board.set_packed_sfen(psfen)
set_hcp(hcp, game_ply=1)
board.set_hcp(hcp, game_ply=1) -> None
HuffmanCodedPos 形式の 32 バイト列から局面を設定します。
引数:
- hcp: 次のいずれか
bytes/bytearray- 長さ 32 の
Sequence[int] - 長さ 32 の
numpy.ndarray(uint8) dtype=[("hcp", uint8, 32)]のnumpy.ndarray(shape(1,))
- game_ply:
int- 設定後の手数
board = rsshogi.core.Board()
hcp = board.to_hcp()
board.set_hcp(hcp, game_ply=17)
apery_move32_from_move(mv)
board.apery_move32_from_move(mv: Move) -> AperyMove32
現在局面の駒情報(取得駒種など)を補完して Move を AperyMove32 に変換します。
apery_move32_from_move32(mv)
board.apery_move32_from_move32(mv: Move32) -> AperyMove32
現在局面を使って Move32 を AperyMove32 に変換します。
取得駒種の補完が必要なため、Board の文脈を使います。
validate()
board.validate() -> None
現在局面を検証し、最初に見つかった問題を ValueError として送出します。
is_valid()
board.is_valid() -> bool
validate() と同じ条件で局面が妥当かどうかを返します。
validate_all()
board.validate_all() -> ValidationReport
現在局面の問題をすべて収集して返します。raw-state 編集後の全件確認に向いています。
使用例:
from rsshogi.core import Board
board = Board()
report = board.validate_all()
print(report.is_valid())
to_csa()
board.to_csa() -> str
現在局面を CSA 形式の局面行(P1..P9, P+, P-, +/-)として返します。
戻り値:
str: CSA 形式の局面行
使用例:
board = rsshogi.core.Board()
print(board.to_csa())
to_bod()
board.to_bod() -> str
現在局面を BOD 形式(将棋ウォーズなどで使われる形式)の文字列として返します。 直前の指し手がある場合は、局面と合わせて「手数=N ○○ まで」の形式で出力します。
戻り値:
str: BOD 形式の文字列
使用例:
board = rsshogi.core.Board()
board.apply_usi("7g7f")
print(board.to_bod())
指し手の適用と取り消し
apply_move(move)
board.apply_move(move) -> None
指し手を適用して局面を進めます。move は Move を指定します。
Move32 を適用する場合は apply_move32() を使います。
引数:
- move:
Move適用する指し手。
例外:
ValueError: 違法手を適用しようとした場合TypeError: サポートされていない型を渡した場合
使用例:
board = rsshogi.core.Board()
# USI 文字列で指す
board.apply_usi("7g7f")
# Move で指す
move = rsshogi.core.Move.from_usi("3c3d")
board.apply_move(move)
# 合法手リストから指す
board.apply_move(board.legal_moves()[0])
apply_move32(move)
board.apply_move32(move) -> None
Move32 を受け取り、指し手を適用して局面を進めます。
引数:
- move:
Move32- 適用する指し手
例外:
ValueError: 違法手を適用しようとした場合
push_move(move)
board.push_move(move) -> Move32
apply_move() と同様に指し手を適用し、適用した Move32(32bit)を返します。
push_move32(move)
board.push_move32(move) -> Move32
apply_move32() と同様に Move32 を適用し、適用した Move32 を返します。
push_usi(usi)
board.push_usi(usi: str) -> Move32
USI 文字列で手を進め、適用した Move32(32bit)を返します。
push_usi_with_delta(usi)
board.push_usi_with_delta(usi: str) -> dict
USI 文字列で手を進め、適用した Move32 と差分情報(ハッシュ変化・取得駒種など)を辞書で返します。
例外:
ValueError: USI 文字列のパースに失敗した場合、または違法手の場合
apply_usi(usi)
board.apply_usi(usi: str) -> None
USI 文字列を受け取り、指し手を適用します。文字列入力が必要な場合に使います。
引数:
- usi:
str- USI 形式の指し手文字列(例:"7g7f","P*5e")
例外:
ValueError: 文字列のパースに失敗した場合、または違法手の場合
使用例:
board = rsshogi.core.Board()
board.apply_usi("7g7f")
apply_csa(csa)
board.apply_csa(csa: str) -> None
CSA 文字列を受け取り、指し手を適用します。先頭の手番記号(+ / -)があっても受け付けます。
引数:
- csa:
str- CSA 形式の指し手文字列(例:"7776FU","+7776FU")
例外:
ValueError: 文字列のパースに失敗した場合、または違法手の場合
使用例:
board = rsshogi.core.Board()
board.apply_csa("7776FU")
undo_move(move)
board.undo_move(move) -> None
指定した指し手を取り消し、1手戻します。
引数:
- move:
Move- 取り消す指し手(Move32の場合はundo_move32()を使用)
例外:
ValueError: 指し手の取り消しに失敗した場合
使用例:
board = rsshogi.core.Board()
move = rsshogi.core.Move.from_usi("7g7f")
board.apply_move(move)
board.undo_move(move) # 適用したのと同じ Move を渡す
undo_move32(move)
board.undo_move32(move) -> None
Move32 を指定して取り消し、1手戻します。直前の指し手と一致する必要があります。
引数:
- move:
Move32- 取り消す指し手
例外:
ValueError: 直前の指し手と一致しない場合
pop()
board.pop() -> Move32 | None
直前の指し手を取り消して返します。履歴が空なら None。
last_move()
board.last_move() -> Move32 | None
直前の指し手を取得します(盤面は変更されません)。
戻り値:
Move32 | None: 直前の指し手。履歴が空の場合はNone
使用例:
board = rsshogi.core.Board()
board.apply_usi("7g7f")
last_move = board.last_move()
if last_move:
print(last_move.to_usi()) # => "7g7f"
盤上の駒の取得
piece_on(square)
board.piece_on(square: Square) -> Piece
指定したマスにある駒を取得します。
引数:
- square:
Square- 対象のマス
戻り値:
Piece: マスにある駒。空きマスの場合はpiece_typeがPieceType.NO_PIECE_TYPEを返す
使用例:
from rsshogi.core import Board
from rsshogi.types import Square
board = Board()
sq = Square.from_usi("7g")
piece = board.piece_on(sq)
print(piece.piece_type) # => PieceType.PAWN
print(piece.color) # => Color.BLACK
is_square_empty(square)
board.is_square_empty(square: Square) -> bool
指定したマスが空かどうかを判定します。
引数:
- square:
Square- 対象のマス
戻り値:
bool: 空きマスの場合True
使用例:
from rsshogi.core import Board
from rsshogi.types import Square
board = Board()
sq = Square.from_usi("5e")
print(board.is_square_empty(sq)) # => True(初期局面で5五は空)
empties()
board.empties() -> Bitboard
空きマスの集合をビットボードで取得します。
戻り値:
Bitboard: 空きマスのビットボード
使用例:
board = Board()
empties = board.empties()
print(empties.count()) # => 61(初期局面の空きマス数)
持ち駒と玉の位置
hand(color)
board.hand(color: Color) -> Hand
指定した手番の持ち駒を取得します。
引数:
- color:
Color- 手番(Color.BLACKまたはColor.WHITE)
戻り値:
Hand: 持ち駒オブジェクト
使用例:
from rsshogi.core import Board
from rsshogi.types import Color, PieceType
board = Board()
# 持ち駒のある局面を設定
board.set_sfen("lnsgkgsnl/1r5b1/pppppp1pp/6p2/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL b P 1")
hand = board.hand(Color.BLACK)
print(hand.count(PieceType.PAWN)) # => 1
hand_counts(color)
board.hand_counts(color: Color) -> dict[str, int]
指定した手番の持ち駒枚数を USI 駒文字をキーとする辞書で返します。
常に "P", "L", "N", "S", "B", "R", "G" の 7 キーを含み、持っていない駒は 0 です。
from rsshogi.core import Board
from rsshogi.types import Color
board = Board()
counts = board.hand_counts(Color.BLACK)
print(counts["P"]) # => 0(初期局面)
king_square(color)
board.king_square(color: Color) -> Square
指定した手番の玉の位置を取得します。
引数:
- color:
Color- 手番
戻り値:
Square: 玉のマス
使用例:
from rsshogi.core import Board
from rsshogi.types import Color
board = Board()
sq = board.king_square(Color.BLACK)
print(sq.to_usi()) # => "5i"
iter_pieces()
board.iter_pieces() -> list[tuple[Square, Piece]]
盤上にある駒だけを (Square, Piece) のリストで返します。空マスは含みません。
順序は内部 square index の昇順(1a, 1b, …, 9i)です。
from rsshogi.core import Board
board = Board()
for square, piece in board.iter_pieces():
print(square.to_usi(), piece)
駒のビットボード
盤上の駒をビットボードで取得するメソッド群です。
pieces()
board.pieces() -> Bitboard
全ての駒があるマスをビットボードで取得します。
pieces_by_type(piece_type)
board.pieces_by_type(piece_type: PieceType) -> Bitboard
指定した駒種のマスをビットボードで取得します(先後両方)。
使用例:
from rsshogi.core import Board
from rsshogi.types import PieceType
board = Board()
pawns = board.pieces_by_type(PieceType.PAWN)
print(pawns.count()) # => 18(先後合計)
pieces_by_color(color)
board.pieces_by_color(color: Color) -> Bitboard
指定した手番の全駒をビットボードで取得します。
pieces_for(piece_type, color)
board.pieces_for(piece_type: PieceType, color: Color) -> Bitboard
指定した駒種と手番の駒をビットボードで取得します。
その他のビットボード取得
board.golds() -> Bitboard # 金相当の駒(金、と、成香、成桂、成銀)
board.bishop_horse() -> Bitboard # 角と馬
board.rook_dragon() -> Bitboard # 飛と龍
攻撃判定
attackers_to(square, occupied)
board.attackers_to(square: Square, occupied: Bitboard) -> Bitboard
指定したマスを攻撃している駒のビットボードを取得します。
引数:
- square:
Square- 対象のマス - occupied:
Bitboard- 駒がある位置(通常はboard.pieces())
戻り値:
Bitboard: 攻撃している駒の位置
attackers_to_color(color, square, occupied)
board.attackers_to_color(color: Color, square: Square, occupied: Bitboard) -> Bitboard
指定した手番の駒で、マスを攻撃しているものを取得します。
attackers_to_color_current(color, square)
board.attackers_to_color_current(color: Color, square: Square) -> Bitboard
現在の盤面で、指定した手番の駒がマスを攻撃しているものを取得します。
attacks_by(color, piece_type)
board.attacks_by(color: Color, piece_type: PieceType) -> Bitboard
指定した手番・駒種の攻撃範囲をビットボードで取得します。
is_attacked_by(square, by_color)
board.is_attacked_by(square: Square, by_color: Color) -> bool
指定したマスが、指定した手番の駒に攻撃されているかを判定します。
使用例:
from rsshogi.core import Board
from rsshogi.types import Color, Square
board = Board()
board.apply_usi("7g7f")
sq = Square.from_usi("7e")
# 7六の歩が7五を攻撃しているか
print(board.is_attacked_by(sq, Color.BLACK)) # => True
合法手の生成と判定
legal_moves()
board.legal_moves() -> list[Move]
現在局面の全合法手をリストで返します。歩・香・角・飛の不成も含めて生成します。
戻り値:
list[Move]: 合法手のリスト
使用例:
board = rsshogi.core.Board()
for move in board.legal_moves():
print(move.to_usi())
legal_moves_move32()
board.legal_moves_move32() -> list[Move32]
現在局面の全合法手を Move32(32bit)で返します。詳細な駒情報が必要な場合に使用します。
戻り値:
list[Move32]: 合法手のリスト
使用例:
board = rsshogi.core.Board()
for move in board.legal_moves_move32():
print(move.to_usi())
pseudo_legal_moves()
board.pseudo_legal_moves() -> list[Move]
擬似合法手(王手放置を含む可能性のある手)をリストで返します。 王手中の場合は回避手も含まれます。
戻り値:
list[Move]: 擬似合法手のリスト
注意:
探索や局面生成でローカルにフィルタリングする用途向けです。
通常の用途では legal_moves() を使用してください。
使用例:
board = rsshogi.core.Board()
for move in board.pseudo_legal_moves():
if board.is_legal_move(move):
print(move.to_usi())
pseudo_legal_moves_move32()
board.pseudo_legal_moves_move32() -> list[Move32]
擬似合法手(王手放置を含む可能性のある手)を Move32(32bit)で返します。
戻り値:
list[Move32]: 擬似合法手のリスト
使用例:
board = rsshogi.core.Board()
for move in board.pseudo_legal_moves_move32():
if board.is_legal_move32(move):
print(move.to_usi())
is_legal_move(move)
board.is_legal_move(move) -> bool
指定した指し手が合法手かどうかを判定します。Move32 の場合は is_legal_move32() を使います。
引数:
- move:
Move- 判定する指し手
戻り値:
bool: 合法手ならTrue、そうでなければFalse
move は Move を受け付けます。
使用例:
board = rsshogi.core.Board()
move = rsshogi.core.Move.from_usi("7g7f")
if board.is_legal_move(move):
board.apply_move(move)
is_legal_move32(move)
board.is_legal_move32(move) -> bool
Move32 が合法手かどうかを判定します。
引数:
- move:
Move32- 判定する指し手
戻り値:
bool: 合法手ならTrue、そうでなければFalse
使用例:
board = rsshogi.core.Board()
for move in board.pseudo_legal_moves_move32():
if board.is_legal_move32(move):
board.apply_move32(move)
break
ゲーム状態の判定
turn
board.turn: Color
現在の手番を Color 型で取得します。Color.BLACK/Color.WHITE がそのまま返るので型安全な比較が可能です。
zobrist_hash()
board.zobrist_hash() -> int
現在局面の Zobrist ハッシュ値を返します(局面キー用途)。
can_declare_win()
board.can_declare_win() -> bool
現在手番で入玉宣言勝ち可能かを判定します。
evaluate_declaration()
board.evaluate_declaration() -> dict
入玉宣言の詳細評価を辞書形式で返します。点数計算の内訳(大駒点数・小駒点数・総点数など)が含まれます。
solve_mate_in_one()
board.solve_mate_in_one() -> Move32 | None
現在局面で1手詰めが存在すれば、詰め手を Move32 で返します。存在しない場合は None。
board = rsshogi.core.Board()
# ... 1手詰め局面を設定 ...
mate = board.solve_mate_in_one()
if mate:
print(mate.to_usi())
move32_from_move(mv)
board.move32_from_move(mv: Move) -> Move32
Move(16bit)を現在の局面を参照して完全な Move32(32bit、駒情報付き)に変換します。
返される Move32 は piece_after_move や CSA/KI2 変換に使用できます。
Move32.from_usi() で生成した Move32 には駒情報が含まれない(部分 Move32)ため、
駒情報が必要な場合はこのメソッドで完全化してください。
move_from_csa(csa)
board.move_from_csa(csa: str) -> Move32
CSA 文字列から局面依存の Move32(32bit)を復元します(線形探索不要)。
game_ply
board.game_ply: int
初期局面からの手数(ply)を返します。USI 標準に準拠しています。
戻り値:
int: 手数
使用例:
board = rsshogi.core.Board()
print(board.game_ply) # => 1
board.apply_usi("7g7f")
print(board.game_ply) # => 2
is_in_check()
board.is_in_check() -> bool
現在の手番の玉が王手にさらされているかを判定します。
戻り値:
bool: 王手されている場合True
使用例:
board = rsshogi.core.Board()
if board.is_in_check():
print("王手!")
is_mated()
board.is_mated() -> bool
現在局面が詰み(王手かつ合法手なし)かどうかを判定します。
戻り値:
bool: 詰みの場合True
使用例:
board = rsshogi.core.Board()
if board.is_mated():
print("詰み!")
repetition_state()
board.repetition_state() -> RepetitionState
千日手の状態を返します。
戻り値:
RepetitionState:NONE,WIN,LOSE,DRAW,SUPERIOR,INFERIOR
使用例:
board = rsshogi.core.Board()
state = board.repetition_state()
if state.to_usi() == "rep_draw":
print("千日手引き分け")
is_repetition(threshold=3)
board.is_repetition(threshold: int = 3) -> bool
千日手が発生しているかを返します。
引数:
- threshold:
int- 千日手と判定する繰り返し回数(通常は 3)
戻り値:
bool: 千日手の場合True
使用例:
board = rsshogi.core.Board()
if board.is_repetition():
print("千日手発生")
to_svg(last_move=None, scale=1.0)
board.to_svg(last_move=None, scale=1.0) -> Svg
現在の局面を SVG 画像として生成します。
引数:
- last_move:
Move | Move32 | None- 最後の指し手(ハイライト表示)。MoveまたはMove32のみ受け付けます。 - scale:
float- 拡大率(デフォルト1.0)
戻り値:
Svg: SVG 画像オブジェクト(Jupyter Notebook では自動的に画像表示)
使用例:
from rsshogi.core import Board, Move
board = Board()
move = Move.from_usi("7g7f")
board.apply_move(move)
svg = board.to_svg(last_move=move)
使用例
基本的な対局の流れ
import rsshogi
# 平手初期局面
board = rsshogi.core.Board()
# 指し手を適用
board.apply_usi("7g7f")
board.apply_usi("3c3d")
board.apply_usi("2g2f")
# 局面情報を表示
print(f"手番: {board.turn}")
print(f"手数: {board.game_ply}")
print(f"SFEN: {board.to_sfen()}")
# 王手判定
if board.is_in_check():
print("王手!")
# 合法手を列挙
print("合法手:")
for move in board.legal_moves():
print(f" {move.to_usi()}")
SFEN から局面を読み込む
import rsshogi
# 特定の局面を SFEN で設定
sfen = "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1"
board = rsshogi.core.Board(sfen=sfen)
print(board.to_sfen())
指し手の履歴を管理(アプリ側で保持)
import rsshogi
board = rsshogi.core.Board()
# 複数手指す(履歴は自分で保持)
history = []
moves = ["7g7f", "3c3d", "2g2f", "4c4d"]
for usi in moves:
mv = rsshogi.core.Move.from_usi(usi)
board.apply_move(mv)
history.append(mv)
# 履歴を表示
print("指し手履歴:")
for move in history:
print(f" {move.to_usi()}")
# 2手戻す
for _ in range(2):
last_move = board.last_move()
if last_move:
board.undo_move32(last_move)
print(f"\n2手戻した後の手数: {board.game_ply}")
ゲーム終了判定
import rsshogi
board = rsshogi.core.Board()
# 対局を進める(実際には多くの手が必要)
while True:
moves = board.legal_moves()
if not moves:
break
# 最初の合法手を選択(実際にはもっと賢い選択が必要)
board.apply_move(moves[0])
if board.game_ply > 100: # 無限ループ防止
break
if board.repetition_state().to_usi() != "rep_none":
break
# 終局状態を判定
if board.is_mated():
print("詰み")
elif board.is_repetition():
state = board.repetition_state()
print(f"千日手: {state.to_usi()}")
PositionState
rsshogi.core.PositionState(sfen=None)
Board.to_position_state() が返す raw-state オブジェクトです。盤面 81 マス、持ち駒、手番、手数を
構造化して保持します。
piece_on(square)/set_piece(square, piece)で盤上駒を編集hand(color)/set_hand(color, hand)で持ち駒を編集side_to_move,plyを直接変更to_sfen(include_ply=True)で SFEN へ戻すvalidate()/is_valid()/validate_all()で検証
board プロパティは 81 要素の list[Piece]、hands プロパティは
(black_hand, white_hand) の tuple[Hand, Hand] を返します。
ValidationReport
rsshogi.core.ValidationReport
validate_all() の戻り値です。
is_valid()で問題がないか確認issuesプロパティでValidationIssueの一覧を取得
ValidationIssue
rsshogi.core.ValidationIssue
個別の validation 問題です。主なプロパティ:
kind:NO_KING,TWO_KINGS,DOUBLE_PAWN,INVALID_HAND_COUNT,INVALID_PLACEMENTcolor: 色に紐づく問題ならColorfile_usi: 二歩なら"1".."9"square: 配置違反なら対象マスpiece_type: 配置違反や持ち駒上限違反の対象駒種count: 持ち駒上限違反時の枚数message: 人間向けメッセージ