Example #1
0
 private void RunInteractiveGames(int numGames, ITicTacToePlayer player1, ITicTacToePlayer player2)
 {
     for (var i = 0; i < numGames; i++)
     {
         RunSingleGame(player1, player2);
     }
 }
Example #2
0
        private int EvaluateMove(TicTacToeBoard board, ITicTacToePlayer currentPlayer, ITicTacToePlayer otherPlayer)
        {
            if ((new EquationWinEvaluator()).HasPlayerWon(currentPlayer, board))
                return currentPlayer == this ? Win : Loss;

            return Draw;
        }
        private ScoreTally PlayAllPossibleGames(TicTacToeBoard currentBoard, ITicTacToePlayer player, ITicTacToePlayer opponent)
        {
            var tally = ScoreTally.Start;

            var position = player.PlayTurn(currentBoard);
            var nextBoard = currentBoard.UpdateBoard(position, player);
            if (new BitMaskWinEvaluator().HasPlayerWon(player, nextBoard))
                return ScoreTally.Win;
            if (nextBoard.IsComplete)
                return ScoreTally.Draw;

            foreach (var boardPosition in nextBoard.VacantSquares)
            {
                var possibleMove = nextBoard.UpdateBoard(boardPosition, opponent);
                if (new BitMaskWinEvaluator().HasPlayerWon(opponent, possibleMove))
                    return ScoreTally.Loss;
                if (possibleMove.IsComplete)
                    return ScoreTally.Draw;

                var result = PlayAllPossibleGames(possibleMove, player, opponent);
                tally = result + tally;
            }

            return tally;
        }
 public string NameForPlayer(ITicTacToePlayer player)
 {
     if (player == _game.Naughts)
         return "Naughts";
     if (player == _game.Crosses)
         return "Crosses";
     return null;
 }
 public string SymbolForPlayer(ITicTacToePlayer player)
 {
     if (player == _game.Naughts)
         return "O";
     if (player == _game.Crosses)
         return "X";
     return " ";
 }
Example #6
0
        public TicTacToeGame(Board board, ITicTacToePlayer player1, ITicTacToePlayer player2)
        {
            Board    = board;
            _player1 = player1;
            _player2 = player2;

            ThrowIfPlayersInvalid();
        }
Example #7
0
        public TicTacToeGame(ITicTacToePlayer naughts, ITicTacToePlayer crosses)
        {
            Naughts = naughts;
            Crosses = crosses;
            _board = new TicTacToeBoard();

            CurrentPlayer = Naughts;
        }
Example #8
0
 public void Setup()
 {
     _board   = Board.CreateEmptyBoard();
     _player1 = Substitute.For <ITicTacToePlayer>();
     _player2 = Substitute.For <ITicTacToePlayer>();
     _player1.Tile.Returns(BoardTile.X);
     _player2.Tile.Returns(BoardTile.O);
     _game = new TicTacToeGame(_board, _player1, _player2);
 }
Example #9
0
 public void RenderStart(ITicTacToePlayer player1, ITicTacToePlayer player2, ITicTacToeBoard ticTacToeBoard)
 {
     Console.WriteLine("");
     Console.WriteLine("New game started");
     Console.WriteLine("Player 1 is {0} and playing {1}", player1.Name, player1.Piece.ToConsoleString());
     Console.WriteLine("Player 2 is {0} and playing {1}", player2.Name, player2.Piece.ToConsoleString());
     Console.WriteLine("");
     RenderBoard(ticTacToeBoard);
 }
 public bool HasPlayerWon(ITicTacToePlayer currentPlayer, TicTacToeBoard board)
 {
     var playerMask = GetPositionMaskForPlayer(currentPlayer, board);
     foreach (var win in _wins)
     {
         if ((win & playerMask) == win)
             return true;
     }
     return false;
 }
Example #11
0
        private void RunHeadless(int numGames, ITicTacToePlayer player1, ITicTacToePlayer player2)
        {
            var runner = new HeadlessRunner(player1, player2);

            runner.PlayGames(numGames);

            var totalXWins = runner.NumberOfWins(BoardTile.X);
            var totalOWins = runner.NumberOfWins(BoardTile.O);

            Print($"After {runner.NumberOfGames} games, x wins, o wins: {totalXWins}, {totalOWins}");
        }
Example #12
0
        private static TicTacToeGame RunSingleGame(ITicTacToePlayer player1, ITicTacToePlayer player2)
        {
            var game = new TicTacToeGame(Board.CreateEmptyBoard(), player1, player2);

            while (!game.IsFinished())
            {
                game.DoNextTurn();
            }

            return(game);
        }
        public bool HasPlayerWon(ITicTacToePlayer currentPlayer, TicTacToeBoard ticTacToeBoard)
        {
            var winningLines = new WinningLinesGenerator(ticTacToeBoard.Boundries, ticTacToeBoard).PossibleWins();
            foreach (var winningLine in winningLines)
            {
                if (PlayerHasWon(currentPlayer, winningLine))
                    return true;
            }

            return false;
        }
 private int GetPositionMaskForPlayer(ITicTacToePlayer currentPlayer, TicTacToeBoard board)
 {
     var positionMask = 0;
     var gridPosition = 1;
     foreach (var playerOnPosition in board)
     {
         if (playerOnPosition == currentPlayer)
             positionMask |= 1 << (board.Boundries.TotalNumberOfSquares - gridPosition);
         gridPosition++;
     }
     return positionMask;
 }
Example #15
0
        public void Setup()
        {
            _opponent = Substitute.For <ITicTacToePlayer>();
            _opponent.Tile.Returns(BoardTile.O);
            _opponent.GetAction(Arg.Any <Board>())
            .Returns(new TicTacToeAction
            {
                Position = 0,
                Tile     = BoardTile.O
            });

            _env = new TicTacToeEnvironment(_opponent);
        }
Example #16
0
        public IGameResult GetGameResult(
            ITicTacToeBoard ticTacToeBoard,
            ITicTacToePlayer player1,
            ITicTacToePlayer player2
            )
        {
            var cells = ticTacToeBoard.Cells();
            var diagonal = IsWinOnDiagonal(cells);
            if (diagonal != TicTacToePiece.None)
            {
                return new TicTacToeGameResult()
                {
                    IsDraw = false,
                    Winner = diagonal == player1.Piece ? player1 : player2,
                    Loser = diagonal == player1.Piece ? player2 : player1,
                };
            }

            var horizontal = IsWinOnHorizontal(cells);
            if (horizontal != TicTacToePiece.None)
            {
                return new TicTacToeGameResult()
                {
                    IsDraw = false,
                    Winner = horizontal == player1.Piece ? player1 : player2,
                    Loser = horizontal == player1.Piece ? player2 : player1,
                };
            }

            var vertical = IsWinOnVertical(cells);
            if (vertical != TicTacToePiece.None)
            {
                return new TicTacToeGameResult()
                {
                    IsDraw = false,
                    Winner = vertical == player1.Piece ? player1 : player2,
                    Loser = vertical == player1.Piece ? player2 : player1,
                };
            }

            if (IsDrawn(ticTacToeBoard))
            {
                return new TicTacToeGameResult()
                {
                    IsDraw = true
                };
            }

            throw new Exception("No valid result found");
        }
Example #17
0
 public TicTacToeGame(
     ITicTacToeBoard ticTacToeBoard,
     ITicTacToePlayer player1,
     ITicTacToePlayer player2,
     IGameJudge gameJudge,
     IGameRenderer gameRenderer,
     IGamePauser gamePauser
     )
 {
     _ticTacToeBoard = ticTacToeBoard;
     _player1 = player1;
     _player2 = player2;
     _gameJudge = gameJudge;
     _gameRenderer = gameRenderer;
     _gamePauser = gamePauser;
 }
Example #18
0
        public GameBuilder NaughtsWins()
        {
            _naughts = new PrepopulatedPlayerStub(new[]
                {
                    new BoardPosition(1, 1),
                    new BoardPosition(1, 2),
                    new BoardPosition(1, 3),
                });
            _crosses = new PrepopulatedPlayerStub(new[]
                {
                    new BoardPosition(2, 1),
                    new BoardPosition(2, 2),
                });

            return this;
        }
Example #19
0
        public void PlayTurn()
        {
            if(IsFinished)
                throw new GameOverException();

            // this design isn't perfect because it doesn't feed back to the
            // player if they have made an invalid move
            var position = CurrentPlayer.PlayTurn(_board);
            if(_board[position] == null)
            {
                _board = _board.UpdateBoard(position, CurrentPlayer);
                if (HasMadeWinningMove(CurrentPlayer))
                    Winner = CurrentPlayer;

                CurrentPlayer = CurrentPlayer == Naughts ? Crosses : Naughts;
            }
        }
Example #20
0
        public TicTacToeGameTests()
        {
            TicTacToeBoard = Substitute.For<ITicTacToeBoard>();
            Player1 = Substitute.For<ITicTacToePlayer>();
            Player2 = Substitute.For<ITicTacToePlayer>();
            GameJudge = Substitute.For<IGameJudge>();
            GameRenderer = Substitute.For<IGameRenderer>();
            GamePauser = Substitute.For<IGamePauser>();

            Sut = new TicTacToeGame(
                TicTacToeBoard,
                Player1,
                Player2,
                GameJudge,
                GameRenderer,
                GamePauser
                );
        }
Example #21
0
        public void Play()
        {
            _ticTacToeBoard.Reset();
            _gameRenderer.RenderStart(_player1, _player2, _ticTacToeBoard);

            while (_gameJudge.IsGameInPlay(_ticTacToeBoard))
            {
                _gamePauser.Pause();
                var player = GetNextPlayer();

                player.TakeTurn(_ticTacToeBoard);

                _lastTicTacToePlayerToPlay = player;
                _gameRenderer.RenderBoard(_ticTacToeBoard);
            }

            var result = _gameJudge.GetGameResult(_ticTacToeBoard, _player1, _player2);

            _gameRenderer.RenderResult(result);
        }
Example #22
0
        private void RunSingleGame(ITicTacToePlayer player1, ITicTacToePlayer player2)
        {
            var game = new TicTacToeGame(Board.CreateEmptyBoard(), player1, player2);

            while (!game.IsFinished())
            {
                Print(RenderBoard(game.Board));
                game.DoNextTurn();
            }

            Print(RenderBoard(game.Board));

            if (game.Winner().HasValue)
            {
                Print($"The winner is: {game.Winner()}!");
            }
            else
            {
                Print("Draw!");
            }
        }
Example #23
0
 public PlayerAgent(ITicTacToePlayer ticTacToePlayer)
 {
     _ticTacToePlayer = ticTacToePlayer;
 }
 private bool PlayerHasWon(ITicTacToePlayer currentPlayer, IEnumerable<ITicTacToePlayer> winningLine)
 {
     return winningLine.All(player => player == currentPlayer);
 }
Example #25
0
 private bool HasMadeWinningMove(ITicTacToePlayer player)
 {
     var winEvaluator = new EquationWinEvaluator();
     return winEvaluator.HasPlayerWon(player, _board);
 }
Example #26
0
 public HeadlessRunner(ITicTacToePlayer player1, ITicTacToePlayer player2)
 {
     _player1      = player1;
     _player2      = player2;
     _winnerRecord = new List <BoardTile?>();
 }
Example #27
0
 public void Train(ITicTacToePlayer opponent, int?numGamesLimit = null)
 {
     throw new NotImplementedException();
 }
Example #28
0
 private bool IsFinalMove(TicTacToeBoard board, ITicTacToePlayer currentPlayer, ITicTacToePlayer otherPlayer)
 {
     return board.IsComplete || (new EquationWinEvaluator()).HasPlayerWon(currentPlayer, board);
 }
Example #29
0
 public MiniMaxPlayer(ITicTacToePlayer opponent)
 {
     _opponent = opponent;
 }
Example #30
0
 public TicTacToeEnvironment(ITicTacToePlayer opponent)
 {
     _opponent = opponent;
     Reset();
 }