109K vs 190D9 Monte Carlo Study

PC : Turn based WW2 goodness in the mold of Panzer General. This promises to be a true classic!

Moderators: Slitherine Core, Panzer Corps Moderators, Panzer Corps Design

Post Reply
proline
2nd Lieutenant - Elite Panzer IVF/2
2nd Lieutenant - Elite Panzer IVF/2
Posts: 703
Joined: Sun Jul 27, 2014 12:03 am

109K vs 190D9 Monte Carlo Study

Post by proline »

Background

There has been previous discussion about the relative merits of the Bf 109K vs the Fw 190 viewtopic.php?f=121&t=62625. The former has the advantage of being a cheap upgrade from earlier Bf 109 variants and an initiative of 13, whereas the latter has an initiative of only 11 but an air attack of 20 or 22 for the D9 model. I have undertaken to try to answer the question of which aircraft is better via science.

Methods

I have written a PzC combat simulator using Apple’s Swift programming language that fully implements all aspects of the combat equation described by this thread viewtopic.php?f=121&t=62845&hilit=combat+equation (thanks so much to ThvN!) including initiative modifiers for experience, mass attack, and the random modifier as well as attack and defense modifiers. This has allowed me to apply Monte Carlo methods to this problem.

Specifically, I simulated combat between either a 109K or a 190D9 (since the D9 comes out only a month after the 109K) and a variety of enemy aircraft. In the simulations, I simulated two 10 strength attackers next to the enemy aircraft attacking it in succession, such that the first one gets a +1 initiative mass attack bonus. If the enemy survived these two attacks, I simulated additional attacks from 10 strength attackers until the enemy was destroyed. This is how I destroy enemy aircraft in the game, and I think it is a reasonable approach for attacking fighters. By placing two aircraft adjacent to the enemy, I am able to gain a mass attack advantage. Placing more than two aircraft adjacent would run the risk of the enemy being destroyed before the third can attack, thus wasting a turn for the third aircraft. Obviously for bombers which have very little initiative, the mass attack factor doesn’t matter as much. Unless otherwise indicated, the attackers have 5 stars of experience- after all we’re talking about 1944 and 1945 here.

My end points were the number of 10 strength attacks required to kill the enemy as well as the amount of damage taken by the attackers as measured by the prestige point value of any damage taken during the attacks. I ran the simulations repeatedly until the standard deviation of the mean number of hits to kill was known to withing 0.01. I ran all simulations at least 100 times minimum- for some cases several thousand simulations were performed.

Validation

I calculated the mean damage done against a variety of attackers and found that in all cases my simulator perfectly reproduced the predicted losses from the in-game loss predictor.

Results and Discussion


Image

As you can see in the first simulation, it matters little whether you use 109s or 190s to kill Pe-8s. The 190 comes out ahead killing them slightly faster and taking slightly fewer losses, though the difference is trivial. Overall the Pe-8 is a weak plane that dies easily to all comers.

Image

Now its starting to get more interesting. Against the heavily armored Shturmovik, we can see a big difference between the 109 and the 190. The 190 can kill a 13 strength Shturmovik in 2.2 shots, vs. 2.9 for the 109. That means two 190s can kill almost as many Shturmoviks as three 109s, and will take less damage as well. That means that the Shturmoviks will get a lot fewer costly hits on your mech if you use 190s.

Image

Now things get more interesting still. Against a good Russian fighter, the 190 kill the enemy quite a bit faster than the 109, but also takes more losses. It costs 57 extra prestige to kill a 10 strength La7 via 190s, but the 190s will two shot it whereas the 109 will require a third shot a third of the time.

Image

This is Russia’s most expensive fighter. Again, the 190 kills it in less attacks, but the 109 takes fewer losses thanks to its initiative. Specifically, killing a 12 strength Yak 9U cost 116 points less if done via the 109. That’s a fair bit of dough if you play at a high difficulty setting. A ran the simulation for a 5 star Yak 9U as well- the results were essentially the same the costs were just higher for each.

Image

I must admit this one surprised me. Versus the meteor, the 109 has 2 less initiative, one less then you factor in the meteor having 3 stars and the 109 having 5. Factor in the random initiative roll, and you end up with somewhere between 20% of the 109s getting to attack first and 60% of the meteors attacking first. For the 190, the initiative difference would be 4, minus one for xp equals 3- that means 20-100% of the meteors attack first. The 109 has an A-D of 26- 25 = 1 corresponding to a 44% kill rate, while the 190 has an A-D of 32-25 = 7 corresponding to 66% kills. The way this balances out seems to be that the 109 takes more attacks to kill the meteor, without taking any fewer losses unless the meteor is strength 15 or above. The 190 is better vs. the meteor.

Image

I was curious about this so I tried the simulation again this time for a 5 star meteor. In this scenario, the 190 is again better in both damage and losses when fighting meteors below a strength of 13. Above 13, the 109 performed better in both areas. You’ll notice the chart ends at 16- meteors above that strength can one-shot the 190 before it attacks so often that its losses approach infinity very quickly.

Image

I’ll finish with the P-47N. Here we’re back to the familiar pattern of the 190 killing the enemy quite a bit faster, but taking more damage in the process.

Conclusions

1) The 190D9 is the more versatile choice. It destroys bombers and obsolete fighters faster, particularly armored bombers. Its availability of September 1942 sure beats March 1944- the 190A can rule the skies through 1943 in a way the 109G which is available at that time period cannot. Beginners should probably upgrade everything to the 190.

2) More experienced players may find there is a benefit to keeping a couple 109s around to deliver the first shot against the enemy’s most high-tech fighters as their losses would be lower. You have to be careful though, because as I showed with the meteor this isn’t 100% true all the time. Furthermore, six months later the 262 comes out which fills that role far better. Experienced players may also be attracted to the lower upgrade cost of the 190K- it is certainly a good upgrade if you can’t afford the extra 500 for the 190.

3) Although I didn’t show it here, in situations where your aircraft has than 5 stars, the 109, which tends to take less damage, is more likely to survive. There may be a benefit to keeping greenish units as 109s.

That’s it for now, hope you enjoyed this as much as I did.
Flaygor
Corporal - Strongpoint
Corporal - Strongpoint
Posts: 61
Joined: Fri Feb 08, 2013 5:35 am

Re: 109K vs 190D9 Monte Carlo Study

Post by Flaygor »

Wow, that's a lot of work you've done there. Excellent, thank you. I often wondered if I should use the K model but as the 190 is a better all-rounder, and also has better fuel, I'll be sticking to that.
BiteNibbleChomp
Lieutenant-General - Do 217E
Lieutenant-General - Do 217E
Posts: 3231
Joined: Mon Jul 01, 2013 6:35 am

Re: 109K vs 190D9 Monte Carlo Study

Post by BiteNibbleChomp »

Indeed, it is a lot of work, so good job!

I'm always going to stick with the 109 series though - it saves that 600 or so pp from the 190 upgrade that gets wasted as soon as the 262 comes out.

- BNC
Ryan O'Shea - Developer - Strategic Command American Civil War
proline
2nd Lieutenant - Elite Panzer IVF/2
2nd Lieutenant - Elite Panzer IVF/2
Posts: 703
Joined: Sun Jul 27, 2014 12:03 am

Re: 109K vs 190D9 Monte Carlo Study

Post by proline »

Flaygor wrote:Wow, that's a lot of work you've done there. Excellent, thank you. I often wondered if I should use the K model but as the 190 is a better all-rounder, and also has better fuel, I'll be sticking to that.
Keep in mind though that this analysis is for the 190-D9 which actually has slightly less fuel than the 109K. While I realize that there are people who like the 190A for its fuel, the lower attack would weaken its advantages over the 109K quite a bit. I find most maps have plenty of airports.
BiteNibbleChomp wrote:Indeed, it is a lot of work, so good job!

I'm always going to stick with the 109 series though - it saves that 600 or so pp from the 190 upgrade that gets wasted as soon as the 262 comes out.

- BNC
Sure, but its a long, long time from September 10, 1942 to September 8, 1944. During that time you could be having 18 months of the 190A which is waaay better than the 109G in every conceivable respect before the 109K comes out. It's hard to see the switch to the 190 not paying for itself over 18 months if you use your air a lot because the 190 will take fewer losses. I guess if you mostly use AA and your air never takes losses then maybe sticking with the 109 makes more sense.
Iscaran
Sergeant - Panzer IIC
Sergeant - Panzer IIC
Posts: 178
Joined: Tue Jan 18, 2011 8:12 pm

Re: 109K vs 190D9 Monte Carlo Study

Post by Iscaran »

Wow impressive results.

I would have expected the D9 to work out much more superior to the 109k.

May I ask if you would be able to share this "simulation program" with us here ? So we could do our own studies ?

Would it also be possible to simulate tank vs tank situations ?
proline
2nd Lieutenant - Elite Panzer IVF/2
2nd Lieutenant - Elite Panzer IVF/2
Posts: 703
Joined: Sun Jul 27, 2014 12:03 am

Re: 109K vs 190D9 Monte Carlo Study

Post by proline »

Iscaran wrote:May I ask if you would be able to share this "simulation program" with us here ? So we could do our own studies ?

Would it also be possible to simulate tank vs tank situations ?
Sure, I can post the code. It doesn't include all the terrain and ground unit modifiers though. Simulating tank combat would be less realistic because usually you suppress enemy tanks (at least the good ones) and/or get them into close terrain before you attack. In my play there isn't a lot of straight up tank vs. tank fighting.

//
// main.swift
// PzC Simulator
//
// Created by Paul Kirvan on 2015-12-31.
// Copyright © 2015 Paul Kirvan. All rights reserved.
//

import Foundation

dispatch_apply(20, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)){i in performSimulation(i+1)}

func performSimulation(enemyStrength: Int)
{
let figherTypeBeingStudied = AircraftTypes.Bf109K
let attackerExperienceLevel = 5
let enemyTypeBeingStudied = AircraftTypes.Il2M3
let enemyExperienceLevel = 3
let simulationAccuracy = 0.01

var hitsToKill = [Int]()
var losses = [Int]()
var firstShotDamage = [Int]()
var figherUnitCost = 0

func meanStd() -> Double
{
if hitsToKill.count < 100
{
return Double.infinity
}

let meanHitsRequired = Double(hitsToKill.reduce(0, combine: +)) / Double(hitsToKill.count)
let squaredDifferencesToMean = hitsToKill.map{pow(Double($0) - meanHitsRequired, 2.0)}
let variance = squaredDifferencesToMean.reduce(0, combine: +) / Double(squaredDifferencesToMean.count)
let sampleDeviation = sqrt(variance)
return sampleDeviation / sqrt(Double(hitsToKill.count))
}

while meanStd() > simulationAccuracy && hitsToKill.count < 5000
{
var hits = 1
var lostFighters = 0

let attacker = Aircraft(type: figherTypeBeingStudied, experience: attackerExperienceLevel, strength: 10, massAttackBonus: 1)
let enemyAircraft = Aircraft(type: enemyTypeBeingStudied, experience: enemyExperienceLevel, strength: enemyStrength, massAttackBonus: 0)

figherUnitCost = attacker.cost

attacker.createEffectiveInitiative()
enemyAircraft.createEffectiveInitiative()

if attacker.effectiveInitiative >= enemyAircraft.effectiveInitiative
{
attacker.attackAircraft(enemyAircraft)
}

else
{
enemyAircraft.attackAircraft(attacker)
}

firstShotDamage.append(enemyStrength - enemyAircraft.strength)

lostFighters += 10 - attacker.strength

while enemyAircraft.strength > 0
{
hits += 1

let nextFighter = Aircraft(type: figherTypeBeingStudied, experience: attackerExperienceLevel)

nextFighter.createEffectiveInitiative()
attacker.createEffectiveInitiative()

if nextFighter.effectiveInitiative >= enemyAircraft.effectiveInitiative
{
nextFighter.attackAircraft(enemyAircraft)
}

else
{
enemyAircraft.attackAircraft(nextFighter)
}

lostFighters += 10 - nextFighter.strength
}

hitsToKill.append(hits)
losses.append(lostFighters)
}

let meanHitsRequired = Double(hitsToKill.reduce(0, combine: +)) / Double(hitsToKill.count)
let meanDamageInflicted = Double(firstShotDamage.reduce(0, combine: +)) / Double(firstShotDamage.count)
let squaredDifferencesToMean = hitsToKill.map{pow(Double($0) - meanHitsRequired, 2.0)}
let variance = squaredDifferencesToMean.reduce(0, combine: +) / Double(squaredDifferencesToMean.count)
let sampleDeviation = sqrt(variance)
let meanStandardDeviation = sampleDeviation / sqrt(Double(hitsToKill.count))

let meanLosses = Double(losses.reduce(0, combine: +)) / Double(losses.count)

print("\(hitsToKill.count) trials, enemy strength \(enemyStrength), mean hits to kill \(roundToPlaces(meanHitsRequired, places: 2)), stdev \(roundToPlaces(meanStandardDeviation, places: 2) ), mean financial losses \(roundToPlaces(meanLosses/10 * Double(figherUnitCost), places: 1)) first shot damage \(roundToPlaces(meanDamageInflicted, places: 0))")
}

func roundToPlaces(value:Double, places:Int) -> Double {
let divisor = pow(10.0, Double(places))
return round(value * divisor) / divisor
}

//
// classes.swift
// PzC Simulator
//
// Created by Paul Kirvan on 2015-12-31.
// Copyright © 2015 Paul Kirvan. All rights reserved.
//

import Foundation

enum UnitClass {case Fighter, TacBomber, StrategicBomber}
enum AircraftTypes {case Bf109K, Fw190D9, Il2M3, Il2, Pe8, La7, La5, Yak7, Yak9U, Meteor, P47N}

class Aircraft: CustomStringConvertible
{
let cost, maxAmmo, maxFuel, move, spott, range, initiative, attSoft, attHard, attNaval, defGround, defAir, defClose, experience: Int
let type: String
let unitClass: UnitClass
var attAir = 0
var strength = 10
var suppression = 0
var effectiveInitiative = 0
var massAttackBonus = 0

func createEffectiveInitiative()
{
let experienceBonus = unitClass == UnitClass.Fighter ? round(Double(experience) * 0.5) : 0
let randomBonus = Int(arc4random_uniform(3))

effectiveInitiative = initiative + Int(experienceBonus) + massAttackBonus + randomBonus
}


func attackAircraft(enemy: Aircraft)
{
let initiativeDifference = effectiveInitiative - enemy.effectiveInitiative

var firingAdvantage = 0.2 * Double(initiativeDifference)

if firingAdvantage > 1
{
firingAdvantage = 1
}

let freeShots = Int(round(Double(strength) * firingAdvantage))
let attackDifferential = attAir - enemy.defAir

let (miss, suppress, _) = Probabilities.values(attackDifferential)
var diceRolls = [Int]()

for _ in 1...strength
{
diceRolls.append(Int(arc4random_uniform(100)) + 1)
}

if freeShots > 0
{
for _ in 1...freeShots
{
let roll = diceRolls.first!
diceRolls.removeFirst()

switch roll
{
case (miss + 1)...(miss + suppress):
enemy.suppression += 1

case 0...miss:
break

default:
enemy.strength -= 1
}
}
}

var futureDamage = 0

if strength - freeShots > 0
{
for _ in 1...(strength - freeShots)
{
let roll = diceRolls.first!
diceRolls.removeFirst()

switch roll
{
case 0...(miss + suppress):
break

default:
futureDamage += 1
}
}
}

enemy.defendAgainstAircraft(self)
enemy.strength -= futureDamage

if enemy.strength < 0
{
enemy.strength = 0
}

if strength < 0
{
strength = 0
}

enemy.suppression = 0
}

func defendAgainstAircraft(enemy: Aircraft)
{
if strength - suppression > 0
{
let attackDifferential = attAir - enemy.defAir
let (miss, suppress, _) = Probabilities.values(attackDifferential)
var diceRolls = [Int]()

for _ in 1...strength - suppression
{
diceRolls.append(Int(arc4random_uniform(100)) + 1)
}

for _ in 1...(strength - suppression)
{
let roll = diceRolls.first!
diceRolls.removeFirst()

switch roll
{
case 0...(miss + suppress):
break

default:
enemy.strength -= 1
}
}
}
}

convenience init(type: AircraftTypes, experience: Int)
{
self.init(type: type, experience: experience, strength: 10, massAttackBonus: 0)
}

init(type: AircraftTypes, experience: Int, strength: Int, massAttackBonus: Int)
{
self.experience = experience
self.strength = strength
self.massAttackBonus = massAttackBonus

func geteffectiveAirAttack(basicAttack: Int) -> Int
{
let attackBonus: Int

switch unitClass
{
case UnitClass.Fighter:
attackBonus = 2*experience

default:
attackBonus = 0
}

return basicAttack + attackBonus
}

switch type
{
case AircraftTypes.Bf109K:
self.type = "Bf109K"
unitClass = UnitClass.Fighter
cost = 541
maxAmmo = 5
maxFuel = 56
move = 14
spott = 2
range = 0
initiative = 13
attSoft = 1
attHard = 1
attNaval = 1
defGround = 20
defAir = 20 + experience
defClose = 0
attAir = geteffectiveAirAttack(16)

case AircraftTypes.Fw190D9:
self.type = "Fw190D-9"
unitClass = UnitClass.Fighter
cost = 597
maxAmmo = 6
maxFuel = 52
move = 14
spott = 2
range = 0
initiative = 11
attSoft = 1
attHard = 1
attNaval = 1
defGround = 20
defAir = 20 + experience
defClose = 0
attAir = geteffectiveAirAttack(22)

case AircraftTypes.Il2M3:
self.type = "Il-2M3"
unitClass = UnitClass.TacBomber
cost = 369
maxAmmo = 5
maxFuel = 45
move = 11
spott = 1
range = 0
initiative = 1
attSoft = 8
attHard = 10
attNaval = 3
defGround = 23
defAir = 20 + experience
defClose = 0
attAir = geteffectiveAirAttack(-9)

case AircraftTypes.Il2:
self.type = "Il-2M3"
unitClass = UnitClass.TacBomber
cost = 376
maxAmmo = 5
maxFuel = 50
move = 12
spott = 1
range = 0
initiative = 2
attSoft = 7
attHard = 9
attNaval = 2
defGround = 23
defAir = 19 + experience
defClose = 0
attAir = geteffectiveAirAttack(-9)


case AircraftTypes.Pe8:
self.type = "Pe-8"
unitClass = UnitClass.StrategicBomber
cost = 356
maxAmmo = 6
maxFuel = 293
move = 12
spott = 1
range = 0
initiative = 3
attSoft = 12
attHard = 8
attNaval = 8
defGround = 22
defAir = 12 + experience
defClose = 0
attAir = geteffectiveAirAttack(-11)

case AircraftTypes.La5:
self.type = "La-5"
unitClass = UnitClass.Fighter
cost = 458
maxAmmo = 5
maxFuel = 41
move = 13
spott = 2
range = 0
initiative = 9
attSoft = 1
attHard = 1
attNaval = 1
defGround = 18
defAir = 17 + experience
defClose = 0
attAir = geteffectiveAirAttack(17)

case AircraftTypes.La7:
self.type = "La-7"
unitClass = UnitClass.Fighter
cost = 585
maxAmmo = 5
maxFuel = 39
move = 14
spott = 2
range = 0
initiative = 10
attSoft = 1
attHard = 2
attNaval = 1
defGround = 18
defAir = 20 + experience
defClose = 0
attAir = geteffectiveAirAttack(21)

case AircraftTypes.Yak9U:
self.type = "Yak9U"
unitClass = UnitClass.Fighter
cost = 625
maxAmmo = 5
maxFuel = 42
move = 14
spott = 2
range = 0
initiative = 12
attSoft = 1
attHard = 1
attNaval = 1
defGround = 19
defAir = 19 + experience
defClose = 0
attAir = geteffectiveAirAttack(22)

case AircraftTypes.Yak7:
self.type = "Yak7"
unitClass = UnitClass.Fighter
cost = 436
maxAmmo = 6
maxFuel = 53
move = 14
spott = 2
range = 0
initiative = 8
attSoft = 1
attHard = 1
attNaval = 1
defGround = 19
defAir = 16 + experience
defClose = 0
attAir = geteffectiveAirAttack(13)


case AircraftTypes.Meteor:
self.type = "Meteor"
unitClass = UnitClass.Fighter
cost = 668
maxAmmo = 5
maxFuel = 134
move = 14
spott = 2
range = 0
initiative = 15
attSoft = 1
attHard = 2
attNaval = 1
defGround = 20
defAir = 22 + experience
defClose = 0
attAir = geteffectiveAirAttack(20)

case AircraftTypes.P47N:
self.type = "P47N"
unitClass = UnitClass.Fighter
cost = 674
maxAmmo = 5
maxFuel = 236
move = 14
spott = 2
range = 0
initiative = 12
attSoft = 3
attHard = 1
attNaval = 1
defGround = 20
defAir = 20 + experience
defClose = 0
attAir = geteffectiveAirAttack(24)
}
}

var description: String
{
return "\(type) strength \(strength) suppression \(suppression)"
}
}

let odds = [14: (10, 9, 81),
13: (12, 9, 79),
12: (14, 9, 77),
11: (16, 9, 75),
10: (18, 9, 73),
9: (20, 9, 71),
8: (22, 10, 68),
7: (24, 10, 66),
6: (26, 11, 63),
5: (28, 11, 61),
4: (30, 12, 58),
3: (35, 12, 53),
2: (40, 11, 49),
1: (45, 11, 44),
0: (50, 10, 40),
-1: (55, 10, 35),
-2: (60, 9, 31),
-3: (65, 9, 26),
-4: (70, 8, 22),
-5: (72, 7, 21),
-6: (74, 7, 19),
-7: (76, 7, 17),
-8: (78, 7, 15),
-9: (80, 6, 14),
-10: (82, 6, 12),
-11: (84, 5, 11),
-12: (86, 5, 9),
-13: (88, 4, 8),
-14: (90, 4, 6),
-15: (90, 4, 6),
-16: (90, 4, 6),
-17: (90, 4, 6),
-18: (90, 4, 6),
-19: (90, 4, 6),
-20: (90, 4, 6),
-21: (90, 5, 5),
-22: (90, 6, 4),
-23: (90, 6, 4),
-24: (90, 6, 4),
-25: (90, 6, 4),
-26: (90, 6, 4),
-27: (90, 6, 4),
-28: (90, 6, 4),
-29: (90, 6, 4),
-30: (90, 6, 4),
-31: (90, 6, 4),
-32: (90, 7, 3),
-33: (90, 7, 3),
-34: (90, 7, 3),
-35: (90, 7, 3),
-36: (90, 7, 3),
-37: (90, 7, 3),
-38: (90, 7, 3),
-39: (90, 7, 3),
-40: (90, 7, 3),
-41: (90, 7, 3)]

class Probabilities
{
class func values(differential: Int) -> (Int, Int, Int)
{
var returnValues = odds[differential]

if returnValues == nil
{
if differential > 14
{
returnValues = (10, 9, 81)
}

else
{
returnValues = (90, 7, 3)
}
}

return returnValues!
}
}
ptje63
Sergeant First Class - Elite Panzer IIIL
Sergeant First Class - Elite Panzer IIIL
Posts: 403
Joined: Fri Sep 26, 2014 2:57 pm
Location: The Netherlands
Contact:

Re: 109K vs 190D9 Monte Carlo Study

Post by ptje63 »

Impressive study - martian to me, so depending on enthusiasts like you to figure this out... thanks - very interesting to see other comparing unit studies...
Will stick to 190's as before...
Flaygor
Corporal - Strongpoint
Corporal - Strongpoint
Posts: 61
Joined: Fri Feb 08, 2013 5:35 am

Re: 109K vs 190D9 Monte Carlo Study

Post by Flaygor »

Thanks for pointing out my mistake with the fuel.
That will be why I mainly prefer sticking with the standard 190s which do have better fuel and by the time they are 4 or 5 star they are pretty good anyway. I find good endurance can be a life saver on a large battlefield and possibly worth a few points of attack.
captainjack
Brigadier-General - 15 cm Nblwf 41
Brigadier-General - 15 cm Nblwf 41
Posts: 1912
Joined: Thu Sep 13, 2012 7:42 am

Re: 109K vs 190D9 Monte Carlo Study

Post by captainjack »

I choose the 190A over the 109 as soon it's available, but very rarely upgrade to the 190D. For me the better air attack is not really enough to compensate for the combination of lower fuel and reduced ammo.

If I have one or two more 109s than I need when the 190 becomes available, I sometimes upgrade them to the 109K. I first did this when short of prestige, but I realised it was performing better than I had expected and they can be a useful extra.
Delta66
Sergeant First Class - Panzer IIIL
Sergeant First Class - Panzer IIIL
Posts: 392
Joined: Sat Jan 28, 2012 12:45 pm

Re: 109K vs 190D9 Monte Carlo Study

Post by Delta66 »

Congrats for the study, great work.
And thanks for the code.
Iscaran
Sergeant - Panzer IIC
Sergeant - Panzer IIC
Posts: 178
Joined: Tue Jan 18, 2011 8:12 pm

Re: 109K vs 190D9 Monte Carlo Study

Post by Iscaran »

Thanks for the code - I'll see if I can use it in the same way you did.

Anyway looking forward in seeing more studies from you !
Post Reply

Return to “Panzer Corps”