public JosekiKyokumen(string fen, Option <Phase> optionalPhase, Joseki owner) { this.Owner = owner; this.Fen = fen; this.CurrentOptionalPhase = optionalPhase; this.SsItems = new Dictionary <Move, JosekiMove>(); }
/// <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); }
/// <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 ); } } }
/// <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); } } }
/// <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 }; }
/// <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); }
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(); }