public StrategyComparisonResults ComparePlayers(
GetLogForGame getHumanReadableLogWriter = null,
GetLogForGame getDebugLogWriter = null,
bool shouldParallel = true,
bool gatherStats = true,
CreateGameLog createGameLog = null,
int randomSeed = 0)
{
PlayerAction player1 = playerActions[0];
PlayerAction player2 = playerActions[1];
var result = new StrategyComparisonResults(this, gatherStats);
Action<int> loopBody = delegate(int gameCount)
{
System.Threading.Interlocked.Increment(ref totalGameCount);
using (IndentedTextWriter textWriter = getHumanReadableLogWriter != null ? getHumanReadableLogWriter(gameCount) : null)
using (IndentedTextWriter debugWriter = getDebugLogWriter != null ? getDebugLogWriter(gameCount) : null)
{
var gameLogs = new List<IGameLog>();
if (gatherStats)
{
gameLogs.Add(result.statGatherer);
}
if (createGameLog != null)
{
gameLogs.Add(createGameLog());
}
if (textWriter != null)
{
var humanReadableGameLog = new HumanReadableGameLog(textWriter);
gameLogs.Add(humanReadableGameLog);
var gainSequenceGameLog = new GainSequenceGameLog(textWriter);
gameLogs.Add(gainSequenceGameLog);
}
if (debugWriter != null)
{
var debugLog = new DebugGameLog(debugWriter);
gameLogs.Add(debugLog);
var gainSequenceGameLog = new GainSequenceGameLog(debugWriter);
gameLogs.Add(gainSequenceGameLog);
}
var gameLogMultiplexer = new GameLogMultiplexer(gameLogs.ToArray());
// swap order every game if needed
int[] playedPositions = this.GetPlayerOrderForGameNumber(gameCount);
Random random = new Random(gameCount + randomSeed);
using (Game game = new Game(random, gameConfig, gameLogMultiplexer))
{
GameState gameState = new GameState(
playerActions,
playedPositions,
game);
gameState.PlayGameToEnd();
PlayerState[] winners = gameState.WinningPlayers;
int player1Score = gameState.players.OriginalPlayerOrder[playedPositions[0]].TotalScore();
int player2Score = gameState.players.OriginalPlayerOrder[playedPositions[1]].TotalScore();
int scoreDifference = player2Score - player1Score;
lock (result)
{
result.pointSpreadHistogramData.AddOneToBucket(scoreDifference);
result.gameEndOnTurnHistogramData.AddOneToBucket(gameState.players.CurrentPlayer.TurnNumber);
result.maxTurnNumber = Math.Max(gameState.players.CurrentPlayer.TurnNumber, result.maxTurnNumber);
if (winners.Length == 1)
{
int winningPlayerIndex = winners[0].Actions == player1 ? 0 : 1;
result.winnerCount[winningPlayerIndex]++;
}
else
{
result.tieCount++;
}
}
}
}
};
if (shouldParallel)
{
Parallel.ForEach(Enumerable.Range(0, numberOfGames), loopBody);
}
else
{
for (int gameCount = 0; gameCount < numberOfGames; ++gameCount)
loopBody(gameCount);
}
result.gameEndOnTurnHistogramData.InitializeAllBucketsUpTo(result.maxTurnNumber);
return result;
}