public static Move Go(IPlaying playing, Kyokumen ky, out HyokatiUtiwake out_hyokatiUtiwake, Util_Tansaku.Dlgt_CreateJoho dlgt_CreateJoho, StringBuilder syuturyoku) { Move move = Util_Tansaku.Go(playing, Option_Application.Optionlist.USI, ky, out out_hyokatiUtiwake, out bool isJosekiTraced, dlgt_CreateJoho, syuturyoku); Util_ConsoleGame.IsJosekiTraced = isJosekiTraced; return(move); }
/// <summary> /// 次の入力を促す表示をしてるだけだぜ☆(^~^) /// </summary> public static void ShowPrompt(IPlaying playing, bool isSfen, Kyokumen ky, StringBuilder syuturyoku) { if (0 < Util_Commandline.CommandBuffer.Count) { // コマンド・バッファーの実行中だぜ☆(^▽^) syuturyoku.Append($"{Util_Commandline.CommandBufferName }> "); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); } else if (GameMode.Game == Util_Application.GameMode) { // 表示(コンソール・ゲーム用) 局面、あれば勝敗☆(^~^) { if (Util_Commandline.IsKyokumenEcho) { Util_Information.Setumei_NingenGameYo(ky, syuturyoku); #if DEBUG //Util_Commands.Ky(isSfen, "ky fen", ky, syuturyoku);// 参考:改造FEN表示 //Util_Commands.MoveCmd(isSfen, "move", ky, syuturyoku);// 参考:指し手表示 //if (false){ // Util_Information.HyojiKomanoIbasho(ky.Shogiban, syuturyoku);// 参考:駒の表示 // Util_Information.HyojiKomanoKikiSu(ky.Shogiban, syuturyoku);// 参考:利きの数 //} //Util_Commands.MoveCmd(isSfen, "move seisei", ky, syuturyoku);// 参考:指し手表示 詳細 //Logger.Flush(syuturyoku); #endif playing.Result(ky, syuturyoku, CommandMode.NingenYoConsoleGame); } Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); } var(exists, phase) = ky.CurrentOptionalPhase.Match; if (exists) { if ((phase == Phase.Black && !Option_Application.Optionlist.P1Com) || (phase == Phase.White && !Option_Application.Optionlist.P2Com) ) { // 人間の手番が始まるところで☆ syuturyoku.Append( @"指し手を入力してください。一例 do B3B2 ※ do b3b2 も同じ > "); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); } } } else { // 表示(コンソール・ゲーム用) syuturyoku.Append("> "); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); } }
/// <summary> /// 千日手のテストだぜ☆(^▽^) /// </summary> public static void SennitiTe(IPlaying playing, bool isSfen, Kyokumen ky, StringBuilder syuturyoku) { // 溜まっているログがあれば、吐き出させておくぜ☆(^~^) var msg = syuturyoku.ToString(); Logger.Flush(msg); syuturyoku.Clear(); CommandMode mode = CommandMode.NigenYoConsoleKaihatu; StringBuilder sippaiZenbu = new StringBuilder(); bool seikou = true;//成功☆ // 準備 int motonoJosekiPer = Option_Application.Optionlist.JosekiPer;// 定跡通り指すと千日手になることがあるので、切っておくぜ☆(/_\) Option_Application.Optionlist.JosekiPer = 0; double motonoNikomaHyokaKeisu = Option_Application.Optionlist.NikomaHyokaKeisu;// 2駒関係の評価値が付いているときは、テストケースの想定している評価値と異なり、結果が変わることがあるぜ☆(^~^) Option_Application.Optionlist.NikomaHyokaKeisu = 0.0d; long motonoSikoJikan = Option_Application.Optionlist.SikoJikan;// PCが重かったりして、1秒の思考時間じゃ足りないこともある☆??(^▽^) int motonoSikoJikanRandom = Option_Application.Optionlist.SikoJikanRandom; Option_Application.Optionlist.SikoJikan = 5000; // 5秒もあれば足りるだろ☆(^~^) Option_Application.Optionlist.SikoJikanRandom = 0; int motonoJohoJikan = Option_Application.Optionlist.JohoJikan; // 読み筋は全部出してしまおうぜ☆(^▽^) Option_Application.Optionlist.JohoJikan = 0; #region 千日手のテスト☆ // 千日手を判定するテストだぜ☆ きりんを上下しようぜ☆wwww(^▽^) { #region (01) 対局者1が千日手を認識するかのテストだぜ☆ //if(false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (01) 対局者1が千日手を認識するかのテストだぜ☆"); int fail = 0; ky.DoHirate(isSfen, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 1; // ログが出過ぎないように1手読みにするぜ☆ int count; playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 1; goto gt_EndUnittestSennitite1a; } //1回目 playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 2; goto gt_EndUnittestSennitite1a; } playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 3; goto gt_EndUnittestSennitite1a; } playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 4; goto gt_EndUnittestSennitite1a; } playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 5; goto gt_EndUnittestSennitite1a; } //2回目 playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 6; goto gt_EndUnittestSennitite1a; } playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 7; goto gt_EndUnittestSennitite1a; } playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 8; goto gt_EndUnittestSennitite1a; } playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT != count) { fail = 9; goto gt_EndUnittestSennitite1a; } //3回目 千日手☆(^▽^) gt_EndUnittestSennitite1a: Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa;//設定を元に戻しておくぜ☆ if (0 != fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine($"# 失敗(01): 対局者1に、千日手が見えなかったぜ☆(/_\) fail=[{fail}] count=[{count}]"); //goto gt_EndUnitTest; } } #endregion #region (02) 対局者2が千日手を認識するかのテストだぜ☆ //if (false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (02) 対局者2が千日手を認識するかのテストだぜ☆"); int fail = 0; ky.SetBanjo(isSfen, " ラゾ" +//キは持ち駒に☆ " ヒ " + " ひ " + "ぞらき", false, syuturyoku ); ky.MotiKomas.Clear().Set(MotiKoma.k, 1);//{ 0, 0, 0, 0, 1, 0 } ky.Tekiyo(true, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 1; // ログが出過ぎないように1手読みにするぜ☆ int count; playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 1; goto gt_EndUnittestSennitite1b; } // 同一局面から外れた手 playing.Do(isSfen, "do K*a2", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 2; goto gt_EndUnittestSennitite1b; } // 1回目(きりん打) playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 3; goto gt_EndUnittestSennitite1b; } playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 4; goto gt_EndUnittestSennitite1b; } playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 5; goto gt_EndUnittestSennitite1b; } playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 6; goto gt_EndUnittestSennitite1b; } // 2回目(きりん指し) playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 7; goto gt_EndUnittestSennitite1b; } playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 8; goto gt_EndUnittestSennitite1b; } playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = 9; goto gt_EndUnittestSennitite1b; } playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT != count) { fail = 10; goto gt_EndUnittestSennitite1b; } //3回目 千日手☆(^▽^) gt_EndUnittestSennitite1b: Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa;//設定を元に戻しておくぜ☆ if (0 != fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine($"# 失敗(02): 対局者2に、千日手が見えなかったぜ☆(/_\) fail=[{fail}] count=[{count}]"); //goto gt_EndUnitTest; } } #endregion #region (03)対局者1が、勝っているときは 千日手を回避するかのテストだぜ☆ //if (false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (03)対局者1が、勝っているときは 千日手を回避するかのテストだぜ☆"); bool fail = false; ky.SetBanjo(isSfen, "キラ " + // ゾは対局者1の持ち駒に☆ " " + // ヒは対局者1の持ち駒に☆ " ひ " + "ぞらき", false, syuturyoku ); ky.MotiKomas.Clear().Set(MotiKoma.Z, 1).Set(MotiKoma.H, 1);// = new int[] { 1, 0, 1, 0, 0, 0 }; ky.Tekiyo(true, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 1; // ログが出過ぎないように1手読みにするぜ☆ mojiretu1.AppendLine("# 1回目"); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); mojiretu1.AppendLine("# 2回目"); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); mojiretu1.AppendLine("# 次に千日手を回避するかだぜ☆(^▽^)"); playing.Go(isSfen, mode, ky, mojiretu1); int count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = true; goto gt_EndUnittestSennitite2a; } gt_EndUnittestSennitite2a: Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa;//設定を元に戻しておくぜ☆ if (fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine("# 失敗(03): 対局者1が、勝っているときに 千日手を回避しなかったぜ☆(/_\)"); //goto gt_EndUnitTest; } } #endregion #region (04)対局者2が、勝っているときは 千日手を回避するかのテストだぜ☆ //if (false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (04)対局者2が、勝っているときは 千日手を回避するかのテストだぜ☆"); bool fail = false; ky.SetBanjo(isSfen, " ラゾ" + //キ は対局者2の持ち駒に☆ " ヒ " + " " + //ひ は対局者2の持ち駒に☆ " らき" //ぞ は対局者2の持ち駒に☆ , false, syuturyoku); ky.MotiKomas.Clear().Set(MotiKoma.z, 1).Set(MotiKoma.k, 1).Set(MotiKoma.h, 1); // = new int[] { 0, 0, 0, 1, 1, 1 }; ky.Tekiyo(true, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 1; // ログが出過ぎないように1手読みにするぜ☆ mojiretu1.AppendLine("# 同一局面から外れた手"); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); mojiretu1.AppendLine("# 1回目(きりん打)"); playing.Do(isSfen, "do K*a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); mojiretu1.AppendLine("# 2回目(きりん指し)"); playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); mojiretu1.AppendLine("# 次に千日手を回避するか、指させるぜ☆(^▽^)ww"); playing.Go(isSfen, mode, ky, mojiretu1); int count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = true; goto gt_EndUnittestSennitite2b; } gt_EndUnittestSennitite2b: Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa;//設定を元に戻しておくぜ☆ if (fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine("# 失敗(04): 対局者2が、勝っているときに 千日手を回避しなかったぜ☆(/_\)"); //goto gt_EndUnitTest; } } #endregion #region (05)対局者1が、勝っているときは 千日手の権利を渡さないテストだぜ☆ //if (false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (05)対局者1が、勝っているときは 千日手の権利を渡さないテストだぜ☆"); bool fail = false; ky.SetBanjo(isSfen, "キラ " + // ゾは対局者1の持ち駒に☆ " " + // ヒは対局者1の持ち駒に☆ " ひ " + "ぞらき" , false, syuturyoku); ky.MotiKomas.Clear().Set(MotiKoma.Z, 1).Set(MotiKoma.H, 1);// = new int[] { 1, 0, 1, 0, 0, 0 }; ky.Tekiyo(true, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 1; // ログが出過ぎないように1手読みにするぜ☆ playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); //1回目 playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); //2回目 playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); // 次に千日手の権利を渡すのを回避するかだぜ☆(^▽^) playing.Go(isSfen, mode, ky, mojiretu1); int count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = true; goto gt_EndUnittestSennitite3a; } gt_EndUnittestSennitite3a: Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa;//設定を元に戻しておくぜ☆ if (fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine("# 失敗(05): 対局者1が、勝っているときに 千日手の権利を渡さないことをしなかったんだぜ☆(/_\)"); //goto gt_EndUnitTest; } } #endregion #region (06)対局者2が、勝っているときは 千日手の権利を渡さないテストだぜ☆ //if (false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (06)対局者2が、勝っているときは 千日手の権利を渡さないテストだぜ☆"); bool fail = false; ky.SetBanjo(isSfen, " ラゾ" + // キ は対局者2の持ち駒に☆ " ヒ " + " " + // ひ は対局者2の持ち駒に☆ " らき" // ぞ は対局者2の持ち駒に☆ , false, syuturyoku); ky.MotiKomas.Clear().Set(MotiKoma.z, 1).Set(MotiKoma.k, 1).Set(MotiKoma.h, 1); // = new int[] { 0, 0, 0, 1, 1, 1 }; ky.Tekiyo(true, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 1; // ログが出過ぎないように1手読みにするぜ☆ playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); // 同一局面から外れた手 playing.Do(isSfen, "do K*a2", ky, mode, mojiretu1); // 1回目(きりん打) playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); // 2回目(きりん指し) playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); // 次に千日手の権利を渡すのを回避するかだぜ☆(^▽^) playing.Go(isSfen, mode, ky, mojiretu1); int count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT == count) { fail = true; goto gt_EndUnittestSennitite3b; } gt_EndUnittestSennitite3b: Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa;//設定を元に戻しておくぜ☆ if (fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine("# 失敗(06): 対局者2が、勝っているときに 千日手の権利を渡さないことをしなかったんだぜ☆(/_\)"); //goto gt_EndUnitTest; } } #endregion #region (07)対局者1が、負けているときは 千日手を受け入れるテストだぜ☆ //if (false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (07)対局者1が、負けているときは 千日手を受け入れるテストだぜ☆"); bool fail = false; ky.SetBanjo(isSfen, "キラゾ" + " ヒ " + " " + // ひ は対局者2の持ち駒に☆ " らき" // ぞ は対局者2の持ち駒に☆ , false, syuturyoku); ky.MotiKomas.Clear().Set(MotiKoma.z, 1).Set(MotiKoma.h, 1); // = new int[] { 0, 0, 0, 1, 0, 1 }; ky.Tekiyo(true, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 1; // ログが出過ぎないように1手読みにするぜ☆ playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); //1回目 playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); //2回目 playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); // 次に千日手を受け入れるかだぜ☆(^▽^) playing.Go(isSfen, mode, ky, mojiretu1); Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa;//設定を元に戻しておくぜ☆ int count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT != count) { fail = true; goto gt_EndUnittestSennitite4a; } gt_EndUnittestSennitite4a: if (fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine("# 失敗(07): 対局者1が、負けているときに 千日手を受け入れなかったんだぜ☆(/_\)"); //goto gt_EndUnitTest; } } #endregion #region (08)対局者2が、負けているときは 千日手を受け入れるテストだぜ☆ //if (false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (08)対局者2が、負けているときは 千日手を受け入れるテストだぜ☆"); bool fail = false; ky.SetBanjo(isSfen, " ラ " + // キ は対局者2の持ち駒に☆ ゾ は対局者1の持ち駒に☆ " " + // ヒ は対局者1の持ち駒に☆ " ひ " + "ぞらき" , false, syuturyoku); ky.MotiKomas.Clear().Set(MotiKoma.Z, 1).Set(MotiKoma.H, 1).Set(MotiKoma.k, 1);// = new int[] { 1, 0, 1, 0, 1, 0 }; ky.Tekiyo(true, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 1; // ログが出過ぎないように1手読みにするぜ☆ mojiretu1.AppendLine("# 同一局面から外れた手"); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); mojiretu1.AppendLine("# 1回目(きりん打)"); playing.Do(isSfen, "do K*a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); mojiretu1.AppendLine("# 2回目(きりん指し)"); playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); mojiretu1.AppendLine("# 次に きりん を上げて、千日手を受け入れるかだぜ☆(^▽^)"); playing.MoveCmd(isSfen, "move seisei", ky, mojiretu1); playing.Go(isSfen, mode, ky, mojiretu1); Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa;//設定を元に戻しておくぜ☆ int count = ky.Konoteme.GetSennititeCount(); if (Const_Game.SENNITITE_COUNT != count) { fail = true; goto gt_EndUnittestSennitite4b; } gt_EndUnittestSennitite4b: if (fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine("# 失敗(08): 対局者2が、負けているときに 千日手を受け入れなかったんだぜ☆(/_\)"); //goto gt_EndUnitTest; } } #endregion #region (09)対局者2が、負けているときは 千日手の権利を相手に渡すテストだぜ☆ //if (false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (09)対局者2が、負けているときは 千日手の権利を相手に渡すテストだぜ☆"); bool fail = false; ky.SetBanjo(isSfen, "キラ " + // ゾは対局者1の持ち駒に☆ " " + // ヒは対局者1の持ち駒に☆ " ひ " + "ぞらき" , false, syuturyoku); ky.MotiKomas.Clear().Set(MotiKoma.Z, 1).Set(MotiKoma.H, 1);// = new int[] { 1, 0, 1, 0, 0, 0 }; ky.Tekiyo(true, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 2; // 相手に千日手の手番を回したいので、2手読み以上にする必要があるぜ☆(^▽^) mojiretu1.AppendLine("# 1回目"); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); mojiretu1.AppendLine("# 2回目"); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); mojiretu1.AppendLine("# ↓次の手に注目だぜ☆ 対局者2は きりん を引いて、千日手の権利を相手に渡すかだぜ☆(^▽^)"); playing.Go(isSfen, mode, ky, mojiretu1); // do a2a1 とやることを期待☆ Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa; //設定を元に戻しておくぜ☆ Kyokumen ky2 = new Kyokumen(); ky2.SetBanjo(isSfen, "キラ " + " " + " ひ " + "ぞらき", true, syuturyoku); int[] motikomas1 = { 1, 0, 1, 0, 0, 0, }; if (!ky.Equals(ky2.Shogiban, motikomas1)) { fail = true; } if (fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine("# 失敗(09): 対局者2が、負けているときに 千日手の権利を相手に渡さなかったんだぜ☆(/_\)"); //goto gt_EndUnitTest; } } #endregion #region (10)対局者1が、負けているときは 千日手の権利を相手に渡すテストだぜ☆ //if (false) { StringBuilder mojiretu1 = new StringBuilder(); mojiretu1.AppendLine("# (10)対局者1が、負けているときは 千日手の権利を相手に渡すテストだぜ☆"); bool fail = false; ky.SetBanjo(isSfen, " ラゾ" + // キ は対局者2の持ち駒に☆ " ヒ " + " " + // ひ は対局者2の持ち駒に☆ " らき" // ぞ は対局者2の持ち駒に☆ , false, syuturyoku); ky.MotiKomas.Clear().Set(MotiKoma.z, 1).Set(MotiKoma.k, 1).Set(MotiKoma.h, 1); // = new int[] { 0, 0, 0, 1, 1, 1 }; ky.Tekiyo(true, syuturyoku); int oldSaidaiFukasa = Option_Application.Optionlist.SaidaiFukasa; Option_Application.Optionlist.SaidaiFukasa = 2; // 相手に千日手の手番を回したいので、2手読み以上にする必要があるぜ☆(^▽^) mojiretu1.AppendLine("# 同一局面から外れた手"); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); mojiretu1.AppendLine("# 1回目(きりん打)"); playing.Do(isSfen, "do K*a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); playing.Do(isSfen, "do c4c3", ky, mode, mojiretu1); mojiretu1.AppendLine("# 2回目(きりん指し)"); playing.Do(isSfen, "do a1a2", ky, mode, mojiretu1); playing.Do(isSfen, "do c3c4", ky, mode, mojiretu1); playing.Do(isSfen, "do a2a1", ky, mode, mojiretu1); mojiretu1.AppendLine("# ↓次の手に注目だぜ☆ 対局者1は きりん を上げて、千日手の権利を相手に渡すかだぜ☆(^▽^)"); playing.Go(isSfen, mode, ky, mojiretu1); // do c4c3 とやることを期待☆ Option_Application.Optionlist.SaidaiFukasa = oldSaidaiFukasa; //設定を元に戻しておくぜ☆ Kyokumen ky2 = new Kyokumen(); ky2.SetBanjo(isSfen, "キラゾ" + " ヒ " + " き" + " ら ", true, syuturyoku); int[] motikomas1 = { 0, 0, 0, 1, 0, 1, }; if (!ky.Equals(ky2.Shogiban, motikomas1)) { fail = true; } if (fail) { if (seikou) { sippaiZenbu.Append(mojiretu1.ToString()); } seikou = false; sippaiZenbu.AppendLine("# 失敗(10): 対局者1が、負けているときに、千日手の権利を相手に渡さなかったんだぜ☆(/_\)"); //goto gt_EndUnitTest; } } #endregion } #endregion //gt_EndUnitTest: //; // 元に戻すぜ☆(^▽^) Option_Application.Optionlist.JosekiPer = motonoJosekiPer; Option_Application.Optionlist.NikomaHyokaKeisu = motonoNikomaHyokaKeisu; Option_Application.Optionlist.SikoJikan = motonoSikoJikan; Option_Application.Optionlist.SikoJikanRandom = motonoSikoJikanRandom; Option_Application.Optionlist.JohoJikan = motonoJohoJikan; if (seikou) { syuturyoku.AppendLine("ユニットテストの結果は、オール・オッケーだぜ☆(^▽^)"); } else { syuturyoku.Append(sippaiZenbu.ToString()); // 失敗した過程のログ☆ } var msg2 = syuturyoku.ToString(); Logger.Flush(msg2); syuturyoku.Clear(); }
/// <summary> /// 対局終了 /// </summary> public static void DoTejun5_SyuryoTaikyoku1(IPlaying playing, Kyokumen ky, StringBuilder syuturyoku) { // 表示(コンソール・ゲーム用) { playing.Result(ky, syuturyoku, CommandMode.NingenYoConsoleGame); syuturyoku.AppendLine("終わったぜ☆(^▽^)"); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); } Util_Application.Begin_SeisekiKosin(syuturyoku); // 決着から初期局面まで、逆順で戻しながら棋譜を記録するぜ☆(^▽^) Med_Kyokumen.TukuruKifu(Option_Application.Optionlist.USI, ky, syuturyoku); // 棋譜の初期局面を更新☆ { StringBuilder kyFen_temp = new StringBuilder(); ky.AppendFenTo(Option_Application.Optionlist.USI, kyFen_temp); Option_Application.Kifu.SyokiKyokumenFen = kyFen_temp.ToString(); } Util_Application.End_SeisekiKosin(syuturyoku); string kigoComment = ""; // TODO: 成績は保存しないにしても、棋譜は欲しいときもあるぜ☆(^~^) // 棋譜を作ろうぜ☆ syuturyoku.AppendLine($@"{kigoComment}感想戦を行う場合は kansosen と打てだぜ☆(^▽^) そのあと kifu 1 とか打て☆(^▽^) {kigoComment}終わるときは hirate な☆(^▽^)"); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); // 保存していないものを保存だぜ☆(^▽^) Util_Application.FlushAll1(syuturyoku); // 初期局面に戻すぜ☆(^▽^) Util_Taikyoku.Clear(); Util_Application.ResetHirate(Option_Application.Optionlist.USI, ky, syuturyoku); if (Option_Application.Optionlist.RandomStart) { playing.Ky(Option_Application.Optionlist.USI, "ky mazeru", ky, syuturyoku); } if (Option_Application.Optionlist.RandomStartTaikyokusya) { playing.Taikyokusya_cmd("taikyokusya mazeru", ky, syuturyoku); } if (Util_Machine.IsRenzokuTaikyokuStop()) { // 連続対局を止めるぜ☆(^▽^) Option_Application.Optionlist.RenzokuTaikyoku = false; syuturyoku.AppendLine($"{Logger.RenzokuTaikyokuStopFile }> done"); } if (!Option_Application.Optionlist.RenzokuTaikyoku) { // ゲームモードを解除するぜ☆(^~^) if (GameMode.Game == Util_Application.GameMode)// 感想戦での発動防止☆ { Util_Application.GameMode = GameMode.Karappo; } } else { // 連続対局中☆(^~^) if (Option_Application.Optionlist.RenzokuRandomRule && // 連続対局中、ルールをランダムに変える設定で 0 == Option_Application.Random.Next(2) && // ランダムに Util_Application.IsTimeOver_RenzokuRandomRule() // 変更間隔が空いているとき ) { // ルールを変えるぜ☆(^▽^) string commandline_2 = $"set SagareruHiyoko {!Option_Application.Optionlist.SagareruHiyoko}"; syuturyoku.AppendLine($"RenzokuRandomRule> {commandline_2}"); Logger.Flush(syuturyoku.ToString()); syuturyoku.Clear(); // 表示してから実行しようぜ☆(^~^) Util_Application.Set(commandline_2, ky, syuturyoku); Util_Application.Restart_RenzokuRandomRuleTimeSpan();// 変更間隔の再調整だぜ☆(^▽^) } } if (Option_Application.Optionlist.RandomCharacter) { // コンピューター対局者の性格は ころころ変えるぜ☆(^▽^) for (int iPhase = 0; iPhase < Conv_Taikyokusya.AllOptionalPhaseList.Length; iPhase++) { Option_Application.Optionlist.PNChar[iPhase] = AbstractConvMoveCharacter.Items[Option_Application.Random.Next(AbstractConvMoveCharacter.Items.Length)]; } } // コマンドの誤発動防止 Util_Commandline.CommentCommandline(); }