/// <summary>
        /// Playes a single game turn
        /// </summary>
        /// <param name="player">The player object</param>
        public void PlaySingleTurn(IReversiPlayer player)
        {
            Point point = player.NextMove((Disc[, ])board.Clone(), currentPlayer);

            board         = PlayTurn(board, point, currentPlayer);
            currentPlayer = currentPlayer.Reversed();
        }
        /// <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);
            }
        }
示例#3
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();
        }
示例#4
0
 public void AllPlayerTest()
 {
     foreach (Type t in Assembly.GetCallingAssembly().GetTypes())
     {
         if (t.GetInterface("IReversiPlayer") != null)
         {
             IReversiPlayer player = Activator.CreateInstance(t) as IReversiPlayer;
             ReversiGame    rg     = new ReversiGame();
             rg.PlaySingleTurn(player);
         }
     }
 }
示例#5
0
        /// <summary>
        /// Creates simulation of all players implementing IReversiPlayer
        /// </summary>
        /// <returns>A new ReversiMultiplayerSimulation instance</returns>
        private static ReversiMultiplayerSimulation CreateMultplayerSimulation()
        {
            ReversiMultiplayerSimulation sim = new ReversiMultiplayerSimulation();

            foreach (Type t in Assembly.GetCallingAssembly().GetTypes())
            {
                if (t.GetInterface("IReversiPlayer") != null)
                {
                    IReversiPlayer player = Activator.CreateInstance(t) as IReversiPlayer;
                    sim.AddPlayer(player);
                }
            }
            return(sim);
        }
 /// <summary>
 /// Adds a player to the simulation
 /// </summary>
 /// <param name="player">An IReversiPlayer object</param>
 public void AddPlayer(IReversiPlayer player)
 {
     players.Add(player);
 }
 /// <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;
 }
 /// <summary>
 /// Playes a single game turn
 /// </summary>
 /// <param name="player">The player object</param>
 public void PlaySingleTurn(IReversiPlayer player)
 {
     Point point = player.NextMove((Disc[,])board.Clone(), currentPlayer);
     board = PlayTurn(board, point, currentPlayer);
     currentPlayer = currentPlayer.Reversed();
 }
示例#9
0
 /// <summary>
 /// Adds a player to the simulation
 /// </summary>
 /// <param name="player">An IReversiPlayer object</param>
 public void AddPlayer(IReversiPlayer player)
 {
     players.Add(player);
 }
 /// <summary>
 /// Returns the name of an IReversiPlayer
 /// </summary>
 /// <param name="player">The target player</param>
 /// <returns>The name of the player</returns>
 public static string GetName(this IReversiPlayer player)
 {
     return(player.GetType().Name);
 }