static void TurnLoops() { while (true) { var game = GameModes.FullNewStratego(null, null); game.rules.LoggingSettings = new GameRules.LogSettings() { logTime = false, showEachPlayersPlanning = false, showStatePerTurn = false, showMovePerTurn = false, pausePerMove = false, listMoveSeqenceAtEnd = true, }; game.rules.MaxPhysicalTurns = 200; Console.WriteLine("New game: "); Console.WriteLine(game.CurrentBoard.ToAsciiLayout()); Console.WriteLine(" press enter to begin turns"); //Console.ReadLine(); var results = game.Run(); Console.WriteLine($"Turns: {results.turnsElapsed}, Time: {results.timeElapsed.ToReadable()}, Winners: "); foreach (Player p in results.Winners) { Console.WriteLine("- " + p.FriendlyName); } Console.WriteLine("---- end of game ---- press <enter> to continue"); //Console.ReadLine(); } }
static float CompareWins(IPlayerController controller1, IPlayerController controller2, int maxgames = 250, int maxphysturns = 2000, bool showGameResults = false) { int countP1Wins = 0; int countDraws = 0; int maxGames = maxgames; int maxPhysTurns = maxphysturns; // since these are statics we cant parallel them without risking changing their controller midway var p1 = new Player() { FriendlyName = "Player 1", FriendlySymbol = "+", Controller = controller1, }; var p2 = new Player() { FriendlyName = "Player 2", FriendlySymbol = "-", Controller = controller2, }; Console.WriteLine("Starting simulations, please wait..."); Stopwatch totalTime = Stopwatch.StartNew(); StringBuilder csv = new StringBuilder(); string sessionName = $"ModeFULL-" + $"Agents{p1.Controller.GetControllerName()}Vs{p2.Controller.GetControllerName()}-" + $"Turns{maxPhysTurns}-Games{maxGames}"; // csv headers string SessionTimestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); string logfilename = $"Session_{sessionName}_{SessionTimestamp}.csv"; csv.AppendLine("Session,Game,Turns,Elapsed,Winners"); System.IO.File.AppendAllText(logfilename, csv.ToString()); object statslock = new object(); //Parallel.For(0, maxGames, (int i) => for (int i = 1; i <= maxGames; i++) { csv.Clear(); // TODO any way to save the rules but rerun a new game? var game = GameModes.FullNewStratego(p1, p2); game.rules.LoggingSettings = new GameRules.LogSettings() { logTime = true, showEachPlayersPlanning = false, showStatePerTurn = false, pausePerMove = false, listMoveSeqenceAtEnd = false, showMovePerTurn = false, winLossReasons = false, }; game.rules.MaxPhysicalTurns = maxPhysTurns; // add custom event listeners to better integrate logging into the game events? var results = game.Run(); if (results.Winners.Count == 0) { countDraws++; } else if (results.Winners.Contains(p1)) { countP1Wins++; } lock (statslock) csv.AppendLine($"{SessionTimestamp},{i},{results.ToCSV()}"); System.IO.File.AppendAllText(logfilename, csv.ToString()); if (showGameResults) { Console.WriteLine($"#{i} " + $"Wins:{countP1Wins}({Math.Round((countP1Wins / (float)i) * 100, 0)}%), " + $"Ties:{countDraws}({Math.Round((countDraws / (float)i) * 100, 0)}%), " + $"Turns:{results.turnsElapsed}, " + $"Time:{results.timeElapsed.ToReadable()}, " + $"Win:{results.Winners.Contains(p1)}"); // string.Join(",", results.Winners.Select(x=>x.FriendlyName)) } } ; Console.WriteLine($"--- Sim complete, {maxGames} evaluated. Total Time: {totalTime.Elapsed.ToReadable()}"); Console.WriteLine($"Wins: {countP1Wins} ({(Math.Round((countP1Wins / (float)maxGames) * 100, 1))}%), " + $"Draws: {countDraws} ({(Math.Round((countDraws / (float)maxGames) * 100, 1))}%)"); if (showGameResults) { Console.WriteLine("Wrote log to " + logfilename); } return(countP1Wins / (float)maxGames); }
static void DebugDemo() { var MonteUtilityPlayer = new Player() { Controller = new ControllerMonteUtility(10, 10), FriendlyName = "P1MonteUtility", FriendlySymbol = "+" }; // Define the simulation, board, pieces, players, and rules Stopwatch fullProgramTime = Stopwatch.StartNew(); Stopwatch watch = new Stopwatch(); watch.Start(); Game game = GameModes.FullNewStratego(MonteUtilityPlayer, GameModes.staticPlayer2); Console.WriteLine("Board Setup: " + watch.Elapsed.TotalMilliseconds); watch.Restart(); Console.WriteLine(Environment.NewLine + game.CurrentBoard.ToAsciiLayout(null, true)); Console.WriteLine(game.CurrentBoard.ToAsciiLayout()); Console.WriteLine("Board Output: " + watch.Elapsed.TotalMilliseconds); Stopwatch totalTurnTime = Stopwatch.StartNew(); // easy configuration of loggings and tracking, independent of gamemodes or controllers (todo move to rules?) game.rules.LoggingSettings = new GameRules.LogSettings() { logTime = true, showEachPlayersPlanning = true, showStatePerTurn = true, pausePerMove = true, winLossReasons = true, debugJumpchecks = false, showMovePerTurn = true, listMoveSeqenceAtEnd = true, showBombDefusals = true, showHiddenPieces = false, }; game.rules.MaxPhysicalTurns = 600; var results = game.Run(); Console.WriteLine($"Turns: {results.turnsElapsed}, Time: {results.timeElapsed.ToReadable()}, Winners: "); foreach (Player p in results.Winners) { Console.WriteLine("- " + p.FriendlyName); } watch.Stop(); fullProgramTime.Stop(); Console.WriteLine("------------------------- DONE in " + fullProgramTime.Elapsed.ToReadable() + "----------------------------"); Console.WriteLine("Press <space> to quit"); while (Console.ReadKey().Key != ConsoleKey.Spacebar) { ; } }