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); }
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"); } }