Пример #1
0
 public JosekiKyokumen(string fen, Option <Phase> optionalPhase, Joseki owner)
 {
     this.Owner = owner;
     this.Fen   = fen;
     this.CurrentOptionalPhase = optionalPhase;
     this.SsItems = new Dictionary <Move, JosekiMove>();
 }
Пример #2
0
        /// <summary>
        /// 定跡を書き出すぜ☆(^▽^)
        /// </summary>
        public static void Flush_Joseki_1file(Joseki jo, string file, StringBuilder syuturyoku)
        {
            if (!File.Exists(file))
            {
                // 定跡ファイルが無ければ作成します。
                FileStream fs = File.Create(file);
                fs.Close(); // File.Create したあとは、必ず Close() しないと、ロックがかかったままになる☆(^▽^)
            }

            syuturyoku.Append(".");
            {
                var msg = syuturyoku.ToString();
                syuturyoku.Clear();
                Logger.Flush(msg);
            }

            // 定跡の文字列化☆
            string josekiStr = jo.ToString(Option_Application.Optionlist.USI);

            syuturyoku.Append(".");
            {
                var msg = syuturyoku.ToString();
                syuturyoku.Clear();
                Logger.Flush(msg);
            }

            // 容量を制限するぜ☆
            if (Joseki.Capacity < josekiStr.Length)
            {
                syuturyoku.AppendLine($"joseki removed ( ascii characters size ) = { jo.DownSizeing(josekiStr.Length - Joseki.Capacity)}");
                {
                    var msg = syuturyoku.ToString();
                    syuturyoku.Clear();
                    Logger.Flush(msg);
                }

                syuturyoku.Append(".");
                {
                    var msg = syuturyoku.ToString();
                    syuturyoku.Clear();
                    Logger.Flush(msg);
                }

                // もう1回取得☆
                josekiStr = jo.ToString(Option_Application.Optionlist.USI);
            }

            // 上書き☆
            System.IO.File.WriteAllText(file, josekiStr);
        }
Пример #3
0
 /// <summary>
 /// 分けたファイルを吸収するぜ☆www(^▽^)
 /// 重複したデータは、どちらを残すか自動的に判断するぜ☆(^▽^)
 /// </summary>
 public void Merge(Joseki joseki, StringBuilder syuturyoku)
 {
     foreach (KeyValuePair <ulong, JosekiKyokumen> joKy in joseki.KyItems)
     {
         foreach (KeyValuePair <Move, JosekiMove> joSs in joKy.Value.SsItems)
         {
             this.AddMove(
                 joKy.Value.Fen,
                 joKy.Key,
                 joKy.Value.CurrentOptionalPhase,
                 joSs.Key,
                 joSs.Value.Hyokati,
                 joSs.Value.Fukasa,
                 joSs.Value.Version,
                 syuturyoku
                 );
         }
     }
 }
Пример #4
0
        /// <summary>
        /// 定跡を読込むぜ☆(^▽^)
        /// </summary>
        public static void Load_Joseki(StringBuilder syuturyoku)
        {
            if (IsEnableBoardSize())
            {
                {
                    syuturyoku.Append("定跡ファイル読込中");
                    var msg = syuturyoku.ToString();
                    syuturyoku.Clear();
                    Logger.Flush(msg);
                }

                // まず、既存ファイル名を列挙するぜ☆(^▽^)
                string   filenamePattern = $"_auto_joseki{(Option_Application.Optionlist.SagareruHiyoko ? Logger.LocalRuleSagareruHiyoko : Logger.LocalRuleHonshogi)}*";
                string[] filepaths       = Directory.GetFiles(".", filenamePattern);

                // どんどんマージしていくぜ☆(^▽^)
                Option_Application.Joseki.Clear();
                for (int index = 0; index < filepaths.Length; index++)
                {
                    syuturyoku.Append(".");
                    // これが重たいのは仕方ないぜ☆(^~^)
                    {
                        var msg = syuturyoku.ToString();
                        syuturyoku.Clear();
                        Logger.Flush(msg);
                    }

                    Joseki jo = Util_Machine.Load_Joseki_1file(filepaths[index], syuturyoku);
                    if (null != jo)
                    {
                        Option_Application.Joseki.Merge(jo, syuturyoku);
                    }
                }

                syuturyoku.AppendLine("☆");
                {
                    var msg = syuturyoku.ToString();
                    syuturyoku.Clear();
                    Logger.Flush(msg);
                }
            }
        }
Пример #5
0
        /// <summary>
        /// ファイルの容量が大きくなったので、分割するぜ☆(^~^)
        /// 低速にはなるが、たくさん記憶するためのものだぜ☆
        /// </summary>
        /// <returns>分けた残りの定跡</returns>
        public void Bunkatu(out Joseki[] out_bunkatu, out string[] out_bunkatupartNames, StringBuilder syuturyoku)
        {
            out_bunkatupartNames = new string[] { "(P1)", "(P2)" };
            Joseki joP2 = new Joseki();

            // 削除するキー
            List <ulong> removeKeys = new List <ulong>();

            foreach (KeyValuePair <ulong, JosekiKyokumen> joKy in this.KyItems)
            {
                var(exists1, phase1) = joKy.Value.CurrentOptionalPhase.Match;
                if (exists1 && phase1 == Phase.White)
                {
                    removeKeys.Add(joKy.Key);

                    foreach (KeyValuePair <Move, JosekiMove> joSs in joKy.Value.SsItems)
                    {
                        joP2.AddMove(
                            joKy.Value.Fen,
                            joKy.Key,
                            joKy.Value.CurrentOptionalPhase,
                            joSs.Key,
                            joSs.Value.Hyokati,
                            joSs.Value.Fukasa,
                            joSs.Value.Version,
                            syuturyoku
                            );
                    }
                }
            }

            foreach (ulong key in removeKeys)
            {
                this.KyItems.Remove(key);
            }

            out_bunkatu = new Joseki[] { this,//[0]はthisにしろだぜ☆(^▽^)
                                         joP2 };
        }
Пример #6
0
        /// <summary>
        /// 定跡を読込むぜ☆(^▽^)
        /// </summary>
        public static Joseki Load_Joseki_1file(string filepath, StringBuilder syuturyoku)
        {
            Joseki jo = null;

            if (File.Exists(filepath))//定跡ファイルがある場合のみ、定跡を使うぜ☆(^▽^)
            {
                jo = new Joseki();
                jo.Parse(Option_Application.Optionlist.USI, System.IO.File.ReadAllLines(filepath), syuturyoku);

                //#if DEBUG
                //                // ロードした直後にダンプして中身を目視確認だぜ☆(^~^)
                //                Util_Machine.AppendLine(
                //                        $@"以下、定跡メモリのダンプ
                //┌──────────┐
                //{ Option_Application.Joseki.ToString()}
                //└──────────┘
                //");
                //                Logger.Flush();
                //#endif
            }

            return(jo);
        }
Пример #7
0
        static Option_Application()
        {
            Random     = new Random();
            Optionlist = new Optionlist();

            Kyokumen = new Kyokumen();
            Kyokumen.Init();
            Kyokumen.OnBanResized(Optionlist.BanYokoHaba, Optionlist.BanTateHaba);//盤のタテ、ヨコ幅が変わったら呼び出すこと。


            if (Optionlist.TranspositionTableTukau)
            {
                TranspositionTable = new TTable(900000);//300000
            }
            if (Optionlist.HanpukuSinkaTansakuTukau)
            {
                TimeManager = new TimeManager();
            }

            Joseki  = new Joseki();
            Seiseki = new Seiseki();
            Kifu    = new Kifu();
        }