Exemple #1
0
        public int Update(object obj)
        {
            Kifu   kifu = (Kifu)obj;
            string sql  = "UPDATE Kifu SET Date=@date, GameName=@gameName, Event=@gameEvent WHERE KifuID=@id";

            SqlParameter[] parameters = new SqlParameter[4];
            parameters[0] = new SqlParameter("@id", kifu.KifuID);
            parameters[1] = new SqlParameter("@gameName", kifu.GameName);
            parameters[2] = new SqlParameter("@gameEvent", kifu.Event);
            parameters[3] = new SqlParameter("@date", kifu.Date.ToShortDateString());
            return(SqlHelper.ExecuteNonQuery(sql, parameters));
        }
        public static int NewKifu(string kifuContent, string username)
        {
            //insert general information
            string rule        = CommonService.GetContentInBracket(kifuContent, "RU");
            string size        = CommonService.GetContentInBracket(kifuContent, "SZ");
            string komi        = CommonService.GetContentInBracket(kifuContent, "KM");
            string gameName    = CommonService.GetContentInBracket(kifuContent, "GN");
            string gameEvent   = CommonService.GetContentInBracket(kifuContent, "EV");
            string whitePlayer = CommonService.GetContentInBracket(kifuContent, "PW");
            string blackPlayer = CommonService.GetContentInBracket(kifuContent, "PB");
            string blackLevel  = CommonService.GetContentInBracket(kifuContent, "BR");
            string whiteLevel  = CommonService.GetContentInBracket(kifuContent, "WR");
            string date        = CommonService.GetContentInBracket(kifuContent, "DT");

            if (date.Equals(""))
            {
                date = DateTime.Now.ToShortDateString();
            }
            string result = CommonService.GetContentInBracket(kifuContent, "RE");

            Kifu kifu = new Kifu(rule, Int32.Parse(size), float.Parse(komi), gameName, gameEvent,
                                 whitePlayer, blackPlayer, whiteLevel, blackLevel, DateTime.Parse(date), result, username);

            new KifuDAL().Insert(kifu);


            //insert kifu event
            string[]     kiEvent      = kifuContent.Split(';');
            ArrayList    steps        = new ArrayList();
            KifuEventDAL kifuEventDAL = new KifuEventDAL();

            for (int i = 2; i < kiEvent.Length; i++)
            {
                if (kiEvent[i].Contains("B") || kiEvent[i].Contains("W"))
                {
                    string    position  = CommonService.GetContentInBracket(kiEvent[i], "[BW]");
                    string    comment   = (kiEvent[i].Split('C').Length > 2) ? kiEvent[i].Split('C')[1] : "";
                    KifuEvent kifuEvent = new KifuEvent(position, comment);
                    kifuEventDAL.Insert(kifuEvent);
                    steps.Add(position);
                }
            }

            int kifuID = GetLastKifuID();

            IdentifyOpening(kifuID, steps, blackPlayer, whitePlayer);

            return(0);
        }
Exemple #3
0
        public int Insert(object obj)
        {
            Kifu kifu = (Kifu)obj;

            SqlParameter[] parameters = new SqlParameter[12];
            parameters[0]  = new SqlParameter("@rule", kifu.Rule);
            parameters[1]  = new SqlParameter("@size", kifu.Size);
            parameters[2]  = new SqlParameter("@komi", kifu.Komi);
            parameters[3]  = new SqlParameter("@gameName", kifu.GameName);
            parameters[4]  = new SqlParameter("@event", kifu.Event);
            parameters[5]  = new SqlParameter("@whitePlayer", kifu.WhitePlayer);
            parameters[6]  = new SqlParameter("@blackPlayer", kifu.BlackPlayer);
            parameters[7]  = new SqlParameter("@blackLevel", kifu.BlackLevel);
            parameters[8]  = new SqlParameter("@whiteLevel", kifu.WhiteLevel);
            parameters[9]  = new SqlParameter("@date", kifu.Date);
            parameters[10] = new SqlParameter("@result", kifu.Result);
            parameters[11] = new SqlParameter("@uploader", kifu.Uploader);

            string query = "INSERT INTO Kifu VALUES(@rule, @size, @komi, @gameName, @event, @whitePlayer, @blackPlayer"
                           + ", @whiteLevel, @blackLevel, @date, @result, @uploader)";

            return(SqlHelper.ExecuteNonQuery(query, parameters));
        }
Exemple #4
0
        /// <summary>
        /// ここからコンソール・アプリケーションが始まるぜ☆(^▽^)
        ///
        /// PCのコンソール画面のプログラムなんだぜ☆(^▽^)
        /// Unityでは中身は要らないぜ☆(^~^)
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            try
            {
                var engineConf = new EngineConf();
                EntitiesLayer.Implement(engineConf);

                var playing = new Playing(engineConf);

                /*
                 #if DEBUG
                 * // いろいろテスト☆
                 * System.Console.WriteLine("# デバッグ");
                 * System.Console.WriteLine($"# (1L<<31)=[{(1L << 31)}]");
                 * System.Console.WriteLine($"# (1L<<32)=[{(1L << 32)}]");
                 * System.Console.WriteLine($"# (1L<<33)=[{(1L << 33)}]");
                 * System.Console.WriteLine($"# (1L<<62)=[{(1L << 62)}]");
                 * System.Console.WriteLine($"# (1L<<63)=[{(1L << 63)}]");
                 * System.Console.WriteLine($"# (1L<<64)=[{(1L << 64)}]");
                 * System.Console.WriteLine($"# (1L<<65)=[{(1L << 65)}]");
                 * System.Console.WriteLine($"# (long.MinValue << 1)=[{(long.MinValue << 1)}]");
                 * System.Console.WriteLine($"# (~0UL)=[{(~0UL)}]");
                 * System.Console.WriteLine($"# (~0UL << 1)=[{(~0UL << 1)}]");
                 #endif
                 */


                //────────────────────────────────────────
                // (手順1)アプリケーション開始前に設定しろだぜ☆(^▽^)!
                //────────────────────────────────────────
                {
                    // アプリケーション開始後は Face_Kifuwarabe.Execute("set 名前 値") を使って設定してくれだぜ☆(^▽^)
                    // ↓コメントアウトしているところは、デフォルト値を使っている☆(^~^)

                    //Option_Application.Optionlist.AspirationFukasa = 7;
                    //Option_Application.Optionlist.AspirationWindow = Hyokati.Hyokati_SeiNoSu_Hiyoko;
                    //Option_Application.Optionlist.BetaCutPer = 100;
                    //Option_Application.Optionlist.HanpukuSinkaTansakuTukau = true;
                    //Option_Application.Optionlist.JohoJikan = 3000;

                    //──────────
                    // 定跡
                    //──────────
                    Option_Application.Optionlist.JosekiPer = 0;     // 定跡を利用する確率。0~100。
                    Option_Application.Optionlist.JosekiRec = false; // 定跡は記録しない
                                                                     //Option_Application.Optionlist.JosekiRec = true;// 定跡を記録する☆

                    //Option_Application.Optionlist.Learn = false;
                    //Option_Application.Optionlist.NikomaHyokaKeisu = 1.0d;
                    //Option_Application.Optionlist.NikomaGakusyuKeisu = 0.001d;// HYOKA_SCALEが 1.0d のとき、GAKUSYU_SCALE 0.00001d なら、小数点部を広く使って じっくりしている☆(^~^)
                    //Option_Application.Optionlist.P1Com = false;
                    Option_Application.Optionlist.P2Com = true;           //対局者2はコンピューター☆
                                                                          //Option_Application.Optionlist.PNChar = new SasiteCharacter[] { SasiteCharacter.HyokatiYusen, SasiteCharacter.HyokatiYusen };
                                                                          //Option_Application.Optionlist.PNName = new string[] { "対局者1", "対局者2" };
                                                                          //Option_Application.Optionlist.RandomCharacter = false;
                                                                          //Option_Application.Optionlist.RandomNikoma = false;
                                                                          //Option_Application.Optionlist.RandomStart = false;
                                                                          //Option_Application.Optionlist.RenzokuTaikyoku = false;
                    Option_Application.Optionlist.SagareruHiyoko = false; // さがれるひよこモード☆ アプリケーション開始後は Face_Kifuwarabe.Execute("set SagareruHiyoko true") コマンドを使って設定すること☆ #仲ルール
                    Option_Application.Optionlist.SaidaiFukasa   = 13;    // コンピューターの読みの最大深さ

                    //──────────
                    // 成績
                    //──────────
                    Option_Application.Optionlist.SeisekiRec = false; // 成績は記録しない
                                                                      //Option_Application.Optionlist.SeisekiRec = true;// 成績を記録する☆

                    //Option_Application.Optionlist.SennititeKaihi = false;

                    //──────────
                    // 思考時間
                    //──────────
                    Option_Application.Optionlist.SikoJikan       = 5000; // 500; // 最低でも用意されているコンピューターが思考する時間(ミリ秒)
                    Option_Application.Optionlist.SikoJikanRandom = 5000; // 1501;// 追加で増えるランダム時間の最大(この値未満)。 期待値を考えて設定しろだぜ☆(^~^)例: ( 500 + 1500 ) / 2 = 1000
                                                                          //Option_Application.Optionlist.TranspositionTableTukau = true;
                                                                          //Option_Application.Optionlist.UseTimeOver = true;
                }

                StringBuilder syuturyoku = Util_Machine.Syuturyoku;

                // (手順3)アプリケーション開始時設定 を終えた後に これを呼び出すこと☆(^~^)!
                Option_Application.TimeManager.Stopwatch_Savefile.Start();// 定跡ファイルの保存間隔の計測
                Option_Application.TimeManager.Stopwatch_RenzokuRandomRule.Start();

                // 平手初期局面を作るぜ☆(*^~^*)
                Option_Application.Kyokumen.DoHirate(Option_Application.Optionlist.USI, syuturyoku);

                Util_Machine.Assert_Sabun_Kiki("アプリケーション始30", Option_Application.Kyokumen.Sindan);

                /*
                 * Util_Application.LoadJoseki(syuturyoku);// 定跡ファイルの読込み
                 * Util_Application.LoadSeiseki(syuturyoku);// 成績ファイルの読込み
                 * Util_Application.LoadNikoma(syuturyoku);// 二駒関係ファイルの読込み
                 */

                // ゲームモード設定☆
                Util_Application.GameMode = GameMode.Karappo;

                // まず最初に「USI\n」が届くかどうかを判定☆(^~^)
                Util_ConsoleGame.ReadCommandline(syuturyoku);
                //string firstInput = Util_Machine.ReadLine();
                if (Util_Commandline.Commandline == "usi")
                {
                    Option_Application.Optionlist.USI = true;

                    var     engineName   = engineConf.GetEngine("Name");
                    Version version      = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                    var     engineAuthor = engineConf.GetEngine("Author");

                    playing.UsiOk($"{engineName} {version.Major}.{version.Minor}.{version.Build}", engineAuthor, syuturyoku);
                }
                else
                {
                    Util_ConsoleGame.WriteMessage_TitleGamen(syuturyoku);// とりあえず、タイトル画面表示☆(^~^)
                }

                // 空打ちで、ゲームモードに入るぜ☆(^▽^)
                var ky = Option_Application.Kyokumen;
                // このプログラムでは(A)コマンド・モード、(B)ゲーム・モード の2種類があるぜ☆
                // 最初は コマンド・モードになっている☆(^~^)
                //
                // ゲームモード
                //      (1)手番
                //              人間、コンピューターの設定が有効になり、
                //              人間の手番のときにしかコマンドが打てなくなるぜ☆
                //      (2)合法手
                //              指し手の合法手チェックを行うぜ☆
                //      (3)自動着手
                //              コンピューターは自分の手番で 指すぜ☆
                //      (4)決着
                //              決着すると ゲームモード を抜けるぜ☆ 連続対局設定の場合は抜けない☆(^▽^)
                //
                // コマンドモード
                //      (1)手番
                //              MAN vs MAN扱い
                //      (2)合法手
                //              チェックしない☆ ひよこをナナメに進めるのも、ワープするのも可能☆
                //      (3)自動着手
                //              しない☆
                //      (4)決着
                //              しない☆ [Enter]キーを空打ちすると、ゲームモードに変わるぜ☆(^▽^)

                for (; ;) //メインループ(無限ループ)
                {
                    //────────────────────────────────────────
                    // (手順2)ユーザー入力
                    //────────────────────────────────────────
                    Util_Commandline.InitCommandline();             // コマンド・ライン初期化☆
                    Util_Commandline.ReadCommandBuffer(syuturyoku); // コマンド・バッファー読取り☆

                    if (Util_Commandline.Commandline != null)
                    {
                        // コマンド・バッファーにコマンドラインが残っていたようなら、そのまま使うぜ☆(^▽^)
                    }
                    else if (
                        GameMode.Game == Util_Application.GameMode // ゲームモードの場合☆
                        &&
                        Util_Application.IsComputerNoBan(ky)       // コンピューターの番の場合☆
                        )
                    {
                        Util_Commandline.ClearCommandline(); // コマンドラインは消しておくぜ☆(^▽^)
                    }
                    else
                    {
                        Util_ConsoleGame.ReadCommandline(syuturyoku);// コンソールからのキー入力を受け取るぜ☆(^▽^)(コンソール・ゲーム用)
                    }

                    if (GameMode.Game == Util_Application.GameMode)
                    {
                        // 指す前の局面☆(定跡 登録用)
                        Util_ConsoleGame.Init_JosekiToroku(ky);

                        //────────────────────────────────────────
                        // (手順3)人間の手番
                        //────────────────────────────────────────
                        if (Util_Application.IsNingenNoBan(ky)) // 人間の手番
                        {
                            // ゲームモードでの人間の手番では、さらにコマンド解析

                            // ここで do コマンド(do b3b2 等)を先行して解析するぜ☆(^▽^)
                            if (Util_Commandline.Caret != Util_Commandline.Commandline.IndexOf("do ", Util_Commandline.Caret))
                            {
                                // do以外のコマンドであれば、コマンドラインを保持したまま、そのまま続行
                            }
                            // 以下、do コマンドの場合☆
                            else if (!Util_Application.ParseDoMove(ky, out Move inputSasite))
                            {
                                // do コマンドのパースエラー表示(コンソール・ゲーム用)☆(^~^)
                                syuturyoku.AppendLine(ConvMove.Setumei(MoveMatigaiRiyu.ParameterSyosikiMatigai));
                                var msg = syuturyoku.ToString();
                                syuturyoku.Clear();
                                Logger.Flush(msg);
                                Util_Commandline.CommentCommandline();                       // コマンドの誤発動防止
                            }
                            else if (!ky.CanDoMove(inputSasite, out MoveMatigaiRiyu reason)) // 指し手の合否チェック
                            {
                                // イリーガル・ムーブなどの、エラー理由表示☆(^~^)
                                syuturyoku.AppendLine(ConvMove.Setumei(reason));
                                var msg = syuturyoku.ToString();
                                syuturyoku.Clear();
                                Logger.Flush(msg);
                            }
                            else
                            {
                                // do コマンドを実行するぜ☆(^▽^)
                                // 1手指す☆!(^▽^)
                                Nanteme konoTeme = new Nanteme();// 使いまわさないだろう☆(^~^)ここで作ってしまおう☆
                                ky.DoMove(Option_Application.Optionlist.USI, inputSasite, MoveType.N00_Karappo, ref konoTeme, ky.CurrentOptionalPhase, syuturyoku);


                                Util_Application.JudgeKettyaku(inputSasite, ky);// 勝敗判定☆(^▽^)

                                // 局面出力
                                Util_Information.Setumei_NingenGameYo(ky, syuturyoku);
                                Util_ConsoleGame.Update1_JosekiToroku(inputSasite, ky, syuturyoku);// やるなら、定跡更新☆(^▽^)
                            }
                        }// 人間おわり☆(^▽^)

                        //────────────────────────────────────────
                        // (手順4)コンピューターの手番
                        //────────────────────────────────────────
                        else if (Util_Application.IsComputerNoBan(ky))                                                                                                        //コンピューターの番☆
                        {
                            Util_ConsoleGame.AppendMessage_ComputerSikochu(ky, syuturyoku);                                                                                   // 表示(コンピューター思考中☆)

                            Move bestSasite = Util_Application.Go(playing, ky, out HyokatiUtiwake best_hyokatiUTiwake, Face_YomisujiJoho.Dlgt_WriteYomisujiJoho, syuturyoku); // コンピューターに1手指させるぜ☆
                            Util_Application.JudgeKettyaku(bestSasite, ky);                                                                                                   // 勝敗判定☆(^▽^)

                            Util_ConsoleGame.Update2_JosekiToroku(bestSasite, best_hyokatiUTiwake.EdaBest, ky, syuturyoku);                                                   // やるなら、定跡更新☆(^▽^)
                            Util_ConsoleGame.ShowMessage_KettyakuJi(ky, syuturyoku);                                                                                          // 決着していた場合はメッセージ表示☆(^~^)
                        }// コンピューターの手番おわり☆(^~^)

                        //────────────────────────────────────────
                        // (手順5)決着時
                        //────────────────────────────────────────
                        if (Util_Application.IsKettyaku(ky))                                    // 決着が付いているなら☆
                        {
                            Util_Application.DoTejun5_SyuryoTaikyoku1(playing, ky, syuturyoku); // 対局終了時
                        }
                    }

                    //────────────────────────────────────────
                    // (手順6)ゲーム用の指し手以外のコマンドライン実行
                    //────────────────────────────────────────
                    string commandline = Util_Commandline.Commandline;
                    int    caret       = Util_Commandline.Caret;
                    Util_Commandline.IsQuit         = false;
                    Util_Commandline.IsKyokumenEcho = true; // ゲーム・モードの場合、特に指示がなければ コマンド終了後、局面表示を返すぜ☆
                    if (null == commandline)
                    {
                        // 未設定
                    }
                    else if (commandline == "")
                    {
                        // 空打ちは無視するか、からっぽモードでは、ゲームモードに切り替えるぜ☆(^▽^)
                        if (GameMode.Karappo == Util_Application.GameMode)// 感想戦での発動防止☆
                        {
                            // ゲームモード(対局開始)
                            Util_Application.GameMode = GameMode.Game;
                        }
                    }
                    // なるべく、アルファベット順☆(^▽^)同じつづりで始まる単語の場合、語句の長い単語を優先にしないと if 文が通らないぜ☆www
                    else if (caret == commandline.IndexOf("@", caret))
                    {
                        playing.Atmark(commandline);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("#", caret))
                    {
                        // 受け付けるが、何もしないぜ☆(^▽^)www
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("bitboard", caret))
                    {
                        // テスト用だぜ☆(^~^)
                        if (commandline == "bitboard")
                        {
                            // ビットボード表示☆

                            // 筋
                            {
                                for (int iSuji = 0; iSuji < Option_Application.Optionlist.BanYokoHaba; iSuji++)
                                {
                                    Util_Information.Setumei_1Bitboard($"筋{iSuji}", ky.BB_SujiArray[iSuji], syuturyoku);
                                }
                                syuturyoku.AppendLine();
                            }
                            // 段
                            {
                                for (int iDan = 0; iDan < Option_Application.Optionlist.BanTateHaba; iDan++)
                                {
                                    Util_Information.Setumei_1Bitboard($"段{iDan}", ky.BB_DanArray[iDan], syuturyoku);
                                }
                                syuturyoku.AppendLine();
                            }
                            // トライ
                            {
                                Util_Information.Setumei_Bitboards(new string[] { "対局者1", "対局者2(トライ)" },
                                                                   new Bitboard[] { ky.BB_Try[(int)Phase.Black], ky.BB_Try[(int)Phase.White] }, syuturyoku);
                                syuturyoku.AppendLine();
                            }

                            Util_Information.HyojiKomanoIbasho(ky.Shogiban, syuturyoku);                       // 駒の居場所☆
                            Util_Information.HyojiKomanoKikiSu(ky.Shogiban, syuturyoku);                       // 駒の重ね利き数☆
                            Util_Information.HyojiKomanoKiki(ky.Shogiban, syuturyoku);                         // 駒の利き☆
                            Util_Information.HyojiKomanoUgoki(ky.Shogiban, ky.Sindan.MASU_YOSOSU, syuturyoku); // 駒の動き☆
                            return;
                        }

                        // うしろに続く文字は☆(^▽^)
                        int caret2 = 0;
                        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret2, "bitboard ");

                        if (caret2 == commandline.IndexOf("kiki", caret2))
                        {
                            // 重ね利きビットボード表示☆

                            // 駒別
                            {
                                // 再計算
                                Shogiban saikeisan = new Shogiban(ky.Sindan);
                                saikeisan.Tukurinaosi_1_Clear_KikiKomabetu();
                                saikeisan.Tukurinaosi_2_Input_KikiKomabetu(ky.Sindan);
                                saikeisan.TukurinaosiBBKikiZenbu();

                                syuturyoku.AppendLine("利き:(再計算)全部、駒別");
                                Util_Information.HyojiKomanoKiki(saikeisan, syuturyoku);

                                // 現行
                                syuturyoku.AppendLine("利き:(現行)全部、駒別");
                                Util_Information.HyojiKomanoKiki(ky.Shogiban, syuturyoku);
                            }

                            // 全部
                            {
                                // 再計算
                                Shogiban saikeisan = new Shogiban(ky.Sindan);
                                saikeisan.TukurinaosiKikisuZenbu(ky.Shogiban, ky.Sindan);
                                saikeisan.TukurinaosiKikisuKomabetu(ky.Shogiban, ky.Sindan);

                                syuturyoku.AppendLine("利き数:(再計算)全部、駒別");
                                Util_Information.HyojiKomanoKikiSu(saikeisan, syuturyoku);

                                // 現行
                                syuturyoku.AppendLine("利き数:全部(現行)全部、駒別");
                                Util_Information.HyojiKomanoKikiSu(ky.Shogiban, syuturyoku);
                            }

                            return;
                        }
                        else if (caret2 == commandline.IndexOf("remake", caret2))
                        {
                            // 駒の動き方を作り直し
                            ky.Shogiban.Tukurinaosi_1_Clear_KomanoUgokikata(ky.Sindan.MASU_YOSOSU);
                            ky.Shogiban.Tukurinaosi_2_Input_KomanoUgokikata(ky.Sindan);
                        }

                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("cando", caret))
                    {
                        // GameMode.Game == Util_Application.GameMode ? CommandMode.NingenYoConsoleGame : CommandMode.NigenYoConsoleKaihatu,
                        // うしろに続く文字は☆(^▽^)
                        int caret2 = 0;
                        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret2, "cando ");

                        if (!Med_Parser.TryFenMove(Option_Application.Optionlist.USI, commandline, ref caret2, ky.Sindan, out Move ss))
                        {
                            throw new Exception($"パースエラー [{commandline}]");
                        }

                        if (ky.CanDoMove(ss, out MoveMatigaiRiyu riyu))
                        {
                            syuturyoku.AppendLine("cando, true");
                        }
                        else
                        {
                            syuturyoku.Append("cando, false, ");
                            syuturyoku.AppendLine(riyu.ToString());
                        }
                    }
                    else if (caret == commandline.IndexOf("clear", caret))
                    {
                        Util_Machine.Clear();
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("do", caret))
                    {
                        playing.Do(
                            Option_Application.Optionlist.USI,
                            commandline,
                            ky,
                            GameMode.Game == Util_Application.GameMode ? CommandMode.NingenYoConsoleGame : CommandMode.NigenYoConsoleKaihatu,
                            syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("gameover", caret))
                    {
                        playing.Gameover(commandline, ky, syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("go", caret))
                    {
                        var isSfen = Option_Application.Optionlist.USI;
                        var mode   = CommandMode.NigenYoConsoleKaihatu;
                        playing.Go(isSfen, mode, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("hash", caret))
                    {
                        playing.Hash(ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("hirate", caret))
                    {
                        playing.Hirate(Option_Application.Optionlist.USI, ky, syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("honyaku", caret))
                    {
                        playing.Honyaku(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("hyoka", caret))
                    {
                        playing.Hyoka(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("isready", caret))
                    {
                        playing.ReadyOk(syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("jam", caret))
                    {
                        playing.Jam(Option_Application.Optionlist.USI, ky, syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("jokyo", caret))
                    {
                        playing.Jokyo(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("joseki", caret))
                    {
                        playing.Joseki(Option_Application.Optionlist.USI, commandline, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("kansosen", caret))
                    {
                        // 駒の場所を表示するぜ☆(^▽^)
                        playing.Kansosen(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("kifu", caret))
                    {
                        // 駒の場所を表示するぜ☆(^▽^)
                        playing.Kifu(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("kikikazu", caret))
                    {
                        // 利きの数を調べるぜ☆(^▽^)
                        playing.KikiKazu(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("kiki", caret))
                    {
                        // 利きを調べるぜ☆(^▽^)
                        playing.Kiki(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("koma", caret))
                    {
                        // 駒の場所を表示するぜ☆(^▽^)
                        playing.Koma_cmd(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("ky", caret))
                    {
                        // 局面を表示するぜ☆(^▽^)
                        Util_Machine.Assert_Sabun_Kiki("飛び利き増やす1", ky.Sindan);
                        playing.Ky(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Machine.Assert_Sabun_Kiki("飛び利き増やす2", ky.Sindan);

                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("manual", caret))
                    {
                        // "man" と同じ☆(^▽^)
                        playing.Man(syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("man", caret))
                    {
                        // "manual" と同じ☆(^▽^)
                        playing.Man(syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("masu", caret))
                    {
                        playing.Masu_cmd(commandline, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("nikoma", caret))
                    {
                        playing.Nikoma(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("position", caret))
                    {
                        playing.Position();

                        // うしろに続く文字は☆(^▽^)
                        int caret2 = 0;
                        Util_String.YomuTangoTobasuMatubiKuhaku(commandline, ref caret2, out string token);

                        if ("position" == token)
                        {
                            // パース☆!(^▽^)
                            if (!ky.ParsePositionvalue(Option_Application.Optionlist.USI, commandline, ref caret2, true, false, out string moves, syuturyoku))
                            {
                                string msg = "パースに失敗だぜ☆(^~^)! #黒牛";
                                syuturyoku.AppendLine(msg);
                                var msg2 = syuturyoku.ToString();
                                syuturyoku.Clear();
                                Logger.Flush(msg2);
                                throw new Exception(msg);
                            }

                            // 棋譜を作成するぜ☆(^▽^)
                            Kifu kifu = new Kifu();

                            // 初期局面
                            {
                                StringBuilder mojiretu = new StringBuilder();
                                ky.AppendFenTo(Option_Application.Optionlist.USI, mojiretu);
                                kifu.SyokiKyokumenFen = mojiretu.ToString();
                            }

                            // うしろに続く文字は☆(^▽^)
                            Util_String.YomuTangoTobasuMatubiKuhaku(commandline, ref caret2, out token);
                            if ("" != moves)
                            {
                                // moves が続いていたら☆(^~^)

                                // 頭の moves を取り除くぜ☆(*^~^*)
                                moves = moves.Substring("moves ".Length);

                                kifu.AddMoves(Option_Application.Optionlist.USI, moves, ky.Sindan);

                                // positionで渡された最終局面まで進めようぜ☆(^▽^)www
                                kifu.GoToFinish(Option_Application.Optionlist.USI, ky, syuturyoku);
                            }

                            // 初回は「position startpos」しか送られてこない☆(^~^)
                        }
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("quit", caret))
                    {
                        playing.Quit();
                        Util_Commandline.IsQuit = true;
                    }
                    else if (caret == commandline.IndexOf("result", caret))
                    {
                        playing.Result(ky, syuturyoku, CommandMode.NigenYoConsoleKaihatu);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("rnd", caret))
                    {
                        playing.Rnd(ky, syuturyoku);
                    }
                    else if (caret == commandline.IndexOf("move", caret))
                    {
                        playing.MoveCmd(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("see", caret))
                    {
                        playing.See(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("seiseki", caret))
                    {
                        playing.Seiseki(Option_Application.Optionlist.USI, commandline, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("setoption", caret))
                    {
                        // // とりあえず無視☆(*^~^*)

                        // 「setoption name 名前 value 値」といった書式なので、
                        // 「set 名前 値」に変えたい。

                        // うしろに続く文字は☆(^▽^)
                        int caret2 = 0;
                        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret2, "setoption ");
                        Util_String.TobasuTangoToMatubiKuhaku(commandline, ref caret2, "name ");
                        int end = commandline.IndexOf("value ", caret2);
                        if (-1 != end)
                        {
                            StringBuilder sb = new StringBuilder();
                            sb.Append("set ");
                            sb.Append(commandline.Substring(caret2, end - caret2)); //名前
                            caret2 = end + "value ".Length;
                            sb.Append(commandline.Substring(caret2));               //値

                            playing.Set(sb.ToString(), ky, syuturyoku);
                        }

                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("set", caret))
                    {
                        playing.Set(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("taikyokusya", caret))
                    {
                        playing.Taikyokusya_cmd(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("test", caret))
                    {
                        playing.Test(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("tantaitest", caret))
                    {
                        playing.TantaiTest(playing, Option_Application.Optionlist.USI, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("tumeshogi", caret))
                    {
                        // "tu" と同じ☆(^▽^)
                        playing.TumeShogi(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("tu", caret))
                    {
                        // "tumeshogi" と同じ☆(^▽^)
                        playing.TumeShogi(Option_Application.Optionlist.USI, commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("undo", caret))
                    {
                        playing.Undo(commandline, ky, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("usinewgame", caret))
                    {
                        playing.UsiNewGame();
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else if (caret == commandline.IndexOf("usi", caret))
                    {
                        //ここは普通、来ない☆(^~^)
                        var     engineName   = engineConf.GetEngine("Name");
                        Version version      = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                        var     engineAuthor = engineConf.GetEngine("Author");

                        playing.UsiOk($"{engineName} {version.Major}.{version.Minor}.{version.Build}", engineAuthor, syuturyoku);
                        Util_Commandline.IsKyokumenEcho = false;
                    }
                    else
                    {
                        // 表示(コンソール・ゲーム用)
                        syuturyoku.Append("「");
                        syuturyoku.Append(commandline);
                        syuturyoku.AppendLine("」☆?(^▽^)");

                        syuturyoku.AppendLine("そんなコマンドは無いぜ☆(>_<) man で調べろだぜ☆(^▽^)");
                        var msg = syuturyoku.ToString();
                        syuturyoku.Clear();
                        Logger.Flush(msg);
                    }

                    if (Util_Commandline.IsQuit)
                    {
                        break;//goto gt_EndLoop1;
                    }

                    // 次の入力を促す表示をしてるだけだぜ☆(^~^)
                    Util_Commandline.ShowPrompt(playing, Option_Application.Optionlist.USI, ky, syuturyoku);
                }//無限ループ
                 //gt_EndLoop1:
                 //;

                // 開発モードでは、ユーザー入力を待機するぜ☆(^▽^)

                // (手順5)アプリケーション終了時に呼び出せだぜ☆(^▽^)!
                Face_Kifuwarabe.OnApplicationFinished(syuturyoku);
            }
            catch (Exception ex)
            {
                // エラーが起こりました。
                //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                // どうにもできないので  ログだけ取って無視します。
                Logger.Fatal($"(^ー^)「大外枠でキャッチ」:{ex}");
                Console.Out.WriteLine("bestmove resign");
                //throw;//追加
            }
        }
Exemple #5
0
 protected void btnSave_Click(object sender, EventArgs e)
 {
     Kifu kifu = new Kifu(KifuID, txtGameName.Text, txtGameEvent.Text, DateTime.Parse(txtGameDate.Text));
     int  res  = KifuService.UpdateGeneralInformation(kifu);
 }
 public static int UpdateGeneralInformation(Kifu kifu)
 {
     return(new KifuDAL().Update(kifu));
 }