Esempio n. 1
0
        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");
        }
Esempio n. 2
0
        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");
        }
Esempio n. 3
0
        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");
            }
        }
Esempio n. 4
0
        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;
            }
            // ┗━━━━サンプル・プログラム━━━━┛
        }