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); }
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); }
/// <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); } } }
/// <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 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 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 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); }
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); }
public void WhenSettingYIntoField_ThenThatFieldIsOccupiedByY() { BoardState target = new BoardState(null); target.SetPiece(1, 2, Piece.O); Assert.AreEqual(Piece.O, target.Board[1, 2]); }
public void WhenSettingXIntoField_ThenThatFieldIsOccupiedByX() { BoardState target = new BoardState(null); target.SetPiece(0, 0, Piece.X); Assert.AreEqual(Piece.X, target.Board[0, 0]); }