Beispiel #1
0
        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);
        }
Beispiel #2
0
        /// <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();
            }
        }
Beispiel #3
0
        /// <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();
        }
Beispiel #4
0
        /// <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();
        }