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; }
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); }
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]); }
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]); }
/// <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)); }
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; }
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; }
public void SetPiece(int x, int y, Piece piece) { _board[x, y] = piece; }
/// <summary> /// Add piece. /// </summary> public void AddPiece(Piece piece) { _board.Add(piece.Position, piece); }
/// <summary> /// Turn. /// </summary> public void Turn(Piece piece) { }
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); }