예제 #1
0
        private (bool Castled, string Error) CastleQueenSide(Board.Board board)
        {
            KeyValuePair <int, int> rookPos, rookMove, kingMove;

            if (this.Color == PieceColorEnum.Black)
            {
                rookPos  = board.ConvertNotationForMove("a8");
                rookMove = board.ConvertNotationForMove("d8");
                kingMove = board.ConvertNotationForMove("c8");
            }
            else
            {
                rookPos  = board.ConvertNotationForMove("a1");
                rookMove = board.ConvertNotationForMove("d1");
                kingMove = board.ConvertNotationForMove("c1");
            }

            // can't castle if it puts in check. run a simulation
            King kingCopy = (King)board.DeepClone(this);

            Board.Board simBoard = (Board.Board)board.DeepClone(board);
            simBoard.MovePiece(kingCopy, kingMove.Key, kingMove.Value);
            if (!kingCopy.IsInCheck(simBoard))
            {
                return(false, "castling results in a check");
            }

            // castle
            Rook rook = (Rook)board.Instance[rookPos.Key, rookPos.Value];

            board.MovePiece(rook, rookMove.Key, rookMove.Value);
            board.MovePiece(this, kingMove.Key, kingMove.Value);

            return(true, string.Empty);
        }
예제 #2
0
        private (bool CanCastle, string Error) CanCastleQueenSide(Board.Board board)
        {
            var    rookPos  = this.Color == PieceColorEnum.Black ? board.ConvertNotationForMove("a8") : board.ConvertNotationForMove("a1");
            IPiece rookSpot = board.Instance[rookPos.Key, rookPos.Value];

            if (rookSpot != null && rookSpot.Type == PieceTypeEnum.Rook && rookSpot.Color == this.Color)
            {
                var rook = (Rook)rookSpot;
                if (!rook.HasMoved)
                {
                    // check the spots that must be empty in order to castle
                    string[] spotsToCheck = this.Color == PieceColorEnum.Black ? new string[] { "b8", "c8, d8" } : new string[] { "b1", "c1", "d1" };
                    foreach (string spotToCheck in spotsToCheck)
                    {
                        var posToCheck = board.ConvertNotationForMove(spotToCheck);
                        if (board.Instance[posToCheck.Key, posToCheck.Value] != null)
                        {
                            return(false, $"spot {spotToCheck} has a piece");
                        }
                    }

                    return(true, string.Empty);
                }
                else
                {
                    return(false, "rook has moved");
                }
            }
            else if (rookSpot == null)
            {
                return(false, "the queenside rook isn't in its place");
            }
            else
            {
                return(false, "the queenside rook spot is taken");
            }
        }