将棋ソフト作りに挑戦 その4
私が不安だったのが次のこと。
指し手を生成する将棋ソフトができたとして、どうやって将棋所に登録させればいいのか。
これが分からないと、将棋ソフトを作ることに専念できない。だから、まず将棋所に登録ができることを確認します。
試しに、将棋所を立ち上げて、対局→エンジン管理→追加で、"hello world"と出力するだけのコードの実行ファイルを登録してみます。実行ファイルの場所は、C:\Users\ユーザ名\Documents\Visual Studio 2015\Projects\プロジェクト名\プロジェクト名\bin\Debugにあると思います。すると、「これはUSIエンジンではありません」とあって登録できません。
USI(universal shogi interface)は将棋ソフトと将棋GUIが通信するためのプロトコルです。メッセージのやり取りは標準入出力で行われます。だから、標準入出力を扱える言語ならUSIが使えることになります(将来的には、C++で作ろうかな?)。将棋所に将棋ソフトを登録するときはこのプロトコルに従ったメッセージを送るときだけ許可されるようです。試しに、次のコードの実行ファイルを登録してみます。
using System; using System.IO; public class USI { TextReader input= Console.In; string line; public void USI_Start() { while (true) { if ((line = input.ReadLine()) != null) { if (line == "usi") { Console.WriteLine("id name test"); Console.WriteLine("id author Program Writer"); Console.WriteLine("usiok"); } //①ここに後で文を追加 if (line == "quit") { break; } } } } }
すると、登録されているのが分かります。将棋所の表示→デバックウィンドウを見てみます。これは将棋所と将棋ソフトのメッセージのやり取りのログです。>が将棋所から、<が将棋ソフトからのメッセージです。
>C:usi <C:id name test <C:id author Program Writer <C:usiok >C:quit
はじめに将棋所が"usi"を送信して、将棋ソフトが自己紹介したあとに,"usiok"を返信までが基本の挨拶になっているようです。"quit"が来たら、将棋ソフトの実行を終わらせないとダメです。
登録できた将棋ソフトと自分が戦ってみます。コードの①に次のコードを追加しておきます。
if (line == "isready") { Console.WriteLine("readyok"); } if (line.Contains("go")) { Console.WriteLine("bestmove resign"); }
対局を開始すると、いきなりユーザの勝ちになりますw。将棋ソフトに即投了するよう命令してあるからです("bestmove resign"メッセージ)。
これで、GUIについてはなんとかなることが分かったので、将棋ソフト本体の開発に進んでいくことができます。
続く?