Move クラス
rsshogi.core.Move(value)
将棋の指し手を表す、内部エンコーディングが 16bit の型です。 移動元・移動先、成り、駒打ちを表します。
概要
Move クラスは以下の機能を提供します:
- USI 形式の文字列への変換・からの生成
AperyMoveとの相互変換- 駒打ち、成りなどの判定
- KI2 形式への変換(
Boardを渡す必要あり) - 16bit の内部エンコーディング
用途: 通常は Move を使用してください。大量の棋譜データや探索木でもそのまま使えます。
Move32 は CSA 変換や駒情報の直接取得が必要な場合に使用します。
基本的な使い方
from rsshogi.core import Board, Move
# USI 文字列から生成
move = Move.from_usi("7g7f")
print(move.to_usi()) # => "7g7f"
# Board で使用
board = Board()
board.apply_move(move) # Move で指せる
クラスメソッド
from_usi(usi)
Move.from_usi(usi: str) -> Move
USI 文字列から Move インスタンスを生成します。
通常手に加えて 0000(null move)を受け付けます。
resign、win、none を含む特殊手は rsshogi.usi.move_from_usi() を使います。
引数:
- usi:
str- USI 形式の指し手文字列(例:"7g7f","P*5e")
戻り値:
Move: 生成された Move インスタンス
例外:
ValueError: USI 文字列のパースに失敗した場合
使用例:
from rsshogi.core import Move
move = Move.from_usi("7g7f")
print(move.to_usi()) # => "7g7f"
# 駒打ち
drop_move = Move.from_usi("P*5e")
print(drop_move.is_drop()) # => True
インスタンスメソッド
文字列変換
to_usi()
mv.to_usi() -> str
Move を USI 形式の文字列に変換します。
戻り値:
str: USI 形式の指し手文字列
to_ki2(board)
mv.to_ki2(board: Board) -> str | None
Move を現在局面に基づいて補完し、KI2 形式の文字列に変換します。
KI2 の左右・直・寄・引・上などの表記判定には局面情報が必要なため、board を渡します。
戻り値:
str | None: KI2 形式の指し手。変換できない場合はNone
from rsshogi.core import Board, Move
board = Board()
move = Move.from_usi("7g7f")
print(move.to_ki2(board)) # => "▲7六歩"
to_apery()
mv.to_apery() -> AperyMove
cshogi / Apery 互換の 16bit 指し手へ変換します。
from rsshogi.core import Move
mv = Move.from_usi("7g7f")
amv = mv.to_apery()
print(int(amv))
print(amv.to_move().to_usi())
特殊手定数(クラス属性)
Move.MOVE_NONEMove.MOVE_NULLMove.MOVE_RESIGNMove.MOVE_WINMove.MOVE_END
from rsshogi.core import Move
assert Move.MOVE_NONE.to_usi() == "none"
assert Move.MOVE_RESIGN.to_usi() == "resign"
指し手の判定
is_drop()
mv.is_drop() -> bool
この指し手が駒打ちかどうかを判定します。
戻り値:
bool: 駒打ちの場合True
is_promotion()
mv.is_promotion() -> bool
この指し手が成りかどうかを判定します。
戻り値:
bool: 成りの場合True
is_normal()
mv.is_normal() -> bool
この指し手が通常の指し手(特殊手定数ではない)かどうかを判定します。
戻り値:
bool: 有効な手の場合True
移動情報の取得
from_sq / to_sq
mv.from_sq -> Square
mv.to_sq -> Square
移動元・移動先のマスを取得します。
dropped_piece_type
mv.dropped_piece_type -> PieceType | None
駒打ちの場合、打った駒種を返します。駒打ちでない場合は None。
move_type
mv.move_type -> MoveType
指し手の種類を取得します。
戻り値:
MoveType:MoveType.NORMAL、MoveType.PROMOTION、MoveType.DROPのいずれか
特殊メソッド
int(mv)→ 内部値(16bit 整数)を返すstr(mv)→ USI 形式の文字列を返す(to_usi()と同値)
プロパティ
value
mv.value -> int
Move の内部表現(16bit 整数)にアクセスします。
使用例
Board と組み合わせる
import rsshogi
board = rsshogi.core.Board()
# Move で指す
move = rsshogi.core.Move.from_usi("7g7f")
board.apply_move(move)
print(board.to_sfen())
指し手列を保持する
Move は駒情報を持たないため、USI 形式の手順や通常の盤面操作に適します。
Python オブジェクトとしての実際のメモリ使用量は、16bit という内部エンコーディングだけでは決まりません。
from rsshogi.core import Move
# 棋譜データなど大量の指し手を扱う場合
game_moves = [
Move.from_usi("7g7f"),
Move.from_usi("3c3d"),
Move.from_usi("2g2f"),
# ... 数百手
]
print(f"保存した指し手数: {len(game_moves)}")
内部値による再構築
from rsshogi.core import Move
move = Move.from_usi("7g7f")
# 内部値を取得
internal_value = int(move)
# 内部値から再構築
reconstructed = Move(internal_value)
print(reconstructed.to_usi()) # => "7g7f"
Move と Move32 の比較
| 特性 | Move (16bit) | Move32 (32bit) |
|---|---|---|
| 内部エンコーディング | 16bit | 32bit |
| 移動元・移動先 | ✓ | ✓ |
| 成り / 駒打ちフラグ | ✓ | ✓ |
| 移動後の駒情報 | × | ✓ |
| USI 変換 | ✓ | ✓ |
| CSA 変換 | × | ✓ |
| KI2 変換 | ✓(board 必要) | ✓(board 必要) |
| 保持する駒情報 | なし | 移動後の駒を保持 |
駒情報を使う操作
Move は移動元、移動先、成り、駒打ちを 16 bit で保持します。
CSA 変換や駒種の参照には、移動後の駒情報を持つ Move32 を使います。
to_ki2(board) は Board から駒情報を取得するため、Move からも KI2 文字列を生成できます。
使い分け
Move を推奨する場合:
- 一般的な用途(
Board.legal_moves()の戻り値) - USI 形式のみで十分
- 大量の棋譜データや探索木で指し手を保存
Move32 を検討する場合:
- CSA 形式への変換が必要
- 駒情報を直接取得したい
型に対応するメソッド
Board.apply_move() は Move を、Board.apply_move32() は Move32 を受け付けます。
import rsshogi
board = rsshogi.core.Board()
# Move は apply_move で適用する
mv = rsshogi.core.Move.from_usi("7g7f")
board.apply_move(mv) # OK
# Move32 は apply_move32 で適用する
move32 = board.legal_moves_move32()[0]
board.apply_move32(move32) # OK
他エンジンとの命名対応
rsshogi では 16bit 指し手を 基本型 として Move と命名しています。
やねうら王と cshogi では 16bit 型を Move16、32bit 型を Move と呼びます。
ただし、rsshogi の Move と cshogi の Move16 はビットレイアウトが異なります。
| エンジン/ライブラリ | 16bit 型 | 32bit 型 |
|---|---|---|
| rsshogi | Move | Move32 |
| やねうら王 | Move16 | Move |
| cshogi (Apery 系) | Move16 | Move |
- rsshogi の
Moveはやねうら王のMove16と同一のビットレイアウトです。 - cshogi の
Move16とはビットレイアウトが異なります(駒打ち判定方法・成りフラグ位置が違う)。 cshogi との間で指し手の整数値を直接比較してはなりません。 rsshogi 側ではMove.to_apery()、Apery 形式側ではAperyMove.to_move()を使って変換します。
技術詳細: ビット構造
Move はやねうら王の Move16 と同じ指し手エンコーディングを採用しています。
bit位置: 15 14 | 13 ... 7 | 6 ... 0
─────────────────────────────
│ P │ D │移動元(7)│移動先(7)│
─────────────────────────────
P: 成りフラグ (bit 15)
D: 駒打ちフラグ (bit 14)
- bit 0-6: 移動先の座標
- bit 7-13: 移動元の座標または打つ駒種
- bit 14: 駒打ちフラグ
- bit 15: 成りフラグ