Ejemplo n.º 1
0
        public void CloneTest_WhenCloning_ThenReturnsCopyButDifferentInstance()
        {
            BoardState target = new BoardState(null);
            target.SetPiece(0, 0, Piece.X);
            var copiedBoard = target.Clone();
            Assert.AreEqual(copiedBoard.GetPiece(0, 0), Piece.X);

            target.SetPiece(0, 1, Piece.X);
            Assert.AreEqual(target.GetPiece(0, 1), Piece.X);
            Assert.AreEqual(copiedBoard.GetPiece(0, 1), Piece.Empty);
        }
Ejemplo n.º 2
0
 public void CloneTest_WhenCloning_ThenReturnsCopy()
 {
     BoardState target = new BoardState(null);
     target.SetPiece(0, 0, Piece.X);
     var copiedBoard = target.Clone();
     Assert.AreEqual(copiedBoard.GetPiece(0, 0), Piece.X);
 }
Ejemplo n.º 3
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);
                }
            }
        }
Ejemplo n.º 4
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;
                }
            }
        }
Ejemplo n.º 5
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);
        }
Ejemplo n.º 6
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);
        }
Ejemplo n.º 7
0
 public void WhenXHasNot3XInRow_ThenXDoesNotWin()
 {
     BoardState target = new BoardState(null);
     target.SetPiece(0, 0, Piece.X);
     target.SetPiece(1, 1, Piece.X);
     target.SetPiece(2, 1, Piece.X);
     bool isXWinner = target.IsWinner(Piece.X);
     Assert.AreEqual(false, isXWinner);
 }
Ejemplo n.º 8
0
 public void WhenXHas3XInRow_ThenXWins()
 {
     BoardState target = new BoardState(null);
     target.SetPiece(0, 1, Piece.X);
     target.SetPiece(1, 1, Piece.X);
     target.SetPiece(2, 1, Piece.X);
     bool isXWinner = target.IsWinner(Piece.X);
     Assert.AreEqual(true, isXWinner);
 }
Ejemplo n.º 9
0
 public void WhenSettingYIntoField_ThenThatFieldIsOccupiedByY()
 {
     BoardState target = new BoardState(null);
     target.SetPiece(1, 2, Piece.O);
     Assert.AreEqual(Piece.O, target.Board[1, 2]);
 }
Ejemplo n.º 10
0
 public void WhenSettingXIntoField_ThenThatFieldIsOccupiedByX()
 {
     BoardState target = new BoardState(null);
     target.SetPiece(0, 0, Piece.X);
     Assert.AreEqual(Piece.X, target.Board[0, 0]);
 }