// 基地航空隊の読み込み処理 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 BasedAirUnitGroup(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.BasedAirUnitList.Count; ++ui) { // 出撃回数 int count = bauData.BasedAirUnitList[ui].SallyCount; BasedAirUnitMode[ui].Value = count; // 装備情報 var weaponList = bauData.BasedAirUnitList[ui].WeaponList; for (int wi = 0; wi < weaponList.Count; ++wi) { var weapon = weaponList[wi]; BasedAirUnitIndex[ui][wi].Value = BasedAirUnitList.IndexOf($"{weapon.Name}:{weapon.AntiAir}:{weapon.BasedAirUnitRange}"); BasedAirUnitMas[ui][wi].Value = weapon.Mas; BasedAirUnitRf[ui][wi].Value = weapon.Rf; } } } } catch (Exception e) { Console.WriteLine(e.ToString()); MessageBox.Show("ファイルを開けませんでした", "AWSK"); } } }
// 基地航空隊のデータを取得 private BasedAirUnitGroup GetBasedAirUnitData() { // 作成 var basedAirUnitData = new BasedAirUnitGroup(); for (int ui = 0; ui < 3; ++ui) { // チェックを入れてない編成は無視する if (!BasedAirUnitFlg[ui].Value) { continue; } // var basedAirUnit = new BasedAirUnit(); 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 = dataBase.FindByWeaponName(name); if (weapon == null) { continue; } weapon.Mas = BasedAirUnitMas[ui][wi].Value; weapon.Rf = BasedAirUnitRf[ui][wi].Value; basedAirUnit.WeaponList.Add(weapon); } if (basedAirUnit.WeaponList.Count > 0) { basedAirUnit.SallyCount = BasedAirUnitMode[ui].Value; basedAirUnitData.BasedAirUnitList.Add(basedAirUnit); } } return(basedAirUnitData); }
/// <summary> /// 基地航空隊を敵艦隊にぶつけた際のシミュレーションを行う /// (シミュレーション対象:St1まで) /// </summary> /// <param name="friend">基地航空隊の情報</param> /// <param name="enemy">敵艦隊の情報</param> /// <param name="simulationCount">試行回数</param> /// <param name="finalAAV">敵の最終制空値を、制空値=>確率で表現したもの</param> /// <param name="awsCount">制空状況のカウント。[航空隊番号][攻撃回数][各制空状態]</param> public void BasedAirUnitSimulation( BasedAirUnitGroup friend, Fleet 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.BasedAirUnitList.Count; ++si) { var basedAirUnit = friend.BasedAirUnitList[si]; var temp1 = new List <List <int> >(); for (int ci = 0; ci < basedAirUnit.SallyCount; ++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.BasedAirUnitList.Count; ++si) { friendAntiAirValue.Add(CalcAntiAirValue(friend.BasedAirUnitList[si].WeaponList, friend.SlotList[si], true)); } // シミュレーションを行う for (int li = 0; li < simulationCount; ++li) { // 基地航空隊・敵艦隊のデータから、スロット毎の搭載数を読み取る var enemySlotData = enemy.SlotList; // 指定した回数だけ基地航空隊をぶつける for (int si = 0; si < friend.BasedAirUnitList.Count; ++si) { var basedAirUnit = friend.BasedAirUnitList[si]; for (int ci = 0; ci < basedAirUnit.SallyCount; ++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, false); if (finalAAV.ContainsKey(aav)) { ++finalAAV[aav]; } else { finalAAV[aav] = 1; } } // この段階では、finalAAVの値が「制空値=>それになった回数」となっており、また制空値でソートされていない。 // そこで、LINQを使って制空値キーでソートし、また「制空値=>それになった確率」と構築し直す finalAAV = finalAAV.OrderBy((x) => x.Key).ToDictionary(pair => pair.Key, pair => pair.Value / simulationCount); }