/// <summary> /// [コマ送り]ボタン /// /// vsコンピューター対局でも、タイマーによって[コマ送り]が実行されます。 /// /// </summary> public static bool Komaokuri_Srv( ref string inputLine, Model_Taikyoku model_Taikyoku, Model_Manual model_Manual , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { if ("" == inputLine) { goto gt_EndMethod; } bool toBreak = false; Util_Functions_Server.ReadLine_TuginoItteSusumu_Srv( ref inputLine, model_Taikyoku,//SetCurNodeがある。 model_Manual, out toBreak, "hint" ); gt_EndMethod: ; return(true); }
/// <summary> /// 「棋譜ツリーのカレントノード」の差替え、 /// および /// 「GUI用局面データ」との同期。 /// /// (1) 駒をつまんでいるときに、マウスの左ボタンを放したとき。 /// (2) 駒の移動先の升の上で、マウスの左ボタンを放したとき。 /// (3) 成る/成らないダイアログボックスが出たときに、マウスの左ボタンを押下したとき。 /// </summary> /// <param name="kifu"></param> /// <param name="newNode"></param> public static void SetCurNode_Srv( Model_Taikyoku model_Taikyoku,// Taikyokuの内容をManualへ移す。 Model_Manual model_Manual, Node <IMove, KyokumenWrapper> newNode, out string jsaFugoStr ) { Debug.Assert(null != newNode, "新規ノードがヌル。"); model_Taikyoku.Kifu.SetCurNode(newNode); model_Manual.SetGuiSky(newNode.Value.KyokumenConst); model_Manual.GuiTemezumi = model_Taikyoku.Kifu.CurNode.Value.KyokumenConst.Temezumi; model_Manual.GuiPside = model_Taikyoku.Kifu.CurNode.Value.KyokumenConst.KaisiPside; jsaFugoStr = ConvMoveStrJsa.ToMoveStrJsa(newNode); }
/// <summary> /// ************************************************************************************************************************ /// 1手進む /// ************************************************************************************************************************ /// /// <棋譜読込用><マウス入力非対応> /// /// 「棋譜並べモード」と「vsコンピューター対局」でも、これを使いますが、 /// 「棋譜並べモード」では送られてくる SFEN が「position startpos moves 8c8d」とフルであるのに対し、 /// 「vsコンピューター対局」では、送られてくる SFEN が「8c8d」だけです。 /// /// それにより、処理の流れが異なります。 /// /// </summary> public static bool ReadLine_TuginoItteSusumu_Srv( ref string inputLine, Model_Taikyoku model_Taikyoku,//SetCurNodeがある。[コマ送り][再生]などで使用。 Model_Manual model_Manual, out bool toBreak, string hint , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { //IErrorController logTag = OwataMinister.SERVER_KIFU_YOMITORI; bool successful = false; KifuParserA_Impl kifuParserA_Impl = new KifuParserA_Impl(); KifuParserA_Result result = new KifuParserA_ResultImpl(); KifuParserA_Genjo genjo = new KifuParserA_GenjoImpl(inputLine); try { if (kifuParserA_Impl.State is KifuParserA_StateA0_Document) { // 最初はここ #if DEBUG Logger.Trace("(^o^)... ..."); Logger.Trace($"サイショハココ☆ : {memberName}.{sourceFilePath}.{sourceLineNumber}"); #endif inputLine = kifuParserA_Impl.Execute_Step( ref result, model_Taikyoku, genjo ); Debug.Assert(result.Out_newNode_OrNull == null, "ここでノードに変化があるのはおかしい。"); if (genjo.IsBreak()) { goto gt_EndMethod; } // (1)position コマンドを処理しました。→startpos // (2)日本式棋譜で、何もしませんでした。→moves } if (kifuParserA_Impl.State is KifuParserA_StateA1_SfenPosition) { //------------------------------------------------------------ // このブロックでは「position ~ moves 」まで一気に(*1)を処理します。 //------------------------------------------------------------ // // *1…初期配置を作るということです。 // { #if DEBUG string message = $"(^o^)ツギハ ヒラテ マタハ シテイキョクメン ヲ ショリシタイ☆ inputLine=[{inputLine}]"; Logger.Trace(message); #endif inputLine = kifuParserA_Impl.Execute_Step( ref result, model_Taikyoku, genjo ); Debug.Assert(result.Out_newNode_OrNull == null, "ここでノードに変化があるのはおかしい。"); if (genjo.IsBreak()) { goto gt_EndMethod; } } { #if DEBUG Logger.Trace("(^o^)ツギハ ムーブス ヲ ショリシタイ☆"); #endif inputLine = kifuParserA_Impl.Execute_Step( ref result, model_Taikyoku, genjo ); Debug.Assert(result.Out_newNode_OrNull == null, "ここでノードに変化があるのはおかしい。"); if (genjo.IsBreak()) { goto gt_EndMethod; } // moves を処理しました。 // ここまでで、「position ~ moves 」といった記述が入力されていたとすれば、入力欄から削除済みです。 } // →moves } // // 対COMP戦で関係があるのはここです。 // if (kifuParserA_Impl.State is KifuParserA_StateA2_SfenMoves) { #if DEBUG Logger.Trace("ツギハ イッテ ショリシタイ☆"); #endif inputLine = kifuParserA_Impl.Execute_Step( ref result, model_Taikyoku, genjo ); if (null != result.Out_newNode_OrNull) { string jsaFugoStr; Util_Functions_Server.SetCurNode_Srv(model_Taikyoku, model_Manual, result.Out_newNode_OrNull, out jsaFugoStr); } if (genjo.IsBreak()) { goto gt_EndMethod; } // 1手を処理した☆? } if (null != genjo.StartposImporter_OrNull) { // 初期配置が平手でないとき。 // ************************************************************************************************************************ // SFENの初期配置の書き方(*1)を元に、駒を並べます。 // ************************************************************************************************************************ // // *1…「position startpos moves 7g7f 3c3d 2g2f」といった書き方。 // ParsedKyokumen parsedKyokumen = Conv_StartposImporter.ToParsedKyokumen( model_Manual, genjo.StartposImporter_OrNull,//指定されているはず。 genjo ); //------------------------------ // 駒の配置 //------------------------------ string jsaFugoStr; Util_Functions_Server.SetCurNode_Srv(model_Taikyoku, model_Manual, parsedKyokumen.KifuNode, out jsaFugoStr);// GUIに通知するだけ。 ////------------------------------ //// 駒を、駒袋から駒台に移動させます。 ////------------------------------ //model_Operating.Manual.SetGuiSky( // SkyConst.NewInstance( // parsedKyokumen.buffer_Sky, // -1//そのまま // ) //); } successful = true; } catch (Exception ex) { Util_Message.Show($"{ex}"); toBreak = true; successful = false; } gt_EndMethod: toBreak = genjo.IsBreak(); return(successful); }
/// <summary> /// 駒を動かします(1)。マウスボタンが押下されたとき。 /// /// 成る、成らない関連。 /// /// </summary> public static void Komamove1a_50Srv( out bool torareruKomaAri, out RO_Star koma_Food_after, IMoveHalf dst, Finger fig_btnTumandeiruKoma, RO_Star foodee_koma,//取られる対象の駒 Model_Manual model_Manual ) { Finger btnKoma_Food_Koma; // 取られることになる駒のボタン btnKoma_Food_Koma = Util_Sky_FingersQuery.InMasuNow(model_Manual.GuiSkyConst, foodee_koma.Masu).ToFirst(); if (Fingers.Error_1 == btnKoma_Food_Koma) { koma_Food_after = null; torareruKomaAri = false; btnKoma_Food_Koma = Fingers.Error_1; goto gt_EndBlock1; } else { //>>>>> 取る駒があったとき torareruKomaAri = true; } PieceType koma_Food_pre_Syurui = Util_Starlightable.AsKoma(model_Manual.GuiSkyConst.StarlightIndexOf(btnKoma_Food_Koma).Now).Komasyurui; // その駒は、駒置き場に移動させます。 SyElement akiMasu; switch (foodee_koma.Pside) { case Playerside.P2: akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, model_Manual.GuiSkyConst); if (!Masu_Honshogi.IsErrorBasho(akiMasu)) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P2, akiMasu, //駒台へ Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P2, Util_Masu10.OkibaSujiDanToMasu( Okiba.Gote_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; case Playerside.P1: //thru default: akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, model_Manual.GuiSkyConst); if (!Masu_Honshogi.IsErrorBasho(akiMasu)) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P1, akiMasu, //駒台へ Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P1, Util_Masu10.OkibaSujiDanToMasu( Okiba.Sente_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; } gt_EndBlock1: SkyConst sky2; if (btnKoma_Food_Koma != Fingers.Error_1) { //------------------------------ // 取られる駒があった場合 //------------------------------ sky2 = SkyConst.NewInstance_OverwriteOrAdd_Light( model_Manual.GuiSkyConst, -1, //そのまま // // 指した駒 // fig_btnTumandeiruKoma, dst, // // 取られた駒 // btnKoma_Food_Koma, new RO_Starlight( koma_Food_after ) ); } else { //------------------------------ // 取られる駒がなかった場合 //------------------------------ RO_Star movedKoma = Util_Starlightable.AsKoma(model_Manual.GuiSkyConst.StarlightIndexOf(fig_btnTumandeiruKoma).Now); sky2 = SkyConst.NewInstance_OverwriteOrAdd_Light( model_Manual.GuiSkyConst, -1, //そのまま // // 指した駒 // fig_btnTumandeiruKoma, dst, // // 手得計算 // movedKoma.Komasyurui, 0, movedKoma.Masu ); } model_Manual.SetGuiSky(sky2); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 棋譜は変更された。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ }
/// <summary> /// /// </summary> /// <param name="kifu"></param> /// <param name="restText"></param> /// <param name="startposImporter"></param> /// <param name="logTag"></param> public static ParsedKyokumen ToParsedKyokumen( Model_Manual model_Manual,// Gui局面を使用 StartposImporter startposImporter, KifuParserA_Genjo genjo ) { ParsedKyokumen parsedKyokumen = new ParsedKyokumenImpl(); //------------------------------ // 初期局面の先後 //------------------------------ if (startposImporter.RO_SfenStartpos.PsideIsBlack) { // 黒は先手。 parsedKyokumen.FirstPside = Playerside.P1; } else { // 白は後手。 parsedKyokumen.FirstPside = Playerside.P2; } //------------------------------ // 駒の配置 //------------------------------ parsedKyokumen.KifuNode = new KifuNodeImpl( Util_Sky258A.RootMove, //ルートなので new KyokumenWrapper( SkyConst.NewInstance( startposImporter.ToSky( parsedKyokumen.FirstPside, startposImporter.RO_SfenStartpos.Temezumi // FIXME: 将棋所だと常に 1 かも?? ), -1 // src_Sky_Newで設定済みだからそのまま。 ) ) ); //------------------------------ // 駒袋に表示されている駒を、駒台に表示されるように移します。 //------------------------------ { //------------------------------ // 持ち駒 ▲王 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1K) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.K, startposImporter.RO_SfenStartpos.Moti1K, Playerside.P1)); } //------------------------------ // 持ち駒 ▲飛 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1R) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.R, startposImporter.RO_SfenStartpos.Moti1R, Playerside.P1)); } //------------------------------ // 持ち駒 ▲角 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1B) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.B, startposImporter.RO_SfenStartpos.Moti1B, Playerside.P1)); } //------------------------------ // 持ち駒 ▲金 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1G) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.G, startposImporter.RO_SfenStartpos.Moti1G, Playerside.P1)); } //------------------------------ // 持ち駒 ▲銀 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1S) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.S, startposImporter.RO_SfenStartpos.Moti1S, Playerside.P1)); } //------------------------------ // 持ち駒 ▲桂 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1N) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.N, startposImporter.RO_SfenStartpos.Moti1N, Playerside.P1)); } //------------------------------ // 持ち駒 ▲香 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1L) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.L, startposImporter.RO_SfenStartpos.Moti1L, Playerside.P1)); } //------------------------------ // 持ち駒 ▲歩 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti1P) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.P, startposImporter.RO_SfenStartpos.Moti1P, Playerside.P1)); } //------------------------------ // 持ち駒 △王 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2k) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.K, startposImporter.RO_SfenStartpos.Moti2k, Playerside.P2)); } //------------------------------ // 持ち駒 △飛 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2r) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.R, startposImporter.RO_SfenStartpos.Moti2r, Playerside.P2)); } //------------------------------ // 持ち駒 △角 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2b) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.B, startposImporter.RO_SfenStartpos.Moti2b, Playerside.P2)); } //------------------------------ // 持ち駒 △金 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2g) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.G, startposImporter.RO_SfenStartpos.Moti2g, Playerside.P2)); } //------------------------------ // 持ち駒 △銀 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2s) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.S, startposImporter.RO_SfenStartpos.Moti2s, Playerside.P2)); } //------------------------------ // 持ち駒 △桂 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2n) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.N, startposImporter.RO_SfenStartpos.Moti2n, Playerside.P2)); } //------------------------------ // 持ち駒 △香 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2l) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.L, startposImporter.RO_SfenStartpos.Moti2l, Playerside.P2)); } //------------------------------ // 持ち駒 △歩 //------------------------------ if (0 < startposImporter.RO_SfenStartpos.Moti2p) { parsedKyokumen.MotiList.Add(new MotiItemImpl(PieceType.P, startposImporter.RO_SfenStartpos.Moti2p, Playerside.P2)); } } //------------------------------------------------------------------------------------------------------------------------ // 移動 //------------------------------------------------------------------------------------------------------------------------ for (int i = 0; i < parsedKyokumen.MotiList.Count; i++) { Playerside itaruPside; //(至)先後 Okiba itaruOkiba; //(至)置き場 if (Playerside.P2 == parsedKyokumen.MotiList[i].Playerside) { // 宛:後手駒台 itaruPside = Playerside.P2; itaruOkiba = Okiba.Gote_Komadai; } else { // 宛:先手駒台 itaruPside = Playerside.P1; itaruOkiba = Okiba.Sente_Komadai; } //------------------------------ // 駒を、駒袋から駒台に移動させます。 //------------------------------ { parsedKyokumen.buffer_Sky = new SkyBuffer(model_Manual.GuiSkyConst); Fingers komas = Util_Sky_FingersQuery.InOkibaKomasyuruiNow( SkyConst.NewInstance( // FIXME: SkyConstではなく、Skyではだめなのか☆? parsedKyokumen.buffer_Sky, -1 //そのまま。 ), Okiba.KomaBukuro, parsedKyokumen.MotiList[i].Komasyurui ); int moved = 1; foreach (Finger koma in komas.Items) { // 駒台の空いている枡 SyElement akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace( itaruOkiba, SkyConst.NewInstance( parsedKyokumen.buffer_Sky, -1//そのまま ) ); parsedKyokumen.buffer_Sky.PutOverwriteOrAdd_Starlight( koma, new RO_Starlight( new RO_Star( itaruPside, akiMasu, parsedKyokumen.MotiList[i].Komasyurui ) ) ); if (parsedKyokumen.MotiList[i].Maisu <= moved) { break; } moved++; } } }//for return(parsedKyokumen); }