// 基地航空隊の読み込み処理 private void LoadBasedAirUnit() { var ofd = new Microsoft.Win32.OpenFileDialog() { FileName = "bau_data.bau", Filter = "基地航空隊情報(*.bau)|*.bau|すべてのファイル(*.*)|*.*", Title = "読み込むのファイルを選択" }; if ((bool)ofd.ShowDialog()) { try { // ファイルを読み込み using (var sr = new System.IO.StreamReader(ofd.FileName)) { // テキストとして読み込んでパース string output = sr.ReadToEnd(); var bauData = new BasedAirUnitData(output); #region 基地航空隊の情報を初期化 for (int ui = 0; ui < 3; ++ui) { BasedAirUnitMode[ui].Value = 0; for (int wi = 0; wi < 4; ++wi) { BasedAirUnitIndex[ui][wi].Value = 0; BasedAirUnitMas[ui][wi].Value = 0; BasedAirUnitRf[ui][wi].Value = 0; } } #endregion // 基地航空隊の情報を書き込む for (int ui = 0; ui < bauData.Weapon.Count; ++ui) { // 出撃回数 int count = bauData.SallyCount[ui]; BasedAirUnitMode[ui].Value = count; // 装備情報 var weaponList = bauData.Weapon[ui]; for (int wi = 0; wi < weaponList.Count; ++wi) { var weapon = weaponList[wi]; BasedAirUnitIndex[ui][wi].Value = BasedAirUnitList.IndexOf($"{weapon.Name}:{weapon.AntiAir}:{weapon.BAURange}"); BasedAirUnitMas[ui][wi].Value = weapon.Mas; BasedAirUnitRf[ui][wi].Value = weapon.Rf; } } } } catch (Exception e) { Console.WriteLine(e.ToString()); MessageBox.Show("ファイルを開けませんでした", "AWSK"); } } }
// 基地航空隊のデータを取得 private BasedAirUnitData GetBasedAirUnitData() { // 作成 var basedAirUnitData = new BasedAirUnitData(); for (int ui = 0; ui < 3; ++ui) { // チェックを入れてない編成は無視する if (!BasedAirUnitFlg[ui].Value) { continue; } // var temp = new List <WeaponData>(); for (int wi = 0; wi < 4; ++wi) { // 「なし」が選択されている装備は無視する if (BasedAirUnitIndex[ui][wi].Value == 0) { continue; } // 装備名を取り出す string name = BasedAirUnitList[BasedAirUnitIndex[ui][wi].Value].Split(":".ToCharArray())[0]; // 装備名から装備情報を得る var weapon = DataStore.WeaponDataByName(name); weapon.Mas = BasedAirUnitMas[ui][wi].Value; weapon.Rf = BasedAirUnitRf[ui][wi].Value; weapon.Refresh(); temp.Add(weapon); } if (temp.Count > 0) { basedAirUnitData.Weapon.Add(temp); basedAirUnitData.SallyCount.Add(BasedAirUnitMode[ui].Value); } } return(basedAirUnitData); }
// 航空戦の基地航空隊におけるシミュレーションを行う public static void BasedAirUnitSimulation( BasedAirUnitData friend, FleetData enemy, int simulationCount, out Dictionary <int, double> finalAAV, out List <List <List <int> > > awsCount) { // 出力先を準備する finalAAV = new Dictionary <int, double>(); //最終的な制空値のデータ awsCount = new List <List <List <int> > >(); //制空状況をカウントする配列 for (int si = 0; si < friend.SallyCount.Count; ++si) { var temp1 = new List <List <int> >(); for (int ci = 0; ci < friend.SallyCount[si]; ++ci) { var temp2 = new List <int> { 0, 0, 0, 0, 0 }; temp1.Add(temp2); } awsCount.Add(temp1); } // テンポラリな変数を用意する var friendAntiAirValue = new List <int>(); //基地航空隊の制空値を記録した配列 for (int si = 0; si < friend.SallyCount.Count; ++si) { friendAntiAirValue.Add(CalcAntiAirValue(friend.Weapon[si], friend.GetSlotData()[si])); } // シミュレーションを行う for (int li = 0; li < simulationCount; ++li) { // 基地航空隊・敵艦隊のデータから、スロット毎の搭載数を読み取る var enemySlotData = enemy.GetSlotData(); // 指定した回数だけ基地航空隊をぶつける for (int si = 0; si < friend.SallyCount.Count; ++si) { for (int ci = 0; ci < friend.SallyCount[si]; ++ci) { // 敵艦隊の制空値を計算する int enemyAntiAirValue = CalcAntiAirValue(enemy, enemySlotData, true); // 制空状況を判断する var airWarStatus = JudgeAirWarStatus(friendAntiAirValue[si], enemyAntiAirValue); ++awsCount[si][ci][(int)airWarStatus]; // St1撃墜を行う LostEnemySlotBySt1(enemy, ref enemySlotData, airWarStatus); } } // 最終制空値を読み取る int aav = CalcAntiAirValue(enemy, enemySlotData, true); if (finalAAV.ContainsKey(aav)) { ++finalAAV[aav]; } else { finalAAV[aav] = 1; } } finalAAV = finalAAV.OrderBy((x) => x.Key).ToDictionary(pair => pair.Key, pair => pair.Value / simulationCount); }