Beispiel #1
0
        public Player(List<Player> players, OutputType outputType)
        {
            writer = new Output(outputType);
            writer.Write("Enter the name of the player: ");
            this.name = Console.ReadLine().Trim();

            writer.Write("Enter the piece you want to use: ");
            this.piece = new Piece(Console.ReadLine().Trim());
            while (players.Select(p => p).Where(x => string.Compare(x.Piece.Symbol, this.piece.Symbol) == 0).Count() >= 1)
            {
                writer.Write("That piece has already been taken.\nChoose a different piece: ");
                this.piece = new Piece(Console.ReadLine().Trim());
            }

            writer.Write("Is this player HUMAN or AI: ");
            do
            {
                var playerType = Console.ReadLine().Trim();
                PlayerType humanOrNot;
                if (Enum.TryParse<PlayerType>(playerType.ToUpper(), out humanOrNot))
                {
                    this.playerType = humanOrNot;
                    break;
                }
                writer.Write("Enter a valid Player Type: [human] or [AI]: ");
                continue;
            } while (true);

            this.order = -1;
        }
Beispiel #2
0
 public void WhenAllPositionAreFullAndNoneWins_ThenGameIsDraw()
 {
     BoardState target = new BoardState(null);
     var board = new Piece[3, 3];
     board[0, 0] = Piece.O; board[1, 0] = Piece.X; board[2, 0] = Piece.O;
     board[0, 1] = Piece.O; board[1, 1] = Piece.X; board[2, 1] = Piece.X;
     board[0, 2] = Piece.X; board[1, 2] = Piece.O; board[2, 2] = Piece.O;
     target.Board = board;
     bool isDraw = target.IsDraw();
     Assert.AreEqual(true, isDraw);
 }
Beispiel #3
0
 public void WhenHas3OInRow_ThenOWins()
 {
     BoardState target = new BoardState(null);
     var board = new Piece[3, 3];
     board[0, 0] = Piece.O; board[1, 0] = Piece.Empty; board[2, 0] = Piece.X;
     board[0, 1] = Piece.X; board[1, 1] = Piece.O;     board[2, 1] = Piece.Empty;
     board[0, 2] = Piece.X; board[1, 2] = Piece.Empty; board[2, 2] = Piece.O;
     target.Board = board;
     bool isXWinner = target.IsWinner(Piece.O);
     Assert.AreEqual(true, isXWinner);
 }
 public void WhenComputerPlayerHasPossibilityToWinInNextMove_ThenDoMoveMustMustSelectWinningMove()
 {
     ComputerPlayer target = new ComputerPlayer();
     var board = new Piece[3, 3];
     board[0, 0] = Piece.X; board[1, 0] = Piece.O; board[2, 0] = Piece.X;
     board[0, 1] = Piece.X; board[1, 1] = Piece.O; board[2, 1] = Piece.Empty;
     board[0, 2] = Piece.Empty; board[1, 2] = Piece.Empty; board[2, 2] = Piece.Empty;
     var boardState = new BoardState(null);
     boardState.Board = board;
     target.DoMove(Piece.O, boardState);
     Assert.AreEqual(Piece.O, boardState.Board[1, 2]);
 }
Beispiel #5
0
        public void GetPieceTest_WhenFieldIsX_ThenGetPieceReturnsX()
        {
            BoardState target = new BoardState(null);
            var board = new Piece[3, 3];
            board[0, 0] = Piece.Empty; board[1, 0] = Piece.X;     board[2, 0] = Piece.Empty;
            board[0, 1] = Piece.Empty; board[1, 1] = Piece.Empty; board[2, 1] = Piece.Empty;
            board[0, 2] = Piece.Empty; board[1, 2] = Piece.Empty; board[2, 2] = Piece.Empty;
            target.Board = board;

            Piece actualPiece = target.GetPiece(1, 0);
            Assert.AreEqual(Piece.X, actualPiece);
        }
 public void WhenFirstPlayerStartsInCorner_ThenDoMoveMustPutPieceInCenter()
 {
     ComputerPlayer target = new ComputerPlayer();
     var board = new Piece[3, 3];
     board[0, 0] = Piece.X; board[1, 0] = Piece.Empty; board[2, 0] = Piece.Empty;
     board[0, 1] = Piece.Empty; board[1, 1] = Piece.Empty; board[2, 1] = Piece.Empty;
     board[0, 2] = Piece.Empty; board[1, 2] = Piece.Empty; board[2, 2] = Piece.Empty;
     var boardState = new BoardState(null);
     boardState.Board = board;
     target.DoMove(Piece.O, boardState);
     Assert.AreEqual(Piece.O, boardState.Board[1, 1]);
 }
 public void WhenAllButOnePositionsAreFull_ThenDoMoveUsesLastPosition()
 {
     ComputerPlayer target = new ComputerPlayer();
     var board = new Piece[3, 3];
     board[0, 0] = Piece.O; board[1, 0] = Piece.X; board[2, 0] = Piece.O;
     board[0, 1] = Piece.O; board[1, 1] = Piece.O; board[2, 1] = Piece.X;
     board[0, 2] = Piece.X; board[1, 2] = Piece.X; board[2, 2] = Piece.Empty;
     var boardState = new BoardState(null);
     boardState.Board = board;
     target.DoMove(Piece.O, boardState);
     Assert.AreEqual(Piece.O, boardState.Board[2, 2]);
 }
Beispiel #8
0
        /// <summary>
        /// Does a computer move using minimax algorithm.
        /// http://neverstopbuilding.com/minimax
        /// </summary>
        public int DoMove(Piece piece, BoardState board)
        {
            if (board.IsWinner(Piece.X))
            {
                return 10;
            }
            else if (board.IsWinner(Piece.O))
            {
                return -10;
            }
            else if (board.IsDraw())
            {
                return 0;
            }
            else
            {
                var boardStatesForNextMove = new List<BoardState>();
                var emptyPositions = GetEmptyFields(board);
                var scores = new List<int>();
                foreach (var move in emptyPositions)
                {
                    BoardState boardForThisMove = board.Clone();
                    boardForThisMove.SetPiece(move.X, move.Y, piece);
                    boardStatesForNextMove.Add(boardForThisMove);
                    Piece nextPiece = piece == Piece.X ? Piece.O : Piece.X;
                    scores.Add(DoMove(nextPiece, boardForThisMove));
                }

                int max = scores.Max();
                int maxIndex = scores.IndexOf(max);
                int min = scores.Min();
                int minIndex = scores.IndexOf(min);
                if (piece == Piece.X)
                {
                    var selectedMove = emptyPositions[maxIndex];
                    board.SetPiece(selectedMove.X, selectedMove.Y, piece);
                    return max;
                }
                else
                {
                    var selectedMove = emptyPositions[minIndex];
                    board.SetPiece(selectedMove.X, selectedMove.Y, piece);
                    return min;
                }
            }
        }
        public void DoMoveTest_WhenAnIllegalMoveIsEntered_ThenUserMustEnterALegalMove()
        {
            var reader = new InputReaderFake();
            reader.SetUserInput("a2");
            reader.SetUserInput("a2");
            reader.SetUserInput("a1");
            var target = new HumanPlayer(reader);
            var boardState = new BoardState(null);
            var board = new Piece[3, 3];
            board[0, 0] = Piece.Empty; board[1, 0] = Piece.X; board[2, 0] = Piece.Empty;
            board[0, 1] = Piece.Empty; board[1, 1] = Piece.Empty; board[2, 1] = Piece.Empty;
            board[0, 2] = Piece.Empty; board[1, 2] = Piece.Empty; board[2, 2] = Piece.Empty;
            boardState.Board = board;

            int retValue = target.DoMove(Piece.O, boardState);
            Assert.AreEqual(0, retValue);
            Assert.AreEqual(Piece.O, boardState.GetPiece(0, 0));
        }
Beispiel #10
0
        public bool IsWinner(Piece piece)
        {
            if ((GetPiece(0, 0) == piece && GetPiece(0, 1) == piece && GetPiece(0, 2) == piece) ||
            (GetPiece(1, 0) == piece && GetPiece(1, 1) == piece && GetPiece(1, 2) == piece) ||
            (GetPiece(2, 0) == piece && GetPiece(2, 1) == piece && GetPiece(2, 2) == piece) ||

            (GetPiece(0, 0) == piece && GetPiece(1, 0) == piece && GetPiece(2, 0) == piece) ||
            (GetPiece(0, 1) == piece && GetPiece(1, 1) == piece && GetPiece(2, 1) == piece) ||
            (GetPiece(0, 2) == piece && GetPiece(1, 2) == piece && GetPiece(2, 2) == piece) ||

            (GetPiece(0, 0) == piece && GetPiece(1, 1) == piece && GetPiece(2, 2) == piece) ||
            (GetPiece(2, 0) == piece && GetPiece(1, 1) == piece && GetPiece(0, 2) == piece))
            {
                return true;
            }

            return false;
        }
Beispiel #11
0
        public int DoMove(Piece piece, BoardState boardState)
        {
            GetUserInput();
            do
            {
                if (IsFinished())
                {
                    return -100;
                }

                if (IsInputValid() && boardState.GetPiece(MoveCoordinatesX, MoveCoordinatesY) == Piece.Empty)
                {
                    boardState.SetPiece(MoveCoordinatesX, MoveCoordinatesY, piece);
                    return 0;
                }

                GetUserInput();
            }
            while (true);
        }
 public void GetEmptyFieldsTest_WhenTwoFieldsAreEmpty_ThenReturnThoseEmptyFields()
 {
     ComputerPlayer target = new ComputerPlayer();
     var board = new Piece[3, 3];
     board[0, 0] = Piece.O; board[1, 0] = Piece.X; board[2, 0] = Piece.O;
     board[0, 1] = Piece.O; board[1, 1] = Piece.O; board[2, 1] = Piece.Empty;
     board[0, 2] = Piece.X; board[1, 2] = Piece.X; board[2, 2] = Piece.Empty;
     var boardState = new BoardState(null);
     boardState.Board = board;
     List<Position> emptyFields = target.GetEmptyFields(boardState);
     List<Position> expectedEmptys = new List<Position>()
     {
         new Position {X = 2, Y = 1},
         new Position {X = 2, Y = 2}
     };
     Assert.AreEqual(emptyFields.Count == expectedEmptys.Count, true);
     int i = 0;
     foreach (var position in expectedEmptys)
     {
         Assert.AreEqual(true, position.IsEqual(emptyFields[i]));
         i++;
     }
 }
 public RandomPlayer(string name, Piece piece, IValidMoveGetter moveGetter)
 {
     Name = name;
     Piece = piece;
     _moveGetter = moveGetter;
 }
 private void EnsureResult(IEnumerable<Point> xs, IEnumerable<Point> os, Piece winner)
 {
     var grid = GetMockedGrid(xs, os);
     Assert.AreEqual(winner, GetDetector().GetWinner(grid.Object));
 }
 public void PlacePiece(Piece piece)
 {
     Content = piece;
 }
Beispiel #16
0
 public void SetPiece(int x, int y, Piece piece)
 {
     _board[x, y] = piece;
 }
Beispiel #17
0
 /// <summary>
 /// Add piece.
 /// </summary>
 public void AddPiece(Piece piece)
 {
     _board.Add(piece.Position, piece);
 }
Beispiel #18
0
 /// <summary>
 /// Turn.
 /// </summary>
 public void Turn(Piece piece)
 {
 }
Beispiel #19
0
 public void WhenNotAllPositionsFull_ThenGameIsNotDraw()
 {
     BoardState target = new BoardState(null);
     var board = new Piece[3, 3];
     board[0, 0] = Piece.O; board[1, 0] = Piece.X; board[2, 0] = Piece.O;
     board[0, 1] = Piece.X; board[1, 1] = Piece.X; board[2, 1] = Piece.X;
     board[0, 2] = Piece.X; board[1, 2] = Piece.Empty; board[2, 2] = Piece.X;
     target.Board = board;
     bool isDraw = target.IsDraw();
     Assert.AreEqual(false, isDraw);
 }