最初に
最近C言語のゲームの紹介をしておりますので、「C言語の将棋」と言うタイトルで将棋プログラムを作ろうと思ったのですが、久々にボナンザで遊んだら、手も足も出ませんでした。
10年ぐらい前は10回やると1回ぐらいは勝てたのですが、10回ぐらいはやりましたが、1回も勝てませんでした。
ここ10年以上は将棋ソフトで遊んでおりませんので、ボナンザ相手では仕方がないのですが、私は「東大将棋4」(今は東大将棋8が最新かも)と言うソフトも持っておりますので、それなら勝てるだろうとやってみましたが、これにも勝てなくて、20回ぐらいやって、やっと1回勝てましたので、ボケてきたとは言え6級ぐらいのレベルはありそうです。
ちなみに、私は将棋雑誌で段位認定を行って初段の免状を持っております。当時は大山康晴が将棋連盟会長で中原誠が名人でしたので、二人の直筆の名前入りの免状です。2万円ぐらい出して手にいれたのですが、当時は大山康晴が将棋会館を建設するために資金集めに躍起になっており、棋力に関係なく段位の免状を乱発して資金を集めていたようです。
当時は、免状を何だと思っているのだと憤りも感じましたが、今ならただの紙切れ1枚でお金が集まるなら、どんどん発行すれば良いとの大山康晴の考えを理解できます。
政府が発行する勲章もそうですが、そんな物をいくら所持していようが、人間の価値(中身)とは一切関係ありません。 免許証なら法律的な意味合いもありますので価値はあるでしょうが、勲章には金属の価値(純金でも使用しているなら)しかありません。 政府も官僚も日本国民を甘く見過ぎております。(勲章が欲しい馬鹿な日本人も多いですが)
上の画像は、 将棋所 (しょうぎどころ)と言う将棋ソフトを2回目に指した時の画像です。
最初は恐る恐る差したのですが、余りの弱さにあきれて、2回目は完璧な差し回しで最短時間で勝ってやろうとしたのですが、無駄手ばかりで時間が掛かってしまいました。
しかし、こんな酷い局面は、どんなに弱い人と指してもあり得ませんね。(とっくの昔に相手が投了してます)ボナンザのレベルが10とすれば、1にも満たないでしょう。
3度やりたいとは思いませんので、取り敢えずこのソフトにボナンザの思考エンジンを搭載してみましょう。
ボナンザの入手
ボナンザ(Bonanza)は、ヤフーのサイト(http://www.geocities.jp/shogi_depot/)で入手できたのですが、ご存じのようにヤフーは全てのサイトを閉鎖しましたので、入手出来なくなりました。
私のように代替サイト(現在ご覧いただいているレンタルサーバー)を開設すれば良いのですが、作者様はそこまで手を掛けてソフトを公開したいとは思っておられないようです。
従って、現在(2019年12月5日)では(公開時のソフトを全て入手するには) インターネットアーカイブ を利用するぐらいしか手段がないようです。
本体のみでしたら、 窓の杜 からでも可能でしたが、対局画面と指し手の音が(私には)どうしても馴染めず、将棋所でボナンザを指そうと思った次第です。
「将棋所」では、Bonadapter.exe とか言うファイルを使うとボナンザ(Bonanza)と対局できるとの事でしたので、やってみたら確かに対局はできましたが、(強さは文句なしでしたが)ボナンザの指手が異常に遅く、とても対局したい気分には成れず、元に戻しました。
それで「将棋所」の思考エンジン(Lesserkai.exe)に戻して3回目の対局をした時の最終画面(後手の指し手がなく終了)の画像がこれです。
どうやら、私もいじめの要素を持っているようです。 相手の王の涙を感じる盤面ですね。 戦国時代なら「お前には武士の情が無いのか」と言われるでしょう。
ちょっと使い難い部分がありますが、「将棋所」ではなく、指し手が速い「マイボナ」を使う事にしました。相変わらず全く勝てません。
【注記】
「将棋所」でボナンザの指し手が遅かったのは、対局の設定時間に問題があったためで、「持ち時間」を0にして「秒読み」を10秒程度にすれば問題ありませんでした。
その設定でボナンザが弱いと感じる事は(普通の人なら)ありません。ただ、思考エンジン同士の対局だと、10秒では途中で時間切れ負けが発生する場合があるようです。
又、 クジラちゃんの駒箱 と言うサイトで、 Bonanza6.0 USI と言う、ボナンザを USI (Universal Shogi Interface)プロトコルに改造したバイナリィ(ソースも別途供給)を供給されております。
これを使用すれば、「将棋所」でも思考エンジンの登録がそのままで可能です。
話は変わりますが、私のヘボ棋力の参考に「東大将棋4」と対局(2019年12月11日)した時の画像を以下に掲載します。
ほぼ必敗の形勢でしたが、相手玉の周りには守り駒が無く、勝てる可能性もあると思って指したのですが何回やっても負けるので、局面を何度も戻して(つまりは待ったをして)やっと勝てた時の画像です。
この7手前ですが、相手玉が3二に居て、6三の金が5三に居て、3四に歩がある状態でした。私の側は3四の桂が4六に居り、持ち駒が金1、銀3、桂と香と歩が少々ありました。
どうせ負けだろうと思いながらも、相手の5三の金を狙って、5四に香を打ったら6三に逃げて呉れたので、これは手になったと感じたのです。
ここから勝ち方が分からなくて、6二に香を成ったり、3四に桂を跳ねたりしたのですが、相手に4五桂と跳ねられて、(私には)どう対応しても勝てませんでした。
試行錯誤して、相手の桂に跳ねられると駄目だと分かったので、やっと辿りついたのが2一銀の王手の捨て駒でした。 相手玉は取るより無く、同玉に3四桂跳ねが決めてです。
有段者なら一目でしょうが、力が落ちた初段(もどき)には待ったを何度もして勝つのがやっとです。「東大将棋4」にヒントを要求しても、トンチンカンな内容に終始してました。
又話が変わりますが、「将棋所」のショートカットを作成した時に、Windows の標準アイコンになるので、 IconChanger を使用して、それらしいアイコンに変更しました。
こんな事は現代では釈迦に説法で、記載するのも恥ずかしいぐらいですが、100人に一人ぐらいは知らない方もいるのではないかと思って載せました。
EXEファイルからアイコンを抜き出す方法や、bitmapやping ファイルから icon ファイルに変更する方法なども、もはや常識になっているでしょう。
アイコン画像(bitmapをアイコンに変換)はどこかのサイトからのパクリですが、こんな事をやると、又、法律至上主義者の方に怒られるでしょうね。
ShogiGUI
「将棋所」は古くから存在している将棋ソフトなので知名度も高く、多くの方が使用されております。
その他にも同様な新興のソフトも公開されており、 ShogiGUI もその中の一つです。
盤面の構成は「将棋所」と似通っておりますので、特徴を気付き難いのですが、将棋盤のサイズを変更できる点が非常に良いと思いました。(「将棋所」ではできないと思います)
私は1600×1400の解像度で使用しているディスプレイも所有しているのですが、そのディスプレイで形勢判断表示を小さ目にして、将棋盤を大きく表示すると将棋に集中できます。
しいて、このソフトの欠点を挙げるなら、OS が32bitでは動作しない点ですが、本格的に将棋で遊ぶなら32bitのOSは無理がありますので、それが問題にはなりません。
当然ながら、USI (Universal Shogi Interface)プロトコルを採用しており、今後のメインの GUI ソフトになる可能性も十分にあります。
このソフトを使って将棋盤を大きく表示した時の画像を以下に示します。
実際は、ここまで将棋盤を大きく表示する必要性は感じませんが、将棋盤が小さいと感じる方には有益な機能だと思います。(将棋盤は任意の大きさに設定できます)
Bonanza Classic
ボナンザ(Bonanza)を調べていたら、(株)マグノリアが2006年頃に提供していた Bonanza Classic というフリーソフトがあるのを知りました。
以下の画像が対局開始直後の駒組みをしている画像です。フリーソフトとは言っても画像が美しく、ボナンザ(Bonanza)の強さは2006年時点のレベルですが、それでもアマ3段以上の棋力がないと勝てません。
私は当時に初めてボナンザ(Bonanza)と対局を始めたのですが、当時でも20、30回に1回勝てれば良い方で、今やってみたら全く勝てませんでした。兎に角、私のレベルでは隙を見つける事が出来ないのに対して、ボナンザ(Bonanza)は的確に私の弱点を突いてきます。
形勢判断の画面などは一切出ませんが、純粋に将棋ソフトと対峙するには、このようなソフトで十分ではないでしょうか。
隙のない構えで、平然と穴熊に囲われると、もうどうしようも無いです。
残念ながら、このソフトは64bitのOSにはインストールを拒否されてしまうようです。
細かくは調べておりませんが、32bit のOSで作成したフォルダをそのまま 64bit のOSにコピーすれば動作するようです。
それにしても、このソフトの「対局時読み上げ」をオンにすると、発声音のひどさに体に蕁麻疹(じんましん)が出そうです。 すぐにオフにしました。
その点は、「東大将棋4」の棋譜読み上げは素晴らしいです。
K-Shogi
K-Shogi というフリーソフトもあります。
最近の将棋のフリーソフトは同じ素材を使っているのか外観がほとんど同じです。形勢判断が出る点も同じでした。操作性も問題なしです。
初期設定は一番弱い設定になっているのに気がつかなくて、弱過ぎて使えないと思っていたら、最高レベル(Lv40)のコンピュータの強さはアマ五段と書いてある通り、私の棋力では歯が立ちませんでした。
強い将棋は似たような思考エンジンを搭載しているようで、指し手がボナンザと変わりません。多分、私は定跡の範囲内から抜け出せないのだと思います。
32bit版と64bit版の2つが同梱されています。
ボナンザをコンパイル
ボナンザ(Bonanza)と将棋を指すだけなら既存のソフトが沢山ありますし、将棋のレベルもアマチュアにはほとんど勝てないレベルですから、強さに不満を感じる人は居ないと思います。
それどころか、強すぎて将棋ソフトが売れないので、新規に開発はしないと(株)マグノリアでは宣言しているほどです。(値段の設定が高すぎて売れないからでしょう)
折角、ボナンザ(Bonanza)はソースを公開していただいておりますので、Bonanza 6.0 を VS2005 でコンパイルしてみました。ソースはC言語で記載されておりますが、エラーもワーニングも全く発生せずコンパイルできました。
ただ、ソースコードのエラー修正 (Sept 10 2015)を当てると、エラー(何とかは何とかのメンバーでないとか)が発生しましたので、当面はエラー修正なしで動作させております。
ボナンザ(Bonanza)自体は思考エンジンですので、そのままでは対局が出来ませんので、対局できるソフトを探したところ らの部屋 の「だうんろーど2005」にある「隠岐105」、「隠岐108」」、「隠岐109」がボナンザの起動が可能でした。
注意点は、Sikou.dll を選ぶ点で、2008/10/11 15:05 98KB でないと動きませんでした。逆に、この Sikou.dll は、CSA将棋ではエラーが出て動きません。
Sikou.dll については研究したいと思っているのですが、調べてみるとボナンザ(Bonanza)の作者様がソースを提供してくださっているようです。
そのソースを基に、VS2005のプロジェクト SikouDLL.zip に変換したものを置いておきます。 あくまで骨格(スケルトン)であり、サンプルではありません。
それと、中身は(時間が無い事もあって)全く調べておりませんので、これで正しいのかも含めて一切の保証は出来ません。
以下が「隠岐105」で対局している時の画像です。
駒組みの段階ですが、穴熊にがっちりと組まれており、その内に大駒を平然と切られて陣形を乱され、あっけなく負けてしまいます。
負けるのはヘボだからしょうがないですが、自分でコンパイルしたボナンザを相手にするのは、何となく愛着が沸いてきて楽しいです。
このソフトは駒が「しょぼい」とか言われておりますが、駒音が無く、駒盤に相手がどこに指したのか表示されないので、実戦的で新鮮味を感じます。
このソフトは癖があって、メニューのDLL内にBonanzaが存在していないと動作しないのですが、そのBonanzaがあるフォルダの指定が固定化され変更が出来ません。
恐らく、ボナンザを最初に起動した時にでも、Bonanza.EXEのパスをレジストリかどこかに書き込んでいると思うのですが、その場所が(現在の時点では)分かりません。
仕方がありませんので、当面は記載されているパスの場所にBonanza.EXEを置いています。将棋ソフトを自分で作りたい人でも無ければ、使用するメリットはないと思います。
このソフトの作者様は、「隠岐105」のソースは公開されておりませんが、「隠岐1.01」はソースを公開されておりますので、VS2005のプロジェクトファイル OKISRCKihon.zip をダウンロードできるようにしました。
私のソフトは駒の画像だけオリジナルな物に変更しております。(後日、将棋盤の画像も、他所様のをパクリました)
これを使ってボナンザ(Bonanza)を相手にしたソフトを作るつもりですが、現在(2019年12月30日)は解析途中の段階です。(CSAの棋譜の読み込みと対局はします)
ボナンザ(Bonanza)のVS2005のプロジェクトファイルも載せようかと思いましたが、「空のプロジェクト」にボナンザのソースをコピーするだけですので、それぐらいは自分でやってください。ボナンザの作者様の苦労を考えれば、その程度は屁みたいなものでしょう。
ボナンザと通信
ボナンザ(Bonanza)とやりとりをするのはどうしたら良いのかと調べておりましたら、 YSSと彩のページ 様のサイトが見つかりました。
そのページの下の方に「 Bonanza とパイプ経由で対戦するためのサンプル」という C++6 で記載されたプログラムがありました。
2009/05/14 に作成された10年以上前のプログラムですが、私のレベルには合っております。
それを VS2005 対応にして(ワーニングが6個出るぐらいで簡単です)、 Bonanza のインストールされているパスの部分を変更して動作させたのが以下の画像です。
念のために、VS2005のプロジェクトファイル bonapipe.zip も置いておきますが、著作者のYSSと彩のページ様のサイトからダウンロードして VS2005 のプロジェクトへ変更するのが基本であり礼儀です。(作者様から著作権侵害のクレームがあった場合は削除致します)
このプログラムは 人間側の指し手も記載されております。
そのため、GUI は必要ありませんのでコマンドラインで動作します。
人間側の指し手は、人間が先手なら1手目は▲76歩と指します。
人間側が後手なら1手目は△84歩を指します。
人間側が先手なら2手目は▲58王と指します。
人間側が後手なら2手目は△32金と指します。
3手目は人間側が先手でも後手でも投了します。
人間側の先手、後手は tesuu の設定値で決まります。
初期値は tesuu=0 で、人間側の先手です。
動作は単純明快で、(GUIへの変換が出来れば)直ぐに応用出来ます。
ボナンザ(Bonanza)に初期設定画面を教えて、指定されたコマンドを送るだけでお互いの通信が出来ます。
ここまで教えていただければ、前述した「隠岐1.01」を使って、ボナンザ(Bonanza)と対局するプログラムを作成するのも難しい事ではないでしょう。
勿論、あっという間に作成するのは私には無理ですが、時間を掛ければ出来るような気はします。プログラムの世間的な価値はありませんが、自己満足ができれば良いのです。
少なくとも、ボケ防止には多少は効果があるのではないでしょうか。
将棋道場
将棋のプログラムを作成する場合に、参考になるソフトがないか探しておりましたら、 将棋道場 と言うソフトを提供しているサイトが見つかりました。
そのソフトのサイトによる解説は以下の通りです。
「将棋道場」は、対局棋譜、詰将棋、定跡を管理する将棋データベース機能を中心に、詰思考等、将棋の研究に必要な統合環境を提供します。
定跡書や実戦譜、詰将棋をコンピュータで管理・研究したい方に最適なソフトウェアです。
また将棋道場は、無料で制限なく使用できるフリーソフトウェアです。
主な特徴・機能は以下のとおりです。
◇対局棋譜と詰将棋という2種類のデータタイプに分類
◇データベースによる棋譜・詰将棋・定跡管理
◇対局者や戦型、棋戦名、指定局面(部分指定可能)等、さまざまな条件を指定してのデータベース検索
◇検索条件を複数保存可能
◇棋譜の鑑賞 ・棋譜の作成や編集
◇KIF形式などの棋譜ファイルからの入力、CSA形式ファイル出力
◇定跡の作成と編集、ファイルからの登録
◇棋譜や局面の印刷
◇詰将棋の解図(双玉対応なので実戦局面解析可能)
(1)対局棋譜と詰将棋は文書と同じように扱い、ファイルやデータベースに格納したり、印刷したりすることができます。
棋譜は電子将棋盤にならべて鑑賞したり、駒を操作して編集したり、棋譜自体を定跡として登録したりすることができます。
(2)データベースの棋譜検索としては、標準的なSQL(Structured Query Language) 文を使用して、対局者等様々な条件を設定でき、加えて局面の(一部)指定等の問い合わせも行うことが出来ます。
検索した棋譜はMDI画面により、複数の電子将棋盤に開き、棋譜の鑑賞・編集・研究をすることができます。
将棋盤の局面はいつでも詰みを思考(解図)させることができます。思考結果は多次元の(変化手順の入った)指し手空間で表現され、リスト&ツリー表示する棋譜窓を開いて自在に鑑賞できます。詰みの思考は同時に複数起動したり、データベースに登録された複数の詰将棋を連続して思考させたりすることもできます。
(3)定跡機能としては、電子将棋盤を動かしながらその局面以下の定跡手順をリアルタイムにツリー表示します。局面を動かしながら定跡を研究したり、その場で定跡を編集したり、あるいは対局棋譜から定跡を登録したりすることができます。
ありがたい事に「将棋道場」様では、そのソフトのソースを公開(2003年12月21日)されております。
これだけの機能を持ったソフトのソースを公開していただけるのは、実に「太っ腹」な方達だと感銘を致しました。
ソースはC++6で作成されておりましたので、VS2005 のプロジェクトファイルに変換して、コンパイル後に実行させたのが以下の画像です。
私が作成する程度のプログラムとしては膨大な量のソースで、C++6 から VS2005 に変換する際も仕様の違いにより多くのエラーとワーニングが発生しました。
私のレベルでは解決できないエラーもあって、コメントアウトした部分もあります。
取り敢えずコンパイルがやっと出来た段階ですが、例によって VS2005 のプロジェクトファイル WinSDJ.zip を置いておきます。
不具合があっても、このソフトにはもう手を入れないと思います。(ソースの参考とさせていただいておりますので)
ソフトとして御利用になるのであれば、動作が安定している作者様が作成のプログラムを御使用ください。
ボナンザ同士で戦わせてみる
私なんかはボナンザ(Bonanza)と何回戦ってもまず勝てないですが、コンピュータ将棋の選手権ではボナンザは最強ではありません。
今年(2019年)は やねうら王 (やねうら王 with お多福ラボ 2019) と言うソフトが1位でした。コンピュータ将棋は定跡の解析が進み、どのソフトでも序盤はほぼ同一の手を指すようになりました。
それで最近のソフトは、勝てる手を探すよりも入玉狙いで勝ち(入玉して飛角の大駒5点、玉を除くその他の駒を1点で計算し先手なら28点以上あれば勝ち)を狙うソフトが多くなったと言われております。
ボナンザ同士で戦わせてみたら、たまたまかも知れませんが、以下のような相入玉模様になってしまいました。
序盤は見応えがあって、なるほど将棋とはこのように指すものなのかと教えられたのですが、途中から相入玉になって350手以上指し手が進んでも、お互いが「と金造り」に一生懸命でしたので、途中で中止しました。
現在の将棋は無限の局面がありますが、やがては数百万〜数千万以上の局面が解析されて定跡になるでしょうから、コンピュータ将棋の未来はこうなる予感がしております。
プロ棋士は、当分の間はコンピュータ将棋で研究しながら強くなれるでしょうが、最終的には(恐らく数年後には)コンピュータには勝てる人は居なくなるでしょう。
かと言って、プロ棋士同士の対局が相入玉を目指して戦うようになったら、つまらなくて観る人が居なくなりますね。 (相穴熊の対局でも嫌われておりますから)
これが何を意味しているかと言うと、将来将棋の棋士と言う職業は消えてしまうのです。勿論コンピュータ将棋同士の対局もつまらなくなって、消えてしまいます。
それから、現在は女性(女流)棋士は読みの力が男性棋士より劣っているので勝てませんが、暗記する能力なら男よりも女の方が数倍上ですので、将棋が知識の差になれば名人の座も女性棋士になる可能性はあります。
ただ、将棋が知識(定跡)の差になるとは言っても、数百万〜数千万以上の知識を人間が覚えられとは思えませんので、名人の座に女性棋士が就くのには懐疑的です。
それに、将棋が廃れるとしても、ここ10年や20年では廃れる事はないと思います。算盤(そろばん)もそうですが、英才教育的な効果があるとかで、藤井聡太ブームで将棋が見直されているぐらいですから。
将棋ぶらうざQ
将棋関係のソフトを提供しているサイトを調べていると、色々なサイトに巡り合います。 将棋ぶらうざQ もその一つなのですが、ここで取り上げたのは、ソフトがJavaのデスクトップアプリケーションとして開発されていたからです。
私はC言語(C++も含む)オンリーなので、Java で作成したソフトはどんな動きなのかに興味を持ったのと、Linux のソースも提供されておりますので、私の「自宅サーバー」に搭載して誰でも遊べるのではないかと思ったからです。
仮に出来るとしても、「自宅サーバー」に搭載して全世界からアクセスできるようにするのは、構想としては面白いのですが、セキュリティ上は問題だらけで、ただでさえ侵入を試みる人が毎日数十人は居るのに、私の能力では追いつかないので、当分は無理です。
そんなサイトも実際に存在しておりますが、相当な知識のある管理者がいないと維持できないでしょう。
そのトップページで紹介されている棋譜解析を行っている時の画像です。
サイトに掲載している画像が小さく感じましたので、実寸で表示させましたら今度は大きくなり過ぎましたので、画像加工してカットしております。
ですから、実際に動作させた時の画面とは異なりますが、雰囲気的に分かれば良いでしょう。
「将棋ぶらうざQ」は棋譜の研究用のイメージがしますが、「将棋エンジン」を登録出来ますので、人間対コンピュータや、コンピュータ同士の対局が可能です。
私は、「Bonanza6.0 USI」を登録して、ボナンザ同士の対局を鑑賞しましたが、見応えのある応酬で先手が勝利しておりました。
「将棋エンジン」の登録方法は、 将棋ぶらうざQに「Bonanza」を組み込む が参考になります。
この解説は、Mac を対象しておりますが、やり方はかなり似ております。(私の場合は「Bonanza6.0 USI」を使用しましたので異なる部分が多かったです)
USI (Universal Shogi Interface)プロトコル
将棋を指すだけ(圧倒的大多数)の人なら、将棋ソフトの中身などはどうでも良いでしょう。 正に「あなた作る人」、「私食べる人」の状態です。
私は「私食べる人」の存在を軽蔑している訳ではありません。 実際、日本(世界)では「私食べる人」が社会的地位も高く、「あなた作る人」は彼等にあごで使われております。
人間としての能力なら「あなた作る人」の方が明らかに高いのですが、社会への適応性なら「私食べる人」の方が遥かに高いからなのでしょう。
家庭でも、夫が妻に指図(さしず)されて行動するのは、夢(理想)ばかり追う男よりも現実的な思考をする女の方が社会への適応性が高いからでしょう。(つまりミスが少ない)
そんな状況を、男は女は愚かだと思っておりますし、女は男を愚かだと思っております。判断の基準が根本的に異なっておりますので、どちらの判断が正しいのかの結論は出ません。
はっきり言える事は、女には子供を作る(天性の)能力はありますが、将棋ソフトを作る能力(気力?)は無いでしょう。(私は女が作った将棋ソフトを見た事がありません)
つい話が横道にそれてしまいましたが、将棋ソフトを作成するには「USIプロトコル」を避けて通る事は出来ません。
「USIプロトコル」とは何かと言うと、将棋GUIソフトと思考エンジンが通信をするために、Tord Romstad氏によって考案された通信プロトコルの事です。
将棋GUIソフトと思考エンジンが、なぜ分かれているのかの説明はしませんが、将棋ソフトの思考エンジンを Windows で作成したいと思う人は少ないでしょう。
以降は「将棋所」の作者様が作成した USIプロトコルとは の抜粋(書き写し)です。 これが業界標準のプロトコルと考えて間違いありません。
【注記】
「USIプロトコル」を調べていると、このプロトコルには多くの問題点がある事が分かってきました。
ここでは細かく解説しませんので、 USIプロトコルについての疑問 などをご覧ください。きつい言い方ですが、内容は正しいのではないでしょうか。
勿論、問題点は一人の方が感じているのではなくて、 USIに文句を言うだけ言う のページなど、多くの将棋エンジンの作者が感じております。
SFENによる盤面と指し手の表記について
USIで使用される、SFEN(Shogi Forsyth-Edwards Notation)表記法による局面と指し手の表記を解説します。
この表記方法は、後述するpositionコマンドやbestmoveコマンド、さらにinfoコマンドなどで使用されます。
駒の種類は、それぞれ1文字のアルファベットで表され、先手の駒は大文字、後手の駒は小文字になります。
先手の玉:K、後手の玉:k (Kingの頭文字)
先手の飛車:R、後手の飛車:r (Rookの頭文字)
先手の角:B、後手の角:b (Bishopの頭文字)
先手の金:G、後手の金:g (Goldの頭文字)
先手の銀:S、後手の銀:s (Silverの頭文字)
先手の桂馬:N、後手の桂馬:n (kNightより)
先手の香車:L、後手の香車:l (Lanceの頭文字)
先手の歩:P、後手の歩:p (Pawnの頭文字)
駒が成った状態を表記するには、駒の文字の前に+をつけます。先手のと金は+Pとなります。
盤面を表記するとき、1段目の左側(9筋側)から駒の種類を書いていきます。空白の升は、空白が続く個数の数字を書きます。
平手初期局面の場合、1段目は、左から後手の駒が香桂銀金玉金銀桂香と並んでいるので、lnsgkgsnlとなります。2段目は、空白が1升、後手の飛車、空白が5升、後手の角、空白が1升というように並んでいるので、1r5b1となります。
各段がそのように表記され、1段目から9段目まで、それぞれの段の表記を/(半角スラッシュ)でつなげて書くと、盤面の表記になります。平手初期局面であれば
lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL ということになります。
しかし局面表記にはこれだけでは不十分で、次の手番と、持ち駒についても表記する必要があります。
次の手番については、先手番ならb、後手番ならwと表記します。(Black、Whiteの頭文字)
持ち駒については、先手後手のそれぞれの持ち駒の種類と、その枚数を表記します。枚数は、2枚以上であれば、駒の種類の前にその数字を表記します。先手側が銀1枚歩2枚、後手側が角1枚歩3枚であれば、S2Pb3pと表記されます。どちらも持ち駒がないときは-(半角ハイフン)を表記します。
さらにSFENの原案によると、次の手が何手目かという数字も表記する必要があります。ただし、任意局面から開始する場合など、次の手が何手目かという情報に意味がないので、これが必要なものかどうかよくわかりません。将棋所の場合、この数字は必ず1にしています。
以上によりSFENによる任意局面の表記方法が定義されます。香落ち初期局面であれば、
lnsgkgsn1/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1 というように表記されます。
次に、指し手の表記について解説します。筋に関しては1から9までの数字で表記され、段に関してはaからiまでのアルファベット(1段目がa、2段目がb、・・・、9段目がi)というように表記されます。位置の表記は、この2つを組み合わせます。5一なら5a、1九なら1iとなります。
そして、指し手に関しては、駒の移動元の位置と移動先の位置を並べて書きます。7七の駒が7六に移動したのであれば、7g7fと表記します。
(駒の種類を表記する必要はありません。)
駒が成るときは、最後に+を追加します。8八の駒が2二に移動して成るなら8h2b+と表記します。
持ち駒を打つときは、最初に駒の種類を大文字で書き、それに*を追加し、さらに打った場所を追加します。金を5二に打つ場合はG*5bとなります。
GUIからエンジンに送られるコマンド
usi
GUIがエンジンを起動した時に最初に送るコマンドです。エンジンは、このコマンドを受信したらすぐにidコマンドを返し、必要に応じてoptionコマンドを返します。そして最後にusiokコマンドを返す必要があります。
isready
対局開始前に送ります。エンジンは対局準備ができたらreadyokを返すことになります。
setoption name <id> [value <x>]
エンジンに対して値を設定する時に送ります。
<id>で指定する名前は、エンジンが起動時にoptionコマンドで返した名前になります。value <x>で指定する部分は、文字列であればその文字列を入れ、チェックボックスのブーリアン値であればtrueまたはfalseになります。
将棋所2.8.0からは、エンジン設定ダイアログでOKを押したときの設定内容を将棋所の側で保存して、対局開始時に同じ内容をsetoptionで送るようになりました。そのため、エンジンがsetoptionの内容を初期設定ファイルに保存する機能は不要になりました。
また、USI_PonderとUSI_Hashに関しては、将棋所4.0.2までは対局ダイアログ内に設定項目がありましたが、将棋所4.1.0からは、エンジン設定ダイアログを開いた時に上部に表示される「相手の手番中に先読み(USI_Ponder)」と「ハッシュメモリ(USI_Hash)」で設定するようになりました。
この二つに関しては、エンジンが起動時にoptionコマンドで返さなくても、将棋所で対局を開始するときに必ず送るようにしてあります。
以下に具体例を示します。
// オプション名USI_Ponderの値をtrueに設定
setoption name USI_Ponder value true
// オプション名USI_Hashの値を32に設定
setoption name USI_Hash value 32
usinewgame
対局開始時に送ります。これで対局開始になります。
position [sfen <sfenstring> | startpos ] moves <move1> ... <movei>
思考開始局面をエンジンに知らせるためのコマンドです。エンジンに思考を開始させる場合、positionコマンドで思考開始局面を送り、それに続けてgoコマンドを送って思考開始を命令することになります。
positionコマンドの書式として、まず初期局面を記述し、それに続けて初期局面からの全ての手を記述します。
初期局面の部分については、平手初期局面であれば単にstartposと書き、そうでなければsfenに続けてSFENの書式に基づいて記述します。
それに続く指し手の部分は、初期局面に続けてmovesを書き、さらに初手からの全ての手を並べて書きます。
例えば、平手初期局面から▲7六歩、△3四歩、▲2六歩と進んだ局面であれば、
position startpos moves 7g7f 3c3d 2g2f
となります。2枚落ち初期局面から△6二玉、▲7六歩、△3二銀と進んだ局面であれば、
position sfen lnsgkgsnl/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1 moves 5a6b 7g7f 3a3b
となります。このように、毎回毎回、初期局面からの全ての指し手を書く必要があるので、冗長に思われるかもしれません。しかし、この方式を採用することにより、エンジンは先読み機能への対応が簡単にできるようになります。また、この方式に対応した時点で、待ったの機能が自動的に実装済みになります。
go
思考開始の合図です。エンジンはこれを受信すると思考を開始します。
自分の手番の時に思考を開始することを通常思考と呼びます。相手の手番の時に思考を開始することを先読み思考と呼びます。後述しますが、go ponderによって思考を開始するときは先読み思考、ponderがついていないgoコマンドで思考を開始するときは通常思考となります。
以下に、goコマンドのオプションについて解説します。
ponder
これを使うときは、必ずgo ponderというように、goのすぐあとにponderを書くことになります。
ponderという言葉は、辞書では「熟考」と訳されていますが、思考ゲームにおいては、相手の手番中に次の手を考える「先読み」を意味します。
go ponderは、先読みを開始する合図となります。(先読みを開始すべき局面は、この前にpositionコマンドによって送られてきています。)
エンジンは、go ponderによって思考を開始する場合、GUI側から次のコマンド(stopまたはponderhit)が送られてくる前にbestmoveで指し手を返してはいけません。(たとえ、思考開始の時点で詰んでいるような場合であったとしてもです。)相手が手を指すと、それによってstopまたはponderhitが送られて来るので、それを待ってからbestmoveで指し手を返すことになります。(この辺の流れついては、後述する「対局における通信の具体例」を読んで下さい。)
btime, wtime <x>
先手と後手の残り時間を表示します。(btimeは先手の残り時間、wtimeは後手の残り時間。)単位はミリ秒です。
なお、byoyomiまたはbinc/wincで0より大きい値が設定されている場合、次の手には、残り時間とそれらを合計した時間まで考えることができます。詳しくは下のbyoyomiとbinc/wincの項目を参照して下さい。
byoyomi <x>
これはUSIの原案にはありませんが、将棋特有の秒読みに対応するために追加しました。単位はミリ秒です。先手と後手で秒読みの時間が違うということは想定していないので、どちらにも共通の値となります。
btime, wtime, byoyomiを使って、残り時間と秒読み時間を指定することができます。先手の残り時間が60秒、後手の残り時間が50秒、秒読みが10秒であれば、
go btime 60000 wtime 50000 byoyomi 10000
というようになります。この場合、次が先手番だとして、先手は次の手に残り時間60秒と秒読み10秒を合計した70秒まで考えることができます。
binc, winc <x>
フィッシャークロックルールで使われる、1手ごとの加算時間を表示します。単位はミリ秒です。このルールでは自分の手番が来るたびに持ち時間が加算され、先手はbinc、後手はwincで示される時間が加算されることになります。その加算時間内に手を指すと、余った時間は次の手の持ち時間に追加されます。
持ち時間なしで1手ごとの加算時間が10秒、双方とも10手ずつ指して先手の消費時間が60秒、後手の消費時間が50秒だとします。この場合、加算時間の総計は双方とも110秒になっているので、先手の残り時間は50秒、後手の残り時間は60秒となります。将棋所は次の指し手の思考開始コマンドを次のように送ります。
go btime 40000 wtime 50000 binc 10000 winc 10000
つまり、「先手の残り時間40秒、後手の残り時間50秒、先手の加算10秒、後手の加算10秒」の形で送ります。するとエンジン側では、次の手で先手は残り時間と加算を合わせて最大50秒考えることができ、次の手に進んだあとも1手につき10秒加算されることがわかります。
なお、秒読みと加算は、両方同時に使用することはありません。そのため、秒読みがあるときはbinc/wincは送らず、加算があるときはbyoyomiは送りません。ただし秒読みと加算が両方とも0ならbyoyomi 0を送ります。
infinite
時間無制限で思考させる場合に使います。(将棋所では、検討機能で制限時間を無制限にした時にgo inifiniteを送ります。)
エンジンはgo infiniteで思考を開始した場合、次にstopが送られてくる前にbestmoveを返してはいけません。stopが送られてきた時にbestmoveを返すことになります。
mate [<x> | infinite]
詰将棋解答を開始する時に使います。この時、制限時間を指定することができます。単位はミリ秒です。制限時間1分で解かせるのであれば、
go mate 60000
となります。また、時間無制限で解かせるのであれば、次のようにinfiniteを使います。
go mate infinite
エンジンは、go mateによって思考を開始した場合、checkmateコマンドを返すことになります。詰将棋解答に対応していないならcheckmate notimplementedを返すようにして下さい。
なお、USIの原案では、go mateのパラメータとして手数を指定することになっていて、go mate 9と指定すれば、9手以内に詰みがあるかどうか探索することになっています。しかし、チェスと違って将棋での詰手数というのは非常に長くなることがあり、詰将棋を解かせる時に「何手以内に詰みがあるかどうか」という使い方はほとんどしないので、手数の代わりに制限時間を指定するように変更しました。
stop
エンジンに対し思考停止を命令するコマンドです。エンジンはこれを受信したら、できるだけすぐ思考を中断し、bestmoveで指し手を返す必要があります。(現時点で最善と考えている手を返すようにして下さい。)
stopは通常思考と先読み思考のいずれの場合にも送られる可能性があります。通常思考では、人間対エンジンでエンジンの思考中に「急」(すぐ指させる)ボタンを押した場合と、検討を中断した場合に送ります。先読み思考ではエンジンの予想手が外れた場合に送ります。
ponderhit
エンジンが先読み中、前回のbestmoveコマンドでエンジンが予想した通りの手を相手が指した時に送ります。エンジンはこれを受信すると、先読み思考から通常の思考に切り替わることになり、任意の時点でbestmoveで指し手を返すことができます。
quit
アプリケーション終了を命令するコマンドです。エンジンはこれを受信したらすぐに終了する必要があります。
gameover [ win | lose | draw ]
gameoverというコマンドはUSIの原案にはありませんが、これがないと対局終了をエンジンに知らせることができないために追加しました。gameoverのあと、エンジンの結果に応じてwin, lose, drawのいずれかのパラメータも一緒に送られます。
エンジンはgameoverを受信したら対局状態を終了して、対局待ち状態になります。その後、isready及びusinewgameを受信すると次の対局開始ということになります。
エンジンからGUIに送られるコマンド
id name <program name>
id author <program author>
usiコマンドを受信した時に最初に送り返すコマンドです。この時、id nameでプログラム名を返し、id authorで作者名を返します。将棋所でエンジンを追加する場合、このid nameで返した名前を登録するので、必ず送り返す必要があります。
usiok
usiコマンドを受信した時に最後に送り返すコマンドです。将棋所ではこれを返さないエンジンはUSIエンジンと認識されず登録できないので、必ず送り返す必要があります。
readyok
isreadyコマンドを受信した時、対局準備ができたらreadyokを返して下さい。対局前に時間のかかる処理をする場合など、isreadyを受信してからreadyokを返す間にやるといいと思います。
bestmove <move1> [ponder <move2>]
エンジンの指し手を返します。<move1>の部分にエンジンの指し手を記述します。
単に指し手を返すのであれば、bestmoveのあとにエンジンの指し手だけを追加し、ponderは追加しないようにします。エンジンが7g7fと指し、その後の先読みをしないのであれば、
bestmove 7g7f
となります。
指し手を返したあと、先読み機能を使いたいのであれば、自分の指し手のあと、ponder <move2>の部分に、エンジンが予想した相手の指し手を追加します。これがGUIに対する先読み要求になります。例えば、エンジンが8h2b+と指すとして、それに対する相手の指し手を3a2bと予想し、その局面からの先読みを要求するのであれば、
bestmove 8h2b+ ponder 3a2b
となります。この後、GUI側から、相手が3a2bと指した局面がpositionコマンドによって送られてきて、それに続けてgo ponderが送られてくるので、その時点から先読みを開始します。
このように、USIプロトコルにおいて、エンジンの先読みは、
エンジン側からbestmove <move1> ponder <move2>による先読み要求
GUI側からpositionコマンドで先読み思考開始局面の送信
GUI側からgo ponderコマンドが送られ先読み開始
という一連の流れに沿って行われます。この方式に従うことにより、先読みの実装が容易になります。また、エンジンの先読み時の予想手が将棋所の「予想手」の欄に表示され、先読み中の思考内容もinfoコマンドを使えば通常思考時と同様にGUIで表示できるようになります。
なお、先読みをする時に、予想手を一つではなく複数考えたいということがあるかもしれません。そのような場合は、USIの本来の使い方からは外れますが、bestmove <move1> ponder <move2>ではなく、単にbestmove <move1>だけを返し、相手の手番中に勝手に先読みするようにして下さい。
エンジンの投了について
USIの原案では、エンジンが投了する方法が用意されていません。しかし、エンジン側の判断で投了できないというのはどう考えてもおかしな話なので、投了する方法を追加しました。
bestmove resign
を送ることによって、GUIに投了を伝えることができます。GUIはこれを受信すると対局状態を終了し、gameoverコマンドをエンジンに送ります。
また、エンジンは、相手の指し手によって詰まされてしまった場合は必ずbestmove resignを返すようにして下さい。
入玉勝ち宣言について
入玉して勝ちと判断した時、エンジンは入玉勝ち宣言をすることができます。このための方法を追加しました。
bestmove win
を送ることによって、GUIに入玉勝ち宣言を伝えることができます。
GUIはこれを受信すると、通信対局であれば、通信相手に%KACHIコマンドを送ります。人間対エンジン、またはエンジン対エンジンであれば、その宣言が正しいかどうか、GUIが判断して勝敗を決めます。
入玉勝ち宣言が正しいかどうかは、CSAルールでの定義に基づくものとします。それ以外のルール(24点法など)は使用しません。
info
エンジンは、goコマンドで思考を開始してからbestmoveコマンドで指し手を返すまでの間、infoコマンドによって思考中の情報を返すことができます。infoコマンドはいくつかのサブコマンドで構成されます。以下に、そのサブコマンドについて解説します。
また、サブコマンドは1行にまとめて書くことができます。(ただし、pvとstringの同時使用は不可。)
depth <x>
現在思考中の手の(基本の)探索深さを返します。
seldepth <x>
現在、選択的に読んでいる手の探索深さを返します。seldepthを使うときは、必ずその前でdepthを使って基本深さを示す必要があります。基本深さが5で、選択的に読んだ手の深さが8であれば、
depth 5 seldepth 8
というように続けて書くことになります。
time <x>
思考を開始してから経過した時間を返します(単位はミリ秒)。これはpvと一緒に返す必要があります。
nodes <x>
思考開始から探索したノード数を返します。これは定期的に返す必要があります。
pv <move1> ... <movei>
現在の読み筋を返します。(pvというのは、principal variationの略です。)pvのあと、指し手を続けて書くことになります。なお、pvを使う場合、infoのあとに書くサブコマンドの中で最後に書くようにして下さい。stringとの同時使用はできません。
multipv <x>
pvで初手の異なる複数の読み筋を返す時、それがn通りあれば、最も良い(評価値の高い)ものについて"multipv 1"、以下順に"multipv 2"、..."multipv n"のように各行で指定します。
score cp <x>
score mate <y>
エンジンによる現在の評価値を返します。score cpで評価値を返す場合、歩1枚の価値を100とした値を返すことになります。(cpというのは、centi pawnの略です。)この値は、エンジンの側から見た値となり、エンジンが有利ならプラス、エンジンが不利ならマイナスの値になります。エンジンが50点有利と判断しているならscore cp 50となります。
エンジンが詰みを発見した場合は、score mateによって詰み手数を返すことができます。詰み手数に入れる数字は、エンジンの勝ちならプラス、エンジンの負けならマイナスになります。エンジンが6手後に詰まされて負けると判断した場合はscore mate -6となります。
ただし、「詰みを発見したが、手数がわからない」ということがあるかもしれません。(実は、サンプル用のエンジンであるLesserkaiが詰みを発見したときがこの状況になります。)こういう場合は、score mate + またはscore mate - のように、数字を使わず、単に+または-の記号を使用するようにして下さい。(これはUSIの原案にはありませんが、将棋所で機能追加しています。)
lowerbound
評価値が下限値(実際にはその値を上回る可能性がある)の場合に返します。
upperbound
評価値が上限値(実際にはその値を下回る可能性がある)の場合に返します。
lowerboundとupperboundを使う場合は、score cp <x> lowerbound または score cp <x> upperbound のように使って下さい。
この場合、将棋所では、評価値の隣の欄に++または--(lowerboundなら++、upperboundなら--)を追加して表示します。(表示設定の「対局または検討で、後手の評価値を反転表示」にチェックしてから対局または検討をした場合、あるいは棋譜解析の場合には、後手番のエンジンの++または--は反転表示されます)
currmove <move>
現在思考中の手を返します。(思考開始局面から最初に指す手です。)
hashfull <x>
エンジンが現在使用しているハッシュの使用率を返します。単位はパーミル(全体を1000とした値)になります。現在のハッシュ使用率が20%であれば、hashfull 200となります。
このコマンドは定期的に返す必要があります。
nps <x>
1秒あたりの探索局面数を返します。これは定期的に返す必要があります。
string <str>
GUIに表示させたい任意の文字列を返します。GUIはstringサブコマンド以降の文字列を全てそのまま表示します。将棋所の場合、この文字列は「読み筋」の欄に表示します。そのためpvと同時使用はできません。
これらのサブコマンドは次の例のように1行に並べて書くことができます。実際の使い方としては、pvを返すときに、time、depth、nodes、scoreなどをまとめて返すとよいでしょう。
また、定期的に返す必要のある、nodes、nps、hashfullなどもまとめて返すとよいと思います。(定期的に返す場合、あまり頻繁だと無駄なので、少なくとも1秒は間隔をおくようにして下さい。)
info time 1141 depth 3 nodes 135125 score cp -1521 pv 3a3b L*4h 4c4d
info nodes 120000 nps 116391 hashfull 104
info string 7g7f (70%)
multipvを使う場合は、読み筋ごとにmultipvで数字を指定します。返す順番は昇順と降順のどちらでも構いません(将棋所の側でmultipvの数字が小さいものが上に来るようソートします)
info score cp 156 multipv 1 pv P*5h 4g5g 5h5g 8b8f
info score cp -99 multipv 2 pv 2d4d 3c4e 8h5e N*7f
info score cp -157 multipv 3 pv 5g5f 4g4f 4e3c+ 4c3c
info score cp -225 multipv 4 pv 5g6h 8b8f P*8g 8f5f
option
エンジン固有の設定値を送ります。このコマンドは、GUIからusiが送られてきたあと、idとusiokを送り返す間に送ることになります。GUIはこれによって送られた内容を読み取り、エンジン設定ダイアログで表示することができます。エンジン設定ダイアログでOKを押すと、設定した内容をsetoptionコマンドでエンジンに送ることになります。optionコマンドは以下の書式になります。
option name <optionname> type <optiontype> <parameter...>
optionnameにオプション名を入れ、optiontypeにオプションの種類を入れます。optionnameにはスペースを入れてはいけません。
オプション名については、USIによって予約されているものがいくつかあります。そのうち、USI_HashとUSI_Ponderについては、将棋所で対局を開始するときに必ずsetoptionコマンドで値を送るようにしています。この2つのオプションについて解説します。
<id> = USI_Hash, type spin
エンジンのハッシュメモリの量を指定します。単位はMBになります。
<id> = USI_Ponder, type check
エンジンが先読み機能を使用できるかどうか指定します。これでfalseを指定すると、エンジンは先読み機能を使うことはできません。
なお、将棋所で対局開始時にこの2つを必ず指定しているのは、この2つは使用頻度が高く、値の変更も頻繁に行われると思われるためです。
USIの原案では、これ以外にも、USI_OwnBook、USI_MultiPV、USI_ShowCurrLine、USI_ShowRefutations、USI_LimitStrength、USI_Strength、USI_AnalyseModeという名前のオプションが予約されています。(詳しくは原案を読んで下さい。)
ただし、将棋所では、これらのオプションを設定することはありません。
オプションの種類は以下の6種類があります。このオプションの種類により、エンジン設定ダイアログで表示されるコントロールの型が決まります。
check
チェックボックスを表示します。
spin
数値のみを入力できるコントロールを表示します。
combo
ポップアップメニューを表示します。
button
ボタンを表示します。このボタンを押すと、オプション名で指定されたコマンドがエンジンに送られます。(オプション名がoptionnameなら、このボタンを押すと、setoption name optionnameというコマンドが送られます。)
string
文字列を入力できるコントロールを表示します。
filename
ファイル名を入力できるコントロールを表示します。ファイル名を指定しやすいよう、ファイル選択ボタンを表示し、それを押すと、ファイル選択のダイアログを表示するようになっています。ここで選択したファイルの絶対パスが設定値となります。
これらの種類を指定した後、そのデフォルト値や、入力値の範囲などを指定することができます。
default <x>
デフォルト値を指定します。種類がcheckであれば、trueまたはfalseとなります。種類がspinであれば数字、combo、string、filenameであれば、任意の文字列になります。
なお、stringまたはfilenameでデフォルト値が空の文字列の場合は<empty>を指定して下さい。(emptyの両側に不等号の記号が必要です。)
min <x>
max <x>
種類がspinである場合、その値の下限値と上限値を指定します。
var <x1> var <x2> ...
種類がcomboの場合、選択できる文字列を追加します。
以下に、optionコマンドの使用例を示します。
// オプション名がUseBook、種類がcheck、デフォルト値がtrueであれば
option name UseBook type check default true
// オプション名がSelectivity、種類がspin、デフォルト値が2で、選択可能な値が0から4までなら
option name Selectivity type spin default 2 min 0 max 4
// オプション名がStyle、種類がcombo、デフォルト値がNormalで、選択可能な文字列がSolid、Normal、Riskyの3つであるなら
option name Style type combo default Normal var Solid var Normal var Risky
// オプション名がResetLearning、種類がbuttonなら
option name ResetLearning type button
// オプション名がBookFile、種類がstring、デフォルト値がpublic.binなら
option name BookFile type string default public.bin
// オプション名がLearningFile、種類がfiliename、デフォルト値が空なら
option name LearningFile type filename default <empty>
checkmate [<move1> ... <movei> | notimplemented | timeout | nomate]
checkmateというコマンドはUSIの原案にはありませんが、GUIからgo mateを送られて詰将棋解答を開始したあと、その結果を返すためのコマンドとして追加しました。checkmateのオプションは以下の通りになります。
notimplemented
詰将棋解答機能に対応していないエンジンの場合、go mateに対しては
checkmate notimplementedを返します。
timeout
制限時間ありで詰将棋解答を開始した場合、制限時間内に結論が出なければ、
checkmate timeoutを返します。
nomate
詰将棋を解いて、「この問題は詰まない」という結論が出たら、
checkmate nomateを返します。
詰将棋を解いて、その問題が詰むのであれば、その手順をcheckmateのあとに続けて書きます。例えば、
checkmate G*8f 9f9g 8f8g 9g9h 8g8h
というようになります。詰将棋解答時の全体の流れについては、後述する「詰将棋解答における通信の具体例」の項目を参考にして下さい。
なお、「詰将棋解答機能だけに対応して、通常の対局に対応していない」というエンジンを作った場合は、(go mateでない)通常のgoコマンドに対してはbestmove resignを返すようにしておいて下さい。間違ってそのエンジンで対局を開始してもすぐに対局が終わるので、そのエンジンでは対局できないことがわかります。
対局における通信の具体例
以下に、実際の通信の具体例を示します。特に、思考開始と指し手について解説します。なお、GUIがエンジンに対して送るコマンドの前には">"を、エンジンがGUIに対して送るコマンドの前には"<"をつけています。
エンジン起動から対局開始まで
// エンジン起動
>usi
// usiコマンドに対する返答(例)
<id name Lesserkai
<id authoer Program Writer
<option name BookFile type string default public.bin
<option name UseBook type check default true
<usiok
// 対局開始前のオプション設定(例)
>setoption name USI_Ponder value true
>setoption name USI_Hash value 32
>setoption name BookFile value public.bin
>setoption name UseBook value true
// 対局開始前の準備
>isready
<readyok
// 対局開始
>usinewgame
指し手のやり取り
最も重要な部分である、指し手の部分について説明します。(なお、以下の例で、goコマンドのオプションである持ち時間指定部分は省略しています。)
まず、GUIはエンジンに対し、positionコマンドで現在局面を送り、それに続けてgoコマンドを送って思考開始を命令します。エンジンが後手で、先手が平手初期局面から7七歩と指した局面であれば、
>position startpos moves 7g7f
>go
それに対しエンジンは、思考したあと、bestmoveコマンドで指し手を返します。先読みしないのであれば、エンジンの指し手だけを返します。
<bestmove 3c3d
なおエンジンは、goを受信してからbestmoveを返すまでの間に、infoコマンドで思考内容を送ってGUIに表示させることができます。(この例では省略しています。)
次に、先読み機能を説明します。
エンジンが後手で、先手が平手初期局面から1六歩と指した局面であれば
>position startpos moves 1g1f
>go
エンジンはbestmoveコマンドで指し手を返しますが、この時に先読み要求を出すことができます。エンジンの指し手が4a3bで、それに対する相手の指し手を6i7hと予想したのであれば
<bestmove 4a3b ponder 6i7h
GUIはこれを受信すると、すぐにpositionコマンドで思考開始局面を送ります。この局面は、現在局面に、エンジンが予想した相手の指し手(この場合は6i7h)を追加したものになります。それに続けてgo ponderコマンドを送ります。
>position startpos moves 1g1f 4a3b 6i7h
>go ponder
エンジンはこれを受信すると先読みを開始します。goコマンドの解説にも書きましたが、go ponderによって先読みを開始した場合、次にGUIからstopまたはponderhitが送られてくるまで、エンジンはbestmoveを返してはいけません。相手が次の手を指す前に思考が終わったとしても、GUIからstopまたはponderhitが送られてくるまで待つことになります。
やがて、相手が手を指します。その手がエンジンの予想手と一致した場合と、そうでない場合で動作が異なります。
エンジンの予想手が外れた場合
この場合、GUIはエンジンにstopを送ります。
>stop
エンジンはこれに対し、思考中ならすぐに思考を打ち切って、現時点で最善と考えている手をbestmoveで返します。既に思考が終わっていたなら、探索済みの指し手をbestmoveで返します。(bestmoveのあとにponderで相手の予想手を追加しても構いませんが、いずれにしろ無視されます。)
<bestmove 6a5b ponder 4i5h
この、stopに対してbestmoveで返された指し手は、外れた予想手(この場合は6i7h)に対する指し手なので、GUIはこの内容を無視して、正しい相手の指し手(現在局面)を送ります。続けてgoコマンドも送ります。相手が7g7fと指したのであれば
>position startpos moves 1g1f 4a3b 7g7f
>go
エンジンはこれによって通常の思考を開始します。
エンジンの予想手が当たった場合
この場合、GUIはエンジンにponderhitを送ります。
>ponderhit
予想手が当たったので、エンジンは引き続き思考を継続して構いません。既に思考が終わっていたら、すぐにその指し手を返すこともできます。bestmoveで指し手を返すとき、前回と同様にponderを追加して先読み要求を出すこともできます。
<bestmove 6a5b ponder 4i5h
以下、同様にして対局が継続されます。
対局終了
エンジンは、自分の指し手のとき、bestmove resignを送ることで投了することができます。また、相手の指し手によって詰まされてしまった場合は、必ずbestmove resignを返すようにしてください。
<bestmove resign
対局終了を確認すると、GUIはエンジンにgameoverコマンドを送ります。エンジンが勝った場合はgameover win、負けた場合はgameover loseを送ります。千日手が発生した場合は、gameover drawを送ります。
>gameover lose
エンジンはこれで対局状態を終了し、次の対局待ち状態になります。
詰将棋解答における通信の具体例
詰将棋解答についても、全体の流れとしては対局時とほとんど同じです。エンジン起動から解答準備に入るまでのコマンドのやり取りは、USI_Ponderの設定をしないことを除けば、通常の対局時と同じです。(対局ではないので、usinewgameとか不要に思われるかもしれませんが、対局時と同じような流れにした方がエンジンの詰将棋対応をやりやすいと思ったので、あえて同じようにしてあります。)
// エンジン起動
>usi
// usiコマンドに対する返答(例)
<id name Lesserkai
<id authoer Program Writer
<option name BookFile type string default public.bin
<option name UseBook type check default true
<usiok
// 詰将棋解答開始前のオプション設定(例)
>setoption name USI_Hash value 32
>setoption name BookFile value public.bin
>setoption name UseBook value true
// 詰将棋解答開始前の準備
>isready
<readyok
// 詰将棋解答開始
>usinewgame
問題と解答のやり取り
次にGUIは問題局面を送って詰将棋解答の開始をエンジンに命令し、エンジンは解答を返します。この部分のやり取りも通常の対局時と似ています。通常の対局時にはGUIがgoを送ってエンジンが思考を開始し、エンジンはbestmoveで指し手を返しますが、詰将棋解答時はgoの代わりにgo mateを送ってエンジンが思考を開始し、エンジンはbestmoveの代わりにcheckmateを返す、ということになります。
まずGUIはpositionで問題の局面を送ります。例えば、
>position sfen 9/9/9/9/9/k8/9/9/1R2K4 b Gr2b3g4s4n4l18p 1
positionに続けてgo mateコマンドを送ります。時間無制限で解かせるのなら、
>go mate infinite
これでエンジンは思考を開始し、checkmateコマンドを返します。
<checkmate G*8f 9f9g 8f8g 9g9h 8g8h
なお、go mateを受信してからcheckmateを返すまでの間、エンジンはinfoコマンドを使って思考内容を返すことができます。
エンジンはcheckmateを返したら次の問題待ちになります。そして、またpositionとgo mateが送られてきたら、次の問題の解答を開始することになります。
USIに追加されたコマンド
既に説明しましたが、USIの原案にないコマンドで、USIに新しく追加されたコマンドなどについてまとめます。
GUIからエンジンに送るコマンド
gameover
goのオプションとしてbyoyomi
また、追加ではありませんが、go mateのパラメータを原案から変更しています。
エンジンからGUIに送るコマンド
bestmoveのパラメータとしてresignとwin
checkmate
USIの原案のうち、未対応のコマンド
将棋所では、USIの原案にあるコマンドのうち、次のコマンドなどに未対応です。今後の対応も未定です。
GUIからエンジンに送るコマンド
debug
register
goのオプションのうち、searchmoves, movestogo, depth, nodes, movetime
エンジンからGUIに送るコマンド
registration
infoのサブコマンドのうち、multipv, currmovenumber, cpuload, refutation, currline