public FightIssue Fight(Unit defender) { Unit attacker = this; int currentRound = 1; int minRound = 3; int maxRound = minRound + Math.Max(attacker.HealthPoints, defender.HealthPoints); int totalRound = randomizer.Next(minRound, maxRound); double baseChanceToLose = 0.5; while (currentRound <= totalRound && attacker.IsAlive() && defender.IsAlive()) { double realAttackAttacker = attacker.GetRealAttack(); double realDefenseDefender = defender.GetRealDefense(); double balanceOfPower; double chanceToLose; // Fighting random chance if (realAttackAttacker < realDefenseDefender) { balanceOfPower = 1 - (realAttackAttacker / realDefenseDefender); chanceToLose = baseChanceToLose * (1 + balanceOfPower); } else { balanceOfPower = 1 - (realDefenseDefender / realAttackAttacker); chanceToLose = baseChanceToLose * (1 - balanceOfPower); } double random = randomizer.NextDouble(); // Attacker lose one health point if (random < chanceToLose) { attacker.HealthPoints--; } // Defender lose one health point else { defender.HealthPoints--; } // Next round currentRound++; } // Before attacker died if (attacker.IsDead()) { attacker.BeforeDying(); } // Before defender died else if (defender.IsDead()) { defender.BeforeDying(); } // Check again, because, before dying, some unit may resurrected (e.g: the elf unit) // Attacker died => Lose if (attacker.IsDead()) { // After defender kills defender.AfterKill(); return FightIssue.Lose; } // Defender died => Win else if (defender.IsDead()) { // After attacker kills attacker.AfterKill(); return FightIssue.Win; } // No unit died => Draw else { return FightIssue.Draw; } }