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);
            }
        }
Example #2
0
        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);
        }