public void ReadyOk() { //------------------------------------------------------------ // それでは定刻になりましたので…… //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 1:31:35> isready // │ // // // 対局開始前に、将棋所から送られてくる文字が isready です。 //------------------------------------------------------------ // 将棋エンジン「おっおっ、設定を終わらせておかなければ(汗、汗…)」 //------------------------------------------------------------ Logger.Trace("┏━━━━━設定━━━━━┓"); foreach (KeyValuePair <string, string> pair in this.SetoptionDictionary) { // ここで将棋エンジンの設定を済ませておいてください。 Logger.Trace(pair.Key + "=" + pair.Value); } Logger.Trace("┗━━━━━━━━━━━━┛"); //------------------------------------------------------------ // よろしくお願いします(^▽^)! //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 2:03:33< readyok // │ // // // いつでも対局する準備が整っていましたら、 readyok を送り返します。 Playing.Send("readyok"); }
public void UsiOk(string engineName, string engineAuthor) { //------------------------------------------------------------ // あなたは USI ですか? //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 1:31:35> usi // │ // // // 将棋所で [対局(G)]-[エンジン管理...]-[追加...] でファイルを選んだときに、 // 送られてくる文字が usi です。 //------------------------------------------------------------ // エンジン設定ダイアログボックスを作ります //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 23:40:15< option name 子 type check default true // │2014/08/02 23:40:15< option name USI type spin default 2 min 1 max 13 // │2014/08/02 23:40:15< option name 寅 type combo default tiger var マウス var うし var tiger var ウー var 龍 var へび var 馬 var ひつじ var モンキー var バード var ドッグ var うりぼー // │2014/08/02 23:40:15< option name 卯 type button default うさぎ // │2014/08/02 23:40:15< option name 辰 type string default DRAGON // │2014/08/02 23:40:15< option name 巳 type filename default スネーク.html // │ // // // 将棋所で [エンジン設定] ボタンを押したときに出てくるダイアログボックスに、 // ・チェックボックス // ・スピン // ・コンボボックス // ・ボタン // ・テキストボックス // ・ファイル選択テキストボックス // を置くことができます。 // Playing.Send("option name 子 type check default true"); Playing.Send("option name USI type spin default 2 min 1 max 13"); Playing.Send("option name 寅 type combo default tiger var マウス var うし var tiger var ウー var 龍 var へび var 馬 var ひつじ var モンキー var バード var ドッグ var うりぼー"); Playing.Send("option name 卯 type button default うさぎ"); Playing.Send("option name 辰 type string default DRAGON"); Playing.Send("option name 巳 type filename default スネーク.html"); //------------------------------------------------------------ // USI です!! //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 2:03:33< id name fugafuga 1.00.0 // │2014/08/02 2:03:33< id author hogehoge // │2014/08/02 2:03:33< usiok // │ // // プログラム名と、作者名を送り返す必要があります。 // オプションも送り返せば、受け取ってくれます。 // usi を受け取ってから、5秒以内に usiok を送り返して完了です。 Playing.Send($"id name {engineName}"); Playing.Send($"id author {engineAuthor}"); Playing.Send("usiok"); }
public void Stop() { //------------------------------------------------------------ // あなたの手番です (すぐ指してください!) //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 2:03:35> stop // │ // // 何らかの理由で すぐ指してほしいときに、将棋所から送られてくる文字が stop です。 // // 理由は2つ考えることができます。 // (1)1手前に、将棋エンジンが 将棋所に向かって「予想手」付きで指し手を伝えたのだが、 // 相手の応手が「予想手」とは違ったので、予想手にもとづく思考を 今すぐ変えて欲しいとき。 // // (2)「急いで指すボタン」が押されたときなどに送られてくるようです? // // stop するのは思考です。 stop を受け取ったら すぐに最善手を指してください。 if (this.Game.GoPonderNow) { //------------------------------------------------------------ // 将棋エンジン「(予想手が間違っていたって?) △9二香 を指そうと思っていたんだが」 //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 2:36:21< bestmove 9a9b // │ // // // 1手前の指し手で、将棋エンジンが「bestmove ★ ponder ★」という形で 予想手付きで将棋所にメッセージを送っていたとき、 // その予想手が外れていたならば、将棋所は「stop」を返してきます。 // このとき 思考を打ち切って最善手の指し手をすぐに返信するわけですが、将棋所はこの返信を無視します☆w // (この指し手は、外れていた予想手について考えていた“最善手”ですからゴミのように捨てられます) // その後、将棋所から「position」「go」が再送されてくるのだと思います。 // // 将棋エンジン「bestmove ★ ponder ★」 // ↓ // 将棋所 「stop」 // ↓ // 将棋エンジン「うその指し手返信」(無視されます)←今ここ // ↓ // 将棋所 「position」「go」 // ↓ // 将棋エンジン「本当の指し手」 // // という流れと思います。 // この指し手は、無視されます。(無視されますが、送る必要があります) Playing.Send("bestmove 9a9b"); } else { //------------------------------------------------------------ // じゃあ、△9二香で //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 2:36:21< bestmove 9a9b // │ // // // 特に何もなく、すぐ指せというのですから、今考えている最善手をすぐに指します。 Playing.Send("bestmove 9a9b"); } }
public void Go(string btime, string wtime, string byoyomi, string binc, string winc) { // ┏━━━━サンプル・プログラム━━━━┓ int latestTesumi = this.Game.Kifu.CountTesumi(this.Game.Kifu.CurNode); //現・手目済 this.PlayerInfo.Playerside = this.Game.Kifu.CountPside(latestTesumi); // 先後 //#if DEBUG // MessageBox.Show("["+latestTesumi+"]手目済 ["+this.owner.PlayerInfo.Playerside+"]の手番"); //#endif SkyConst src_Sky = this.Game.Kifu.NodeAt(latestTesumi).Value.ToKyokumenConst;//現局面 // + line Logger.Trace("将棋サーバー「" + latestTesumi + "手目、きふわらべ さんの手番ですよ!」 "); Result_Ajimi result_Ajimi = this.AjimiEngine.Ajimi(src_Sky); //------------------------------------------------------------ // わたしの手番のとき、王様が 将棋盤上からいなくなっていれば、投了します。 //------------------------------------------------------------ // // 将棋GUI『きふならべ』用☆ 将棋盤上に王さまがいないときに、本将棋で go コマンドが送られてくることは無いのでは☆? // switch (result_Ajimi) { case Result_Ajimi.Lost_SenteOh: // 先手の王さまが将棋盤上にいないとき☆ case Result_Ajimi.Lost_GoteOh: // または、後手の王さまが将棋盤上にいないとき☆ { //------------------------------------------------------------ // 投了 //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 2:36:21< bestmove resign // │ // // この将棋エンジンは、後手とします。 // 20手目、投了 を決め打ちで返します。 Playing.Send("bestmove resign"); //投了 } break; default: // どちらの王さまも、まだまだ健在だぜ☆! { //------------------------------------------------------------ // 指し手のチョイス //------------------------------------------------------------ bool enableLog = false; bool isHonshogi = true; // 指し手を決めます。 ShootingStarlightable bestMove = this.shogisasi.WA_Bestmove( enableLog, isHonshogi, this.Game.Kifu, this.PlayerInfo ); if (Util_Sky.isEnableSfen(bestMove)) { string sfenText = Util_Sky.ToSfenMoveText(bestMove); Logger.Trace("(Warabe)指し手のチョイス: bestmove=[" + sfenText + "]" + " 棋譜=" + KirokuGakari.ToJapaneseKifuText(this.Game.Kifu)); Playing.Send("bestmove " + sfenText); //指し手を送ります。 } else // 指し手がないときは、SFENが書けない☆ 投了だぜ☆ { Logger.Trace("(Warabe)指し手のチョイス: 指し手がないときは、SFENが書けない☆ 投了だぜ☆ww(>_<)" + " 棋譜=" + KirokuGakari.ToJapaneseKifuText(this.Game.Kifu)); // 投了w! Playing.Send("bestmove resign"); } } break; } // ┗━━━━サンプル・プログラム━━━━┛ }