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 void GetAvailableMove(Board.Board board, List <KeyValuePair <int, int> > availableMoves, int rowInterval, int colInterval) { var row = this.CurrentLocation_x + rowInterval; var column = this.CurrentLocation_y + colInterval; if (board.IsInRange(row, column)) { var piece = board.Instance[row, column]; if (piece == null || (piece != null && piece.Color != this.Color)) { var kingCopy = (King)board.DeepClone(this); var simBoard = (Board.Board)board.DeepClone(board); simBoard.MovePiece(kingCopy, row, column); if (!kingCopy.IsInCheck(simBoard)) { availableMoves.Add(new KeyValuePair <int, int>(row, column)); } } } }