/// <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: ; }
/// <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}"); * } */ } }
/// <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(); } }
/// <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(); }