public void Create_P1Armies17_AreEqual() { var act = RegionState.Create(17, PlayerType.player1); var expOwner = PlayerType.player1; var expArmies = 17; Assert.AreEqual(expOwner, act.Owner, "Owner"); Assert.AreEqual(expArmies, act.Armies, "Armies"); }
//see wiki.warlight.net/index.php/Combat_Basics private SimulationOutcome SimulateAttack(RegionState source, RegionState target, int armies) { //int attackers, int defenders, out int attackersDestroyed, out int defendersDestroyed int attackingArmies = armies; int defendingArmies = target.Armies; var attackersDestroyed = 0; var defendersDestroyed = 0; for (int t = 1; t <= attackingArmies; t++) //calculate how much defending armies are destroyed { double rand = Rnd.NextDouble(); //60% chance to destroy one defending army if (rand < AttackFactor) { defendersDestroyed++; } } for (int t = 1; t <= defendingArmies; t++) //calculate how much attacking armies are destroyed { double rand = Rnd.NextDouble(); //70% chance to destroy one attacking army if (rand < DefendFactor) { attackersDestroyed++; } } if (attackersDestroyed >= attackingArmies) { if (defendersDestroyed >= defendingArmies) { defendersDestroyed = defendingArmies - 1; } attackersDestroyed = attackingArmies; } //process result of attack if (defendersDestroyed >= defendingArmies) //attack success { var survivors = attackingArmies - attackersDestroyed; return(new SimulationOutcome(source.Leave(armies), RegionState.Create(survivors, source.Owner))); } else //attack fail { return(new SimulationOutcome(source.Leave(attackersDestroyed), target.Leave(defendersDestroyed))); } }
public void Simulate_20Vs11_10000Runs() { var source = RegionState.Create(20, PlayerType.player1); var target = RegionState.Create(11, PlayerType.player2); var rnd = new MT19937Generator(17); var simulator = new Simulator(rnd); var sw = new Stopwatch(); sw.Start(); var act = simulator.Simulate(source, target, 19, 10000); sw.Stop(); Console.WriteLine(sw.Elapsed.TotalMilliseconds); Console.WriteLine("success: {0}, failure: {1}", act.SuccessCount, act.FailureCount); }