/// <summary> /// /// </summary> /// <param name="no1"></param> /// <param name="b"></param> /// <returns></returns> private static bool Compare(IntegrationDto no1, IntegrationDto b, bool cost_cut) { double aval = 0; double bval = 0; if (!cost_cut) { if (no1.Cost != 0) { aval = ((double)no1.Atack * (double)no1.HitPoint) / (double)no1.Cost; } if (b.Cost != 0) { bval = ((double)b.Atack * (double)b.HitPoint) / (double)b.Cost; } return(aval < bval); } else { if (no1.Cost != 0) { aval = ((double)no1.Atack * (double)no1.HitPoint); } if (b.Cost != 0) { bval = ((double)b.Atack * (double)b.HitPoint); } return(aval < bval); } }
/// <summary> /// /// </summary> /// <param name="data"></param> /// <param name="sections"></param> /// <param name="m"></param> /// <returns></returns> private static MillionConfig GetMillionConfig(IntegrationDto data, List <KnightSection> sections, int m) { MillionConfig config = LoadMillionConfig(); Strongest strongest = GetBeforeNo1(config, m); strongest.Attack = data.Atack; strongest.Hitpoint = data.HitPoint; strongest.Cost = data.Cost; strongest.Knights = new string[sections.Count()]; for (int i = 0; i < sections.Count(); i++) { strongest.Knights[i] = sections[i].KnightName; } strongest.ComboList = new string[data.Combo.Count()]; for (int i = 0; i < data.Combo.Count(); i++) { strongest.ComboList[i] = data.Combo[i].Name; } return(config); }
/// <summary> /// /// </summary> /// <param name="config"></param> public static void SaveXmlConfig(IntegrationDto data, List <KnightSection> sections, int m) { try { MillionConfig config = GetMillionConfig(data, sections, m); XmlSerializer objXmlSerializer; using (FileStream objfs = new FileStream("MillionConfig.xml", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)) { //シリアル化し、XMLファイルに保存する objXmlSerializer = new XmlSerializer(typeof(MillionConfig)); objXmlSerializer.Serialize(objfs, config); //設定ファイルクローズ objfs.Close(); } } catch { } }
/// <summary> /// /// </summary> /// <param name="m"></param> /// <returns></returns> public static IntegrationDto GetBeforeNo1(int m) { MillionConfig config = LoadMillionConfig(); Strongest strongest = GetBeforeNo1(config, m); IntegrationDto dto = new IntegrationDto(); dto.Atack = strongest.Attack; dto.Cost = strongest.Cost; if (dto.Cost == 0) { dto.Cost = 999; } dto.HitPoint = strongest.Hitpoint; dto.Combo = new List <ComboDto>(); foreach (string val in strongest.ComboList) { ComboDto data = new ComboDto(); data.Name = val; dto.Combo.Add(data); } return(dto); }
static void Main(string[] args) { int m = 3; bool first = false; bool cost_cut = false; bool million = false; // モード決定 if (args.Count() > 0) { int.TryParse(args[0], out m); } if (args.Count() > 1) { if (args[1] == "first") { first = true; } } if (args.Count() > 2) { if (args[2] == "cost_cut") { cost_cut = true; } if (args[2] == "million") { million = true; m -= 3; } } // 前回結果が無ければ作成 FileUtility.InitializeBeforeFile(); DateTime start = DateTime.Now; // Iniファイルを読み込む List <KnightSection> readDataSet = FileUtility.GetSectionData(System.IO.Directory.GetCurrentDirectory(), m); //TODO 機動時パラメータから差分騎士を把握 //List<KnightSection> difference = GetDifferenceKnight(readDataSet,args); // 昇順ソート&1000万以下間引き処理 List <KnightSection> array = GetN(readDataSet, m); // 組み合わせの作成 List <IList <KnightSection> > combi; if (first) { combi = new Combinations <KnightSection>(array, m).GetCombinations(); } else { // 差分騎士の把握② List <string> difference = FileUtility.LoadDifferenceKnight(readDataSet, m); Console.WriteLine("差分騎士の羅列"); foreach (string name in difference) { Console.WriteLine(name); } Console.WriteLine(); int[] result = MabikiIndex(array, difference); combi = new MabikiCombinations <KnightSection>(array, m, result).GetCombinations(); } // 全組み合わせにアーサーsを加える if (million) { int i = 0; int combi_count = combi.Count(); List <KnightSection> arther = new List <KnightSection>(); arther.AddRange(readDataSet.Where(s => s.KnightName == "アーサー -剣術の城")); arther.AddRange(readDataSet.Where(s => s.KnightName == "アーサー -技巧の場")); arther.AddRange(readDataSet.Where(s => s.KnightName == "アーサー -魔法の派")); for (i = 0; i < combi_count; i++) { List <KnightSection> a = combi[i].ToList(); a.Add(arther[0]); a.Add(arther[1]); a.Add(arther[2]); combi[i] = a; } } // 前回最強結果の取得 IntegrationDto no1 = FileUtility.GetBeforeNo1(m); List <KnightSection> no1Sections = FileUtility.GetBeforeNo1Section(m); IntegrationLogic logic = new IntegrationLogic(); for (int i = 0; i < combi.Count(); i++) { logic.Calclation(combi[i].ToList()); //if ((no1.Atack + no1.HitPoint) / no1.Cost < (logic.IntegrationDto.Atack + logic.IntegrationDto.HitPoint) / logic.IntegrationDto.Cost) if (Compare(no1, logic.IntegrationDto, cost_cut)) { no1.HitPoint = logic.IntegrationDto.HitPoint; no1.Atack = logic.IntegrationDto.Atack; no1.Combo = new List <ComboDto>(logic.IntegrationDto.Combo); no1.Cost = logic.IntegrationDto.Cost; no1Sections = combi[i].ToList(); } } foreach (KnightSection section in no1Sections) { Console.WriteLine(section.KnightName); } foreach (ComboDto section in no1.Combo) { Console.WriteLine(section.Name); } Console.WriteLine((((double)no1.Atack * (double)no1.HitPoint) / (double)no1.Cost).ToString()); TimeSpan delta = DateTime.Now - start; Console.WriteLine("総配列数:" + combi.Count().ToString()); Console.WriteLine("使用時間:" + delta.TotalSeconds.ToString()); // アプリ終了前操作 // 現在のSECTION、INIファイルを別名保存する FileUtility.SaveBeforeFile(m); FileUtility.SaveXmlConfig(no1, no1Sections, m); Console.ReadKey(); }