Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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
            {
            }
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        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();
        }