public static string IsLegalMovement(PlayerMove currentMove, Board i_Board) { bool isValidMovement = true; Square sourceSquare; Square destinationSquare; char currentUserCoinType; char otherUserCoinType; bool tryingToJump; Coin[,] boardArray = i_Board.BoardArray; sourceSquare = currentMove.CurrentSquare; destinationSquare = currentMove.NextSquare; string errorMessage = string.Empty; if (!movementIndexesInRange(currentMove, i_Board.BoardSize)) { isValidMovement = false; errorMessage = ErrorMessageGenerator.OutOfBoundMessage(); } else { Coin currentCoin = boardArray[sourceSquare.RowIndex, sourceSquare.ColumnIndex]; if (i_Board.IsEmptyAtSquare(sourceSquare)) { isValidMovement = false; errorMessage = ErrorMessageGenerator.NoCoinToMoveMessage(); } if (isValidMovement) { currentUserCoinType = currentCoin.Type; otherUserCoinType = currentUserCoinType == Constants.k_FirstCoinType ? Constants.k_SecondCoinType : Constants.k_FirstCoinType; if (!currentCoin.Type.Equals(currentUserCoinType)) { isValidMovement = false; errorMessage = ErrorMessageGenerator.NoCoinToMoveMessage(); } else if (currentCoin.IsKing) { tryingToJump = KingValidation.isTryingToJump_King(currentMove); if (tryingToJump) { isValidMovement = IsValidJump(currentMove, otherUserCoinType, i_Board); if (!isValidMovement) { errorMessage = ErrorMessageGenerator.InvalidJumpMessage(); } } else { if (!i_Board.IsEmptyAtSquare(destinationSquare)) { isValidMovement = false; errorMessage = ErrorMessageGenerator.SquareIsBlockedMessage(); } else { isValidMovement = KingValidation.isDiagonal_King(currentMove); if (!isValidMovement) { errorMessage = ErrorMessageGenerator.NotDiagonalMessage(); } } } } else if (IsTryingToJump(currentMove, Convert.ToString(currentUserCoinType))) { if (!IsValidJump(currentMove, otherUserCoinType, i_Board)) { errorMessage = ErrorMessageGenerator.InvalidJumpMessage(); } } else if (!i_Board.IsEmptyAtSquare(destinationSquare)) { isValidMovement = false; errorMessage = ErrorMessageGenerator.SquareIsBlockedMessage(); } else if (!IsDiagonal(currentMove, currentUserCoinType)) { isValidMovement = false; errorMessage = ErrorMessageGenerator.NotDiagonalMessage(); } } } return(errorMessage); }