public static void Main()
Enemy skeltal = new Enemy(65,180,210);
Weapon hammer = new Weapon(50, 75, 1.85, 0.5, 0.3);
Weapon axe = new Weapon(70,95,1.1,0.3,0.3);
Weapon mace = new Weapon(60,75,1.2,0.4,0.3);
Console.WriteLine(AverageHitsToKill(skeltal, hammer, 10000));
Console.WriteLine(AverageHitsToKill(skeltal, axe, 10000));
Console.WriteLine(AverageHitsToKill(skeltal, mace, 10000));
public static double AverageHitsToKill(Enemy e, Weapon w, int count)
for (int i = 0; i < count; i++)
public Weapon(int minDamage, int maxDamage, double armorDamage, double armorPenetrateDamage, double critChance)
this.minDamage = minDamage;
this.maxDamage = maxDamage;
this.armorDamage = armorDamage;
this.armorPenetrateDamage = armorPenetrateDamage;
this.critChance = critChance;
static Random r = new Random();
public double armorDamage;
public double armorPenetrateDamage;
public double critChance;
public bool TryToKill(Enemy e)
bool isCrit = r.NextDouble() < critChance;
Armor armor = isCrit ? e.headArmor : e.bodyArmor;
bool isArmorIntact = armor.IsIntact();
int finalArmorDamage = (int)(r.Next((int)(minDamage * armorDamage), (int)(maxDamage * armorDamage+1)));
double overkillPart = ((double)DamageArmorAndGetOverkill(armor, finalArmorDamage))/finalArmorDamage;
double finalPenetratePart = armorPenetrateDamage + (1 - armorPenetrateDamage) * overkillPart;
return TryToKillArmored(e, armor, finalPenetratePart);
return TryToKillUnarmored(e);
public int DamageArmorAndGetOverkill(Armor armor, int damage)
int overkill = -armor.current;
public bool TryToKillArmored(Enemy e, Armor a, double penetratePart)
int hpDamage = r.Next(minDamage, maxDamage+1);
int finalHpDamage = (int)(hpDamage * penetratePart) - a.current/10;
e.currentHP -= finalHpDamage;
public bool TryToKillUnarmored(Enemy e)
int hpDamage = r.Next(minDamage, maxDamage+1);
public Enemy(int maxHP, int headArmor, int bodyArmor)
this.headArmor = new Armor(headArmor);
this.bodyArmor = new Armor(bodyArmor);