public void Initialize() { CleanUp(); _pieces[0, 0] = new ChessBoardPiece(PiecePlayer.Black, PieceRank.Rook); _pieces[1, 0] = new ChessBoardPiece(PiecePlayer.Black, PieceRank.Knight); _pieces[2, 0] = new ChessBoardPiece(PiecePlayer.Black, PieceRank.Bishop); _pieces[3, 0] = new ChessBoardPiece(PiecePlayer.Black, PieceRank.Queen); _pieces[4, 0] = new ChessBoardPiece(PiecePlayer.Black, PieceRank.King); _pieces[5, 0] = new ChessBoardPiece(PiecePlayer.Black, PieceRank.Bishop); _pieces[6, 0] = new ChessBoardPiece(PiecePlayer.Black, PieceRank.Knight); _pieces[7, 0] = new ChessBoardPiece(PiecePlayer.Black, PieceRank.Rook); for (int i = 0; i < BOARD_SIZE; i++) { _pieces[i, 1] = new ChessBoardPiece(PiecePlayer.Black, PieceRank.Pawn); } _pieces[0, 7] = new ChessBoardPiece(PiecePlayer.White, PieceRank.Rook); _pieces[1, 7] = new ChessBoardPiece(PiecePlayer.White, PieceRank.Knight); _pieces[2, 7] = new ChessBoardPiece(PiecePlayer.White, PieceRank.Bishop); _pieces[3, 7] = new ChessBoardPiece(PiecePlayer.White, PieceRank.Queen); _pieces[4, 7] = new ChessBoardPiece(PiecePlayer.White, PieceRank.King); _pieces[5, 7] = new ChessBoardPiece(PiecePlayer.White, PieceRank.Bishop); _pieces[6, 7] = new ChessBoardPiece(PiecePlayer.White, PieceRank.Knight); _pieces[7, 7] = new ChessBoardPiece(PiecePlayer.White, PieceRank.Rook); for (int i = 0; i < BOARD_SIZE; i++) { _pieces[i, 6] = new ChessBoardPiece(PiecePlayer.White, PieceRank.Pawn); } }
internal void SetBoard(string board) { CleanUp(); string[] rows = board.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < rows.Length; i++) { for (int j = 0; j < rows[i].Length; j++) { char piece = rows[i][j]; PiecePlayer pieceColor = char.ToLower(piece) == piece ? PiecePlayer.Black : PiecePlayer.White; PieceRank pieceRank; switch (char.ToLower(piece)) { case '-': pieceColor = PiecePlayer.None; pieceRank = PieceRank.None; break; case 'k': pieceRank = PieceRank.King; break; case 'q': pieceRank = PieceRank.Queen; break; case 'b': pieceRank = PieceRank.Bishop; break; case 'r': pieceRank = PieceRank.Rook; break; case 'p': pieceRank = PieceRank.Pawn; break; case 'n': pieceRank = PieceRank.Knight; break; default: throw new ArgumentOutOfRangeException("board"); } _pieces[j, i] = new ChessBoardPiece(pieceColor, pieceRank); } } }
private void GetPawnMovesEnPassant(PiecePlayer player, List <ChessMove> moves, int column, int row, int columnDelta, int rowDelta) { // En passant move: if (_previousMove != null && IsOccupiedByOpponent(player, column + columnDelta, row) == true) { ChessBoardPiece piece = GetPiece(column + columnDelta, row); if (piece.Rank == PieceRank.Pawn && piece.Player != player) { if (_previousMove.To.HorizontalLocation == column + columnDelta && _previousMove.To.VerticalLocation == row && Math.Abs(_previousMove.To.VerticalLocation - _previousMove.From.VerticalLocation) == 2) { moves.Add(new ChessMove(PieceRank.Pawn, player, column, row, column + columnDelta, row + rowDelta, ChessSpecialMove.EnPassant)); } } } }
private List <ChessMove> MakeMove(ChessMove move, bool validateCheck) { var executedMoves = new List <ChessMove>(); var boardChanges = new List <ChessBoardChange>(); var availableMoves = GetAvailableMoves(CurrentPlayer, move.From.HorizontalLocation, move.From.VerticalLocation, validateCheck); ChessMove selectedMove = availableMoves.Where(o => o.CompareTo(move) == 0).FirstOrDefault(); if (selectedMove == null) { throw new ArgumentOutOfRangeException("move", "Invalid move!"); } executedMoves.Add(selectedMove); switch (selectedMove.SpecialMove) { case ChessSpecialMove.EnPassant: var enPassantPiece = _pieces[selectedMove.To.HorizontalLocation, selectedMove.From.VerticalLocation]; executedMoves.Add( new ChessMove( enPassantPiece.Rank, enPassantPiece.Player, selectedMove.To.HorizontalLocation, selectedMove.From.VerticalLocation, ChessBoardLocation.OUTSIDE_BOARD, ChessBoardLocation.OUTSIDE_BOARD, ChessSpecialMove.Capture)); _pieces[selectedMove.To.HorizontalLocation, selectedMove.From.VerticalLocation] = ChessBoardPiece.Empty; // Capture in board change (in en passant case): boardChanges.Add(new ChessBoardChange(selectedMove.To.HorizontalLocation, selectedMove.From.VerticalLocation, PieceSelection.Capture)); break; case ChessSpecialMove.Castling: int rookStartColumn; int rookEndColumn; if (selectedMove.From.HorizontalLocation < selectedMove.To.HorizontalLocation) { // Right hand side castling rookStartColumn = 7; rookEndColumn = selectedMove.To.HorizontalLocation - 1; } else { // Left hand side castling rookStartColumn = 0; rookEndColumn = selectedMove.To.HorizontalLocation + 1; } var rookPiece = _pieces[rookStartColumn, selectedMove.From.VerticalLocation]; executedMoves.Add( new ChessMove( rookPiece.Rank, rookPiece.Player, rookStartColumn, selectedMove.From.VerticalLocation, rookEndColumn, selectedMove.To.VerticalLocation, ChessSpecialMove.Castling)); _pieces[rookStartColumn, selectedMove.From.VerticalLocation] = ChessBoardPiece.Empty; _pieces[rookEndColumn, selectedMove.From.VerticalLocation] = new ChessBoardPiece(rookPiece.Player, rookPiece.Rank); break; case ChessSpecialMove.Promotion: executedMoves.Add( new ChessMove( selectedMove.Rank, selectedMove.Player, selectedMove.From.HorizontalLocation, selectedMove.From.VerticalLocation, ChessBoardLocation.OUTSIDE_BOARD, ChessBoardLocation.OUTSIDE_BOARD, ChessSpecialMove.PromotionOut)); executedMoves.Add( new ChessMove( PieceRank.Queen, selectedMove.Player, ChessBoardLocation.OUTSIDE_BOARD, ChessBoardLocation.OUTSIDE_BOARD, selectedMove.To.HorizontalLocation, selectedMove.To.VerticalLocation, ChessSpecialMove.PromotionIn)); // Use default promotion to queen: ChessBoardPiece piece = _pieces[selectedMove.From.HorizontalLocation, selectedMove.From.VerticalLocation]; piece = new ChessBoardPiece(piece.Player, PieceRank.Queen); _pieces[selectedMove.From.HorizontalLocation, selectedMove.From.VerticalLocation] = piece; break; case ChessSpecialMove.Check: break; case ChessSpecialMove.CheckMate: break; case ChessSpecialMove.None: break; } if (_pieces[selectedMove.To.HorizontalLocation, selectedMove.To.VerticalLocation].Rank != PieceRank.None) { // Capture so let's store it var capturePiece = _pieces[selectedMove.To.HorizontalLocation, selectedMove.To.VerticalLocation]; executedMoves.Add( new ChessMove( capturePiece.Rank, capturePiece.Player, selectedMove.To.HorizontalLocation, selectedMove.To.VerticalLocation, ChessBoardLocation.OUTSIDE_BOARD, ChessBoardLocation.OUTSIDE_BOARD, ChessSpecialMove.Capture)); // Capture in board change: boardChanges.Add(new ChessBoardChange(selectedMove.To.HorizontalLocation, selectedMove.To.VerticalLocation, PieceSelection.Capture)); } else { // Move to as board change: boardChanges.Add(new ChessBoardChange(selectedMove.To.HorizontalLocation, selectedMove.To.VerticalLocation, PieceSelection.PreviousMoveTo)); } _pieces[selectedMove.To.HorizontalLocation, selectedMove.To.VerticalLocation] = _pieces[selectedMove.From.HorizontalLocation, selectedMove.From.VerticalLocation]; _pieces[selectedMove.From.HorizontalLocation, selectedMove.From.VerticalLocation] = ChessBoardPiece.Empty; // Move from as board change: boardChanges.Add(new ChessBoardChange(selectedMove.From.HorizontalLocation, selectedMove.From.VerticalLocation, PieceSelection.PreviousMoveFrom)); _previousMove = selectedMove; CurrentPlayer = CurrentPlayer == PiecePlayer.White ? PiecePlayer.Black : PiecePlayer.White; _moves.Push(executedMoves); _boardChanges.Push(boardChanges); return(executedMoves); }