/// <summary> /// Simulate a battle between two fleets /// </summary> /// <param name="attacker">fleet of attacker</param> /// <param name="defender">fleet of defender</param> /// <param name="retreatPoint">part of fleet, that should stay alive</param> /// <returns>true if attacker won, false otherwise</returns> public static bool ArrangeBattle(Fleet attacker, Fleet defender, double retreatPoint = 0.0) { Force attacker_force = CalcFleetStrength(attacker); Force defender_force = CalcFleetStrength(defender); double p = Math.Sqrt(attacker_force.power * defender_force.power); double r = Math.Sqrt(attacker_force.power / defender_force.power) * attacker_force.count / defender_force.count; double time = CalcBattleTime(p, r); int attacker_losses = attacker_force.count - (int)Math.Floor(CalcBattleResult(attacker_force.count, time, p, 1 / r)); int defenders_losses = defender_force.count - (int)Math.Floor(CalcBattleResult(defender_force.count, time, p, r)); if (r > 1.0) { CalcFleetLosses(attacker, attacker_losses); defender.RemoveAll(); return(true); } else { attacker.RemoveAll(); CalcFleetLosses(defender, defenders_losses); return(false); } }
public void Merge(Fleet other) { foreach (var i in other.Ships) { if (Ships.ContainsKey(i.Key)) { Ships[i.Key] += i.Value; } else { Ships.Add(i.Key, i.Value); } } other.RemoveAll(); }