/// <summary> /// Plays a single game and dumps the results /// </summary> /// <param name="white">The white (first) player</param> /// <param name="black">The black (second) player</param> /// <param name="dump">A text writer to act as a dump</param> /// <returns>The winner (Disc.Empty if draw)</returns> public static Disc PlayGame(IReversiPlayer white, IReversiPlayer black, TextWriter dump = null) { if (dump == null) { dump = Console.Out; } dump.WriteLine("{0},{1}#", white.GetName(), black.GetName()); ReversiGame game = new ReversiGame(); dump.WriteLine(game.board.AsString() + "$"); game.currentPlayer = Disc.White; int passes = 0; while (passes < 2) { if (ValidMoves(game.board, game.currentPlayer).Count == 0) { passes++; game.currentPlayer = game.currentPlayer.Reversed(); } else { try { Program.RunActionWithTimeout( () => game.PlaySingleTurn( game.currentPlayer == Disc.White ? white : black), MOVE_TIMEOUT); passes = 0; } catch (Exception e) { dump.WriteLine(e); dump.WriteLine(e.StackTrace); return(game.currentPlayer.Reversed()); } } dump.WriteLine(game.board.AsString() + "$"); } int score = Score(game.board, Disc.White); if (score > 0) { return(Disc.White); } else if (score < 0) { return(Disc.Black); } else { return(Disc.Empty); } }
/// <summary> /// Runs a simulation of a single match /// </summary> /// <param name="i1">Index of the white player</param> /// <param name="i2">Index of the black player</param> private void RunSimulation(int i1, int i2) { IReversiPlayer p1 = players[i1], p2 = players[i2]; string filename = String.Format("dumps\\{0}_{1}.txt", p1.GetName(), p2.GetName()); StreamWriter sw = new StreamWriter(filename); Disc winner = ReversiGame.PlayGame(p1, p2, sw); Scoreboard[i1, i2] = (int)winner; sw.Close(); }
/// <summary> /// Plays a single game and dumps the results /// </summary> /// <param name="white">The white (first) player</param> /// <param name="black">The black (second) player</param> /// <param name="dump">A text writer to act as a dump</param> /// <returns>The winner (Disc.Empty if draw)</returns> public static Disc PlayGame(IReversiPlayer white, IReversiPlayer black, TextWriter dump = null) { if(dump == null) dump = Console.Out; dump.WriteLine("{0},{1}#", white.GetName(), black.GetName()); ReversiGame game = new ReversiGame(); dump.WriteLine(game.board.AsString() + "$"); game.currentPlayer = Disc.White; int passes = 0; while (passes < 2) { if (ValidMoves(game.board, game.currentPlayer).Count == 0) { passes++; game.currentPlayer = game.currentPlayer.Reversed(); } else try { Program.RunActionWithTimeout( () => game.PlaySingleTurn( game.currentPlayer == Disc.White ? white : black), MOVE_TIMEOUT); passes = 0; } catch (Exception e) { dump.WriteLine(e); dump.WriteLine(e.StackTrace); return game.currentPlayer.Reversed(); } dump.WriteLine(game.board.AsString() + "$"); } int score = Score(game.board, Disc.White); if (score > 0) return Disc.White; if (score < 0) return Disc.Black; return Disc.Empty; }