public SeisekiKyokumen(string fen, Option <Phase> optionalPhase, Seiseki owner) { this.Owner = owner; this.Fen = fen; this.CurrentOptionalPhase = optionalPhase; this.SsItems = new Dictionary <Move, SeisekiMove>(); }
/// <summary> /// 成績を読込むぜ☆(^▽^) /// </summary> public static Seiseki Load_Seiseki_1file(string filepath, StringBuilder syuturyoku) { Seiseki se = null; if (File.Exists(filepath))//定跡ファイルがある場合のみ、定跡を使うぜ☆(^▽^) { se = new Seiseki(); se.Parse(Option_Application.Optionlist.USI, System.IO.File.ReadAllLines(filepath), syuturyoku); } return(se); }
/// <summary> /// 成績を書き出すぜ☆(^▽^) /// </summary> public static void Flush_Seiseki_1file(Seiseki se, 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 seisekiStr = se.ToContents_NotUnity(Option_Application.Optionlist.USI); syuturyoku.Append("."); { var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); } // 容量を制限するぜ☆ if (Seiseki.Capacity < seisekiStr.Length) { syuturyoku.AppendLine($"seiseki removed bytes = { se.DownSizeing(seisekiStr.Length - Seiseki.Capacity)}"); syuturyoku.Append("."); { var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); } // もう1回取得☆ seisekiStr = se.ToContents_NotUnity(Option_Application.Optionlist.USI); } // 上書き☆ System.IO.File.WriteAllText(file, seisekiStr); }
/// <summary> /// 分けたファイルを吸収するぜ☆www(^▽^) /// 重複したデータは、どちらを残すか自動的に判断するぜ☆(^▽^) /// </summary> public void Merge(Seiseki seiseki) { foreach (KeyValuePair <ulong, SeisekiKyokumen> seKy in seiseki.KyItems) { foreach (KeyValuePair <Move, SeisekiMove> seSs in seKy.Value.SsItems) { this.AddMove( seKy.Value.Fen, seKy.Key, seKy.Value.CurrentOptionalPhase, seSs.Key, seSs.Value.Version, seSs.Value.Kati, seSs.Value.Hikiwake, seSs.Value.Make ); } } }
/// <summary> /// 成績を読込むぜ☆(^▽^) /// </summary> public static void Load_Seiseki(StringBuilder syuturyoku) { if (IsEnableBoardSize()) { syuturyoku.Append("成績ファイル読込中"); { var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); } // まず、既存ファイル名を列挙するぜ☆(^▽^) string filenamePattern = $"_auto_seiseki{ (Option_Application.Optionlist.SagareruHiyoko ? Logger.LocalRuleSagareruHiyoko : Logger.LocalRuleHonshogi)}*"; string[] filepaths = Directory.GetFiles(".", filenamePattern); // どんどんマージしていくぜ☆(^▽^) Option_Application.Seiseki.Clear(); for (int index = 0; index < filepaths.Length; index++) { syuturyoku.Append("."); { var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); } Seiseki se = Util_Machine.Load_Seiseki_1file(filepaths[index], syuturyoku); if (null != se) { Option_Application.Seiseki.Merge(se); } } syuturyoku.AppendLine("☆"); { var msg = syuturyoku.ToString(); syuturyoku.Clear(); Logger.Flush(msg); } } }
/// <summary> /// ファイルの容量が大きくなったので、分割するぜ☆(^~^) /// 低速にはなるが、たくさん記憶するためのものだぜ☆ /// </summary> /// <returns>分けた残りの定跡</returns> public void Bunkatu(out Seiseki[] out_bunkatu, out string[] out_bunkatupartNames) { out_bunkatupartNames = new string[] { "(P1)", "(P2)" }; Seiseki seP2 = new Seiseki(); // 削除するキー List <ulong> removeKeys = new List <ulong>(); foreach (KeyValuePair <ulong, SeisekiKyokumen> seKy in this.KyItems) { var(exists1, phase1) = seKy.Value.CurrentOptionalPhase.Match; if (exists1 && phase1 == Phase.White) { removeKeys.Add(seKy.Key); foreach (KeyValuePair <Move, SeisekiMove> seSs in seKy.Value.SsItems) { seP2.AddMove( seKy.Value.Fen, seKy.Key, seKy.Value.CurrentOptionalPhase, seSs.Key, seSs.Value.Version, seSs.Value.Kati, seSs.Value.Hikiwake, seSs.Value.Make ); } } } foreach (ulong key in removeKeys) { this.KyItems.Remove(key); } out_bunkatu = new Seiseki[] { this,//[0]はthisにしろだぜ☆(^▽^) seP2 }; }
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(); }