public static void Run(int numGames) { Random random = new Random(); int[] cumulativeTrickCounts = new int[4]; // [playerId] IPlayGenerator <Play>[] playGenerators = new IPlayGenerator <Play> [4]; //playGenerators[0] = new MultiThreadedMcts<Play>(100000, 50, random, 8); playGenerators[0] = new Mcts <Play>(10000, 50, random); playGenerators[1] = new RandomPlayGenerator <Play>(); playGenerators[2] = new HighestCardPlayGenerator(); playGenerators[3] = new HighestCardPlayGenerator(); Logger.Log.Enabled = true; for (int gameNumber = 0; gameNumber < numGames; gameNumber++) { var gameState = TichuGameRunHarness.SetupFourPlayerGame(random); if (true) { Logger.Log.WriteLine("Starting cards:"); for (int i = 0; i < 4; i++) { Logger.Log.WriteLine($"Player {i} {TichuCard.PrintCardsSortedBySuit(gameState.Players[i].Cards)}"); } } while (true) { gameState.SetPointOfViewPlayer(gameState.CurrentPlayerTurn); Play play = playGenerators[gameState.CurrentPlayerTurn].FindPlay(gameState); Logger.Log.WriteLine($"Player {play.Player} played {play.Cards[0].ToString()}"); gameState.CommitPlay(play); if (gameState.GameOver()) { break; } if (gameState.PlayedCards.Count % 4 == 0) { Logger.Log.WriteLine("----"); } } var scores = gameState.Evaluate(); for (int i = 0; i < 4; i++) { cumulativeTrickCounts[i] += (int)scores[i]; } Console.WriteLine($"Tricks: {scores[0]} {scores[1]} {scores[2]} {scores[3]} "); } string header = string.Format("{0, 6}{1, 10}{2, 10}", "Player", "Tricks", "Average"); Console.WriteLine(header); for (int i = 0; i < 4; i++) { string output = string.Format("{0, 6}{1, 10}{2, 10:N1}", i, cumulativeTrickCounts[i], (double)cumulativeTrickCounts[i] / numGames); Console.WriteLine(output); } }
public static void Run(int iterations) { Random random = new Random(); int[] wins = new int[PlayerCount]; int draws = 0; IPlayGenerator <int>[] playGenerators = new IPlayGenerator <int> [PlayerCount]; // playGenerators[0] = new ConsoleInputSixNimmtPlayGenerator(); // playGenerators[1] = new RandomPlayGenerator<int>(); // playGenerators[2] = new RandomPlayGenerator<int>(); // playGenerators[3] = new RandomPlayGenerator<int>(); // playGenerators[4] = new RandomPlayGenerator<int>(); playGenerators[0] = new Mcts <int>(numIterations: 2000, simulationDepth: 10, random); playGenerators[1] = new RandomPlayGenerator <int>(); playGenerators[2] = new RandomPlayGenerator <int>(); playGenerators[3] = new RandomPlayGenerator <int>(); playGenerators[4] = new RandomPlayGenerator <int>(); Logger.Log.Enabled = false; Stopwatch stopwatch = Stopwatch.StartNew(); for (int iteration = 0; iteration < iterations; iteration++) { double[] scores = null; while (true) { var state = CreateNewGame(random, scores, SixNimmtHarness.ProMode); if (true) { Logger.Log.WriteLine("Starting cards:"); for (int i = 0; i < PlayerCount; i++) { var playerCards = state.PlayerCards[i].ToList(); playerCards.Sort(); Logger.Log.WriteLine($"Player {i} : {string.Join(" ", playerCards)}"); } } while (true) { if (state.CurrentPlayerTurn == 0 && state.PlayInputState == SixNimmtInputState.SelectCard) { Logger.Log.WriteLine(state.ToString()); } state.SetPointOfViewPlayer(state.CurrentPlayerTurn); var play = playGenerators[state.CurrentPlayerTurn].FindPlay(state); // Console.WriteLine($"Player {state.CurrentPlayerTurn} plays {play}"); state.CommitPlay(play); if (state.GameOver()) { break; } } scores = state.Evaluate(); if (scores.Any(x => x < 0)) { // Somebody went below 0 - game over double highestScore = double.MinValue; foreach (var s in scores) { if (s > highestScore) { highestScore = s; } } for (int i = 0; i < PlayerCount; i++) { if (scores[i] == highestScore) { wins[i]++; } } break; } } } string header = string.Format("{0, 6}{1, 10}{2, 7}", "Player", "Wins", "%"); Console.WriteLine(header); for (int i = 0; i < PlayerCount; i++) { string output = string.Format("{0, 6}{1, 10}{2, 7:P1}", i, wins[i], (double)wins[i] / (iterations - draws)); Console.WriteLine(output); } Console.WriteLine($"Draws: {draws}"); stopwatch.Stop(); Console.WriteLine($"Finished after {stopwatch.ElapsedMilliseconds:N0}ms."); }