USIプロトコル(Universal Shogi Interface)は、将棋のGUIソフトと思考エンジンが標準入出力を通じてやり取りするための共通の通信仕様です。この仕様に従っていれば、将棋所やShogiGUIといったGUIから、やねうら王などのエンジンを差し替えて動かせます。ここでは、USIの成り立ちと通信の流れ、usi・position・go・bestmoveといった主要コマンド、局面を表すSFENと指し手の書き方、そしてエンジン登録でつまずきやすい初期化エラーの対処までを、実装者の視点で一気に整理します。
まとめ:USIプロトコルの要点
- 役割:GUI(画面)と思考エンジン(AI)を分離し、標準入出力のテキストで会話させる。エンジンとGUIを自由に組み合わせられる。
- 出自:チェスのUCIを将棋向けに移植した仕様。2007年にTord Romstad氏が初版ドラフトを公開し、将棋所の採用で事実上の標準になった。
- 基本の流れ:
usi→usiok→isready→readyok→usinewgame→position→go→bestmove。 - 局面と手:局面はSFEN(またはstartpos)、指し手は
7g7fのような座標表記。駒打ちはP*5e、成りは末尾に+。 - つまずきどころ:エンジンの初期化エラーは、実行ファイルのパス・評価関数ファイルの配置・
usiok/readyokの返し忘れが主因。
USIプロトコルの定義と役割
将棋ソフトは「盤面を表示し操作を受け付けるGUI」と「次の一手を計算する思考エンジン」に分けて作られることが多く、その2つをつなぐのがUSIプロトコルです。GUIはエンジンをサブプロセスとして起動し、局面や指示を標準入力(stdin)へ書き込みます。エンジンは思考結果を標準出力(stdout)へ返します。通信はすべて7ビットASCIIのテキスト行で、コマンド名も英語です。画像やバイナリを使わないため、実装や動作確認が容易という設計思想になっています。
USIの読み方・名称の由来
USIは「ユーエスアイ」と読み、Universal Shogi Interface(統一将棋インターフェース)の略です。ルーツはコンピュータチェスで広く使われるUCI(Universal Chess Interface)で、これを将棋のルール(持ち駒・成り・9×9盤)に合わせて拡張したものがUSIです。設計者はチェスエンジンGlaurungの作者Tord Romstad氏で、初版ドラフトは2007年1月に公開されました。UCIを知っていればコマンド体系はほぼそのまま理解できます。
USI・UCI・CSAプロトコルの違い
将棋のプログラム間通信にはUSIのほかにCSAプロトコルがあります。役割が異なるので混同しないでください。
| 仕様 | 主な用途 | 通信相手 | 経路 |
|---|---|---|---|
| USI | GUIとエンジンの連携 | GUI ⇔ 思考エンジン | 標準入出力(ローカル) |
| UCI | チェスのGUIとエンジン連携 | GUI ⇔ チェスエンジン | 標準入出力(ローカル) |
| CSA | ネット対局・対局サーバ連携 | エンジン ⇔ 対局サーバ | TCP/IP(ネットワーク) |
手元でGUIにエンジンを登録して指させたいならUSI、floodgateのような対局サーバで自動対戦させたいならCSAプロトコル、と用途で使い分けます。多くのエンジンは両対応です。
USIプロトコルの通信の仕組み
通信は「初期化」「対局」「終了」の3段階で進みます。GUIが送るコマンドにエンジンが応答を返す、1行1コマンドの往復です。典型的な1局のやり取りは次のようになります。
GUI > usi (USIモードで話すと宣言)
Eng < id name MyEngine
Eng < id author yourname
Eng < option name USI_Hash type spin default 256
Eng < usiok (初期化情報の提示完了)
GUI > isready (準備できたか確認)
Eng < readyok (準備完了)
GUI > usinewgame (対局開始)
GUI > position startpos moves 7g7f 3c3d
GUI > go btime 300000 wtime 300000 byoyomi 10000
Eng < info depth 12 score cp 45 pv 2g2f 8c8d
Eng < bestmove 2g2f ponder 8c8d
GUI > gameover win
GUI > quit (エンジン終了)
ポイントは、GUIはusiokとreadyokを待ってから次に進むことです。エンジン側がこれらを返さないと、GUIは初期化が終わっていないと判断して待ち続け、後述の初期化エラーになります。goを受けたエンジンは思考中にinfo行で読み筋や評価値を随時報告し、決着したらbestmoveで最善手を1つ返します。
主要なUSIコマンド一覧
コマンドは「GUI→エンジン」と「エンジン→GUI」の2方向に分かれます。まず押さえるべきものを挙げます。
GUIからエンジンへ送るコマンド
| コマンド | 意味 |
|---|---|
| usi | USIモードで動くよう指示。エンジンはid/optionを返しusiokで締める |
| setoption name X value Y | オプション(ハッシュ量・スレッド数など)を設定 |
| isready | 思考準備の完了確認。評価関数の読み込みなどはここで行う |
| usinewgame | 新しい対局の開始通知 |
| position … | 思考対象の局面を指定(startpos または sfen + moves) |
| go … | 思考開始。持ち時間や秒読みを引数で渡す |
| stop | 思考を打ち切り、その時点の最善手をbestmoveで返させる |
| ponderhit | 先読み(ponder)した手が実際に指された合図 |
| gameover win/lose/draw | 対局結果の通知 |
| quit | エンジンプロセスを終了 |
エンジンからGUIへ返すコマンド
| コマンド | 意味 |
|---|---|
| id name / id author | エンジン名・作者名の通知 |
| option name … | 設定できるオプションの定義を提示 |
| usiok | usiへの応答完了(初期化情報の提示終了) |
| readyok | isreadyへの応答。思考準備が整った |
| info … | 探索中の深さ・評価値(score cp)・読み筋(pv)などの報告 |
| bestmove … | 最善手の通知。投了は bestmove resign、勝ち宣言は bestmove win |
goの引数では、切れ負けならbtime/wtime(先後の残り時間・ミリ秒)、秒読みならbyoyomi、フィッシャールールならbinc/wincを渡します。思考時間の管理はエンジンがこれらを読んで自分で判断します。
局面と指し手の表記:SFENと座標表記
USIでは局面をSFEN、指し手を座標表記で表します。この2つが読めればpositionコマンドの中身を理解できます。
SFEN形式(局面の表記)
SFEN(Shogi Forsyth-Edwards Notation)は、チェスのFENを将棋向けに拡張した局面表記です。「盤面/手番/持ち駒/手数」を半角スペース区切りで並べます。盤面は上の段から順に、段の区切りをスラッシュで表します。平手の初期局面は次のとおりです。
lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1
駒はP L N S G B R K(歩・香・桂・銀・金・角・飛・玉)で表し、大文字が先手・小文字が後手です。空マスは連続する数字、成り駒は文字の前に+を付けます(例:+Pはと金)。手番は先手がb(black)、後手がw(white)、持ち駒が無ければ-です。なお初期局面に限り、SFEN文字列の代わりにstartposという短縮表記が使えます。
指し手の表記(7g7f・駒打ち・成り)
指し手は「移動元マス+移動先マス」の座標で書きます。筋は数字の1〜9、段はアルファベットのa〜iを使います。たとえば先手の初手☗7六歩は7g7f(7七の駒を7六へ)です。特殊な指し手は次のように区別します。
| 種類 | 表記例 | 意味 |
|---|---|---|
| 通常の移動 | 7g7f | 7七から7六へ |
| 成り | 8h2b+ | 移動先の末尾に + を付ける |
| 駒打ち | P*5e | 打つ駒+アスタリスク+打つマス |
持ち駒を打つときは駒種を大文字で書き、間に*を挟みます。移動後に成る場合だけ末尾へ+を付け、成らない場合は何も付けません。この座標表記はエンジンからのbestmoveでもそのまま使われます。
USI対応エンジンをGUIに登録する手順と初期化エラーの対処
実際にエンジンを動かすには、将棋所やShogiGUIといったGUIにエンジンの実行ファイルを登録します。手順自体は数分ですが、ここで「初期化エラー」につまずくケースが多いので、原因と対処をまとめます。
将棋所・ShogiGUIへのエンジン登録手順
基本の流れはどちらのGUIでもほぼ共通です。
- エンジン一式(実行ファイルと評価関数フォルダ)を任意の場所に展開する。
- GUIの「エンジン管理」から実行ファイル(
.exe)を追加する。 - GUIがエンジンへ
usiを送り、返ってきたエンジン名とオプションが登録される。 - 対局ダイアログでそのエンジンを選び、持ち時間を設定して対局を開始する。
「初期化エラー」でつまずく主な原因と対処
登録時に「エンジンの初期化に失敗しました」と出る場合、GUIがusiokやreadyokを受け取れていないのが本質です。実務で遭遇しやすい順に切り分けます。
- 評価関数ファイルの場所が違う:多くのエンジンは実行ファイルと同じ階層の特定フォルダから評価関数を読み込みます。配置がずれると
isready後に固まり初期化エラーになる。同梱READMEの指定パスに戻すのが最優先。 - CPUの対応命令セット違い:AVX2版などをそれに対応しないCPUで動かすと即クラッシュする。自分のCPUに合ったビルド(SSE4.2版など)を選ぶ。
- 実行ファイルのパスに問題:フォルダを移動した/日本語や空白を含むパスで不具合が出る場合がある。パスを再登録する。
- 自作エンジンで
usiok/readyokを返していない:自分で実装中なら、usiに対して必ずusiok、isreadyに対して必ずreadyokを出力しているか、標準出力を都度フラッシュしているかを確認する。ここが抜けるとGUIは応答待ちのまま初期化エラーと判定する。
USIプロトコルを実装するときの勘所
USI対応の思考エンジンを自作する場合、仕様書の丸暗記より「どこで詰まりやすいか」を先に知っておくほうが早く動きます。実装者の視点で重要な点を挙げます。
- まず最小構成で通す:
usi/isready/usinewgame/position/go/quitに応答し、goには合法手を1つbestmoveで返すだけで、GUIとの往復は成立します。強さより先に「対局が回る」状態を作るのが近道です。 - 出力は必ずフラッシュする:標準出力がバッファされたままだとGUIに届かず、応答なしと誤判定されます。1行出すたびにフラッシュするのが鉄則です。
stopへの即応が実戦で効く:秒読みや切れ負けではGUIからstopが飛びます。探索を別スレッドに置き、stop受信で速やかにbestmoveを返せる構造にしておかないと時間切れ負けを起こします。読み筋の計算そのものは、盤面を評価するヒューリスティックな指標と、ゲーム木を先読みする探索アルゴリズムの組み合わせで、エンジンごとに設計されます。こうした探索アルゴリズムの基礎や、探索木の展開を支えるスタックとキューの使い分けが土台になります。- USI 2.0という拡張案がある:やねうら王の作者が公開したUSI 2.0は、詰み探索や引き分け条件などを整理した拡張仕様です。ただしGUI側の対応状況はまちまちなので、まずは標準のUSIで確実に動かし、必要になってから拡張へ進むのが安全です。
よくある質問
USIとは何の略ですか?
Universal Shogi Interface(統一将棋インターフェース)の略で、「ユーエスアイ」と読みます。将棋のGUIと思考エンジンを標準入出力でつなぐための通信仕様を指します。チェスのUCIを将棋向けに拡張したものです。
SFENとは何ですか?
Shogi Forsyth-Edwards Notationの略で、将棋の局面(盤面・手番・持ち駒・手数)を1行の文字列で表す記法です。USIのpositionコマンドで思考対象の局面を渡すときに使います。初期局面だけはstartposで代用できます。
7g7fのような表記は何を意味しますか?
指し手の座標表記で、「移動元のマス+移動先のマス」を表します。筋を数字1〜9、段をa〜iで書き、7g7fは7七の駒を7六へ動かす手(先手の初手☗7六歩)です。駒を打つ場合はP*5e、成る場合は末尾に+を付けます。
USIとUCIはどう違いますか?
UCIはチェス用、USIはそれを将棋のルール(持ち駒・成り・9×9盤)に合わせて拡張したものです。コマンド体系は共通点が多い一方、局面表記はチェスがFEN、将棋がSFENと異なります。持ち駒を打つ指し手など将棋固有の概念はUSIで追加されています。
エンジンの初期化エラーはどう直しますか?
まず評価関数フォルダが実行ファイルの正しい階層にあるかを確認します。次にCPUの対応命令セットに合ったビルドを選び直します。自作エンジンならusiにusiok、isreadyにreadyokを返し、標準出力をフラッシュしているかを点検してください。