/// <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);
            }
        }
Exemplo n.º 2
0
        /// <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;
 }