Exemplo n.º 1
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 手番が替わったときの挙動を、ここに書きます。
        /// ************************************************************************************************************************
        /// </summary>
        public void OnChangedTurn(KifuTree kifu)
        {
            if (!this.ShogiEngineProcessWrapper.IsLive_ShogiEngine())
            {
                goto gt_EndMethod;
            }

            // FIXME:
            Playerside pside = kifu.CurNode.Value.KyokumenConst.KaisiPside;

            switch (pside)
            {
            case Playerside.P2:
                // 仮に、コンピューターが後手番とします。

                //------------------------------------------------------------
                // とりあえず、コンピューターが後手ということにしておきます。
                //------------------------------------------------------------

                // 例:「position startpos moves 7g7f」
                this.ShogiEngineProcessWrapper.Send_Position(Util_KirokuGakari.ToSfen_PositionCommand(kifu));

                this.ShogiEngineProcessWrapper.Send_Go();

                break;

            default:
                break;
            }

gt_EndMethod:
            ;
        }
Exemplo n.º 2
0
        /// <summary>
        /// 将棋エンジンから、データを非同期受信(*1)します。
        ///
        ///         *1…こっちの都合に合わせず、データが飛んできます。
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public override void OnListenUpload_Async(object sender, DataReceivedEventArgs e)
        {
            string line = e.Data;

            if (null == line)
            {
                // 無視
            }
            else
            {
                switch (this.Owner_AimsServer.Phase_AimsServer)
                {
                case Phase_AimsServer._01_Server_Booted: break;    //thru

                case Phase_AimsServer._02_WaitAimsUsiok: break;    //thru

                case Phase_AimsServer._03_WaitEngineLive: break;   //thru

                case Phase_AimsServer._04_WaitEngineUsiok:
                {
                    if (line.StartsWith("option "))
                    {
                        //ok MessageBox.Show($"将棋サーバー「Firstフェーズで、将棋エンジンから、オプション[{line}]が返ってきたぜ☆!」");
                    }
                    else if (line.StartsWith("id "))
                    {
                        //ok MessageBox.Show($"将棋サーバー「Firstフェーズで、将棋エンジンから、アイディー[{line}]が返ってきたぜ☆!」");
                    }
                    else if ("usiok" == line)
                    {
                        //------------------------------------------------------------
                        // AIMS GUIへ: 「isready」を転送します。
                        //------------------------------------------------------------
                        //MessageBox.Show($"将棋サーバー「将棋エンジンから、usiokが返ってきたぜ☆!\nサーバーは WaitAimsIsready フェーズに移るぜ☆\nAIMS GUIには isready を送るぜ☆!」");
                        this.Owner_AimsServer.SetPhase_AimsServer(Phase_AimsServer._05_WaitAimsReadyok);
                        Console.Out.WriteLine("isready");
                    }
                    else
                    {
                        MessageBox.Show($"将棋サーバー「WaitEngineUsiokフェーズで、将棋エンジンから、[{line}]が返ってきたぜ☆!」");
                    }
                }
                break;

                case Phase_AimsServer._05_WaitEngineReadyok:
                {
                    //------------------------------------------------------------
                    // 将棋エンジンからの「readyok」コマンドを待っています。
                    //------------------------------------------------------------
                    if ("readyok" == line)
                    {
                        //MessageBox.Show("将棋サーバー「将棋エンジンから、readyokが返ってきたぜ☆!\n" +
                        //    "AIMS GUI が先手と仮定し、\n" +
                        //    "サーバーは WaitAimsBestmove フェーズに移るぜ☆\n" +
                        //    "AIMS GUI、将棋エンジンの双方に usinewgame コマンドを送るぜ☆!」");

                        //------------------------------------------------------------
                        // 対局開始!
                        //------------------------------------------------------------
                        Console.Out.WriteLine("usinewgame");
                        ((EngineClient)this.Owner_EngineClient).ShogiEngineProcessWrapper.Send_Usinewgame();

                        // FIXME:平手とは限らないが、平手という前提で、毎回一から作りなおします。
                        Playerside firstPside = Playerside.P1;
                        this.Owner_AimsServer.Model_Taikyoku.SetKifu(new KifuTreeImpl(
                                                                         new KifuNodeImpl(
                                                                             Util_Sky258A.RootMove,
                                                                             new KyokumenWrapper(SkyConst.NewInstance(
                                                                                                     Util_SkyWriter.New_Hirate(firstPside),
                                                                                                     0 // 初期局面は 0手目済み
                                                                                                     ))
                                                                             )
                                                                         ));
                        this.Owner_AimsServer.Model_Taikyoku.Kifu.SetProperty(Word_KifuTree.PropName_Startpos, "startpos");


                        ////
                        //// どちらが先手かにもよるが。
                        //// AIMS GUI が先手と仮定します。
                        ////
                        MessageBox.Show("将棋サーバー「AIMS GUI が先手と仮定し、\n" +
                                        "サーバーは WaitAimsBestmove フェーズに移るぜ☆\n" +
                                        "将棋エンジンには position    コマンド、\n" +
                                        "AIMS GUI  には position,go コマンドを送るぜ☆!」");
                        this.Owner_AimsServer.SetPhase_AimsServer(Phase_AimsServer._101_WaitAimsBestmove);

                        // 将棋エンジンに対して
                        // 例:「position startpos moves 7g7f」
                        ((EngineClient)this.Owner_EngineClient).ShogiEngineProcessWrapper.Send_Position(
                            Util_KirokuGakari.ToSfen_PositionCommand(this.Owner_AimsServer.Model_Taikyoku.Kifu)
                            );

                        // AIMS GUIに対して
                        // 例:「position startpos moves 7g7f」
                        Console.Out.WriteLine(Util_KirokuGakari.ToSfen_PositionCommand(this.Owner_AimsServer.Model_Taikyoku.Kifu));

                        Console.Out.WriteLine("go");
                    }
                }
                break;

                default:
                {
                    MessageBox.Show($"将棋サーバー「該当なしフェーズで、将棋エンジンから、[{line}]が返ってきたぜ☆!」");
                }
                break;
                }

                /*
                 * else if (line.StartsWith("info"))
                 * {
                 * }
                 * else if (line.StartsWith("bestmove resign"))
                 * {
                 * // 将棋エンジンが、投了されました。
                 * //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                 *
                 * //------------------------------------------------------------
                 * // あなたの負けです☆
                 * //------------------------------------------------------------
                 * ((EngineClient)this.Owner_EngineClient).ShogiEngineProcessWrapper.Send_Gameover_lose();
                 *
                 * //------------------------------------------------------------
                 * // 将棋エンジンを終了してください☆
                 * //------------------------------------------------------------
                 * ((EngineClient)this.Owner_EngineClient).ShogiEngineProcessWrapper.Send_Quit();
                 * }
                 * else if (line.StartsWith("bestmove"))
                 * {
                 * // 将棋エンジンが、手を指されました。
                 * //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                 *
                 * ((Server)((EngineClient)this.Owner_EngineClient).Owner_Server).SetInputString99(
                 *  ((Server)((EngineClient)this.Owner_EngineClient).Owner_Server).InputString99 + line.Substring("bestmove".Length + "".Length)
                 *  );
                 *
                 * OwataMinister.BY_GUI.Logger.WriteLineAddMemo($"USI受信:bestmove input99=[{((Server)((EngineClient)this.Owner_EngineClient).Owner_Server).InputString99}");
                 * }
                 */
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// ************************************************************************************************************************
        /// 入力欄の表示・出力欄の表示・再描画
        /// ************************************************************************************************************************
        ///
        /// このメインパネルに何かして欲しいことがあれば、
        /// RequestForMain に要望を入れて、この関数を呼び出してください。
        ///
        /// 同時には処理できない項目もあります。
        /// </summary>
        /// <param name="response"></param>
        public void Solute_RepaintRequest(
            Form1_Mutex mutex, MainGui_Csharp mainGui)
        {
            Uc_Form2Main form2 = ((Form1_Shogi)this.ParentForm).Form2_Console.Uc_Form2Main;

            //------------------------------------------------------------
            // 駒の座標再計算
            //------------------------------------------------------------
            if (mainGui.RepaintRequest.Is_StarlightsRecalculateRequested())
            {
                this.MainGui.Model_Manual.GuiSkyConst.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) =>
                {
                    Util_Function_Csharp.Redraw_KomaLocation(finger, this.MainGui);
                });
            }
            mainGui.RepaintRequest.Clear_StarlightsRecalculateRequested();


            //------------------------------
            // 入力欄の表示
            //------------------------------
            if (mainGui.RepaintRequest.IsRequested_RepaintNyuryokuText)
            {
                // 指定のテキストで上書きします。
                form2.SetInputareaText(mainGui.RepaintRequest.NyuryokuText);
            }
            else if (mainGui.RepaintRequest.IsRequested_NyuryokuTextTail)
            {
                // 指定のテキストを後ろに足します。
                form2.AppendInputareaText(mainGui.RepaintRequest.NyuryokuTextTail);
                mainGui.RepaintRequest.SetNyuryokuTextTail("");//要求の解除
            }

            //------------------------------
            // 出力欄(上・下段)の表示
            //------------------------------
            switch (mainGui.RepaintRequest.SyuturyokuRequest)
            {
            case RepaintRequestGedanTxt.Clear:
            {
                // 出力欄(上下段)を空っぽにします。
                form2.WriteLine_Syuturyoku("");

                // ログ
                //Logger.Trace( "");
                //Logger.Trace( "");
            }
            break;

            case RepaintRequestGedanTxt.Kifu:
            {
                // 出力欄(上下段)に、棋譜を出力します。
                switch (this.MainGui.SyuturyokuKirikae)
                {
                case SyuturyokuKirikae.Japanese:
                    form2.WriteLine_Syuturyoku(Util_KirokuGakari.ToJsaFugoListString(this.MainGui.Link_Server.Model_Taikyoku.Kifu, "Ui_PnlMain.Response"));
                    break;

                case SyuturyokuKirikae.Sfen:
                    form2.WriteLine_Syuturyoku(Util_KirokuGakari.ToSfen_PositionCommand(this.MainGui.Link_Server.Model_Taikyoku.Kifu));
                    break;

                case SyuturyokuKirikae.Html:
                    form2.WriteLine_Syuturyoku(Uc_Form1Main.CreateHtml(this.MainGui));
                    break;
                }

#if DEBUG
                // ログ
                Logger.Trace(form2.GetOutputareaText());
#endif
            }
            break;

            default:
                // スルー
                break;
            }

            //------------------------------
            // 再描画
            //------------------------------
            if (mainGui.RepaintRequest.IsRefreshRequested())
            {
                this.Refresh();

                mainGui.RepaintRequest.ClearRefreshRequest();
            }
        }
Exemplo n.º 4
0
 /// <summary>
 /// コンピューターの先手
 /// (2020-11-21 sat) virtual --> override.
 /// </summary>
 public override void Do_ComputerSente()
 {
     this.Link_Server.EngineClient.ShogiEngineProcessWrapper.Send_Position(
         Util_KirokuGakari.ToSfen_PositionCommand(this.Link_Server.Model_Taikyoku.Kifu));
     this.Link_Server.EngineClient.ShogiEngineProcessWrapper.Send_Go();
 }