最近、やねうら王プロジェクトでは大規模定跡を掘っているせいで、「この局面についてはどうですか?」などと局面を送り合うことが増えた。局面をこうしてやりとりする方法として、CSAファイル形式やKIFファイル形式などがあるが、SNSに貼り付けるには、やや冗長である。
局面自体は、SFEN文字列形式(sfenという文字で始まる)もあるが、これは棋譜ではないので、そこまでの手順がわからない。定跡の内容を確認するには、そこまでの手順も欲しい。
また、将棋所にはいま開いている分岐棋譜の、ある変化だけを書き出す機能がないので、そういう書き出しかたをしようと思うと要らない枝(変化)を削除していかなければならないのだが、数が多いと大変である。
そこで、今回は、これらの問題を解決し、棋譜を手軽にSNSで送り合う方法について説明する。
まず、試しに下記のテキストをコピーして、将棋所やShogiGUI、ShogiHomeなどに(Ctrl+Vで)貼り付けてみて欲しい。
1 |
startpos moves 2g2f 3c3d |
平手の初期局面から26歩、34歩とした局面になったであろうか。
startposの手前にpositionという文字が書いてあっても同様の結果となる。
1 |
position startpos moves 2g2f 3c3d |
この記法が棋譜を表現していることは、これでわかったと思う。
では、この記法は何なのかということなのだが、思考エンジンとGUI側(将棋所、ShogiGUI、ShogiHomeのこと)とは、USIプロトコルというプロトコル(≒取り決め)でやりとりしている。USIプロトコルについて詳しく知りたい方は、ググっていただくとして、そのなかで局面は positionコマンドで送ることと定められている。
positionコマンドは上記のように、行の先頭がpositionで始まる。startposは初期局面を意味する。movesはそのあとに指し手が来ることを意味する。2g2fは27の歩を26に移動させるという意味である。段はチェスに倣い1~9段に相当するのがabcdefghiとなっている。
また駒打ちは、33歩なら、P*3c のように書く。p(pawn = 歩) 駒を成るときは、3d3c+のように指し手文字列の末尾に + を書く。
以上でUSIプロトコルにおけるposition文字列の書き方はすべてである。
次に、このposition文字列をどうやって得るかという話になる。
GUIを用いて思考エンジンを用いて検討を行うときには、GUIは、その局面までの棋譜を思考エンジンに渡す必要がある。なぜ局面そのものを渡さないかと言うと、棋譜を渡さないと千日手の判定が正しく行えないからである。
なので、検討を開始した瞬間にその局面までの棋譜を思考エンジンに送信する必要がある。その送信はUSIプロトコルに基づいて行われ、上記のpositionコマンドで送信される。
つまり、思考エンジンとのやりとりを観察する機能があれば、検討モードにして、positionコマンドの行をコピーすれば、そこまでの棋譜が得られるというわけである。
「思考エンジンとのやりとり」は、例えば将棋所であれば、メニューの「表示」⇨ 「デバッグウィンドウ」から確認できる。(次図)

このpositionコマンドの行をマウスで範囲選択してコピーして、SNSに貼り付ければ良いということである。(上で確認したようにpositionという文字列はあってもなくても良い。)
ShogiHomeならメニューから「表示」⇨ 「監視ウィンドウ」⇨「プロンプトを開く」である。
ShogiGUIには、この機能はないが、メニューから「編集」⇨ 「棋譜コピー」⇨ 「USI」を選択すると、クリップボードに「position startpos moves 2g2f 3c3d」のような文字列がコピーされるので、SNSにそれを貼り付ければ良い。
なお、そのように直接USIプロトコルの形式で棋譜をコピーする機能は、ShogiGUI以外にも搭載されており、それぞれ
・将棋所では、「編集」⇨ 「棋譜形式指定コピー」⇨ 「SFEN形式」
・ShogiHomeでは、メニューから「編集」⇨ 「棋譜コピー」⇨ 「USI形式(現在の指し手まで)」
で行うことができる。
// 将棋所は「SFEN形式」という表示になっているが、これは厳密にはSFEN形式(sfenという文字列で始まる形式)ではないので、少し紛らわしい気はする。
さて、このようにして、USIプロトコルのposition文字列形式の棋譜を得るところまではできるようになった。
この技は将棋所で、余計な分岐を消して現在の指し手までの棋譜を作り直したい時などにも使える。(上の手順で欲しい変化をコピーして、それを将棋所自身にCtrl+Vで貼り付けると新規棋譜が作成され、その局面までの棋譜を貼り付けたことになる。)
次に、これをSNSに貼り付ける場合についてだが、特にDiscordに貼り付ける場合、Discordでは、*(アスタリスク)で囲まれた部分が強調文字として扱われる。
上で見たように駒打ちに * を用いるので、棋譜のなかに駒打ちが2回出現すると、その間が強調文字となり、* は見えなくなってしまうのだ。
これだと相手はその棋譜をコピペできなくなってしまう。
そこで、Discordに貼り付けるときは、この棋譜テキストの両端を ` (バッククォート。日本語キーボードならShift + @ で出せる)で囲むのである。そうすると引用扱いになり、*で囲まれた部分が強調文字になることを回避できる。
ということで、棋譜の受け渡しには、以上のようにして棋譜を貼り付けるテクニックを活用していただきたい次第である。