- 大学三年级
- 325019
- 744
- 13
- 1748 朵
- 2863 个
- 854 个
- 20600
- 2009-10-23
|
1#
t
T
发表于 2022-10-10 09:18
|
|只看楼主
大家好,我是公众号3分钟学堂的郭立员~ 前言 从广义上说,脚本程序中每一个命令都是一个函数,但是通常我们会把用function命令封装的代码段叫做函数。 函数的核心作用就是减少代码的行数。 我们使用函数的目的是可以提高编写脚本的速度,因为原本需要很多行代码实现的功能,在封装成函数后,只需要一行调用函数的代码就可以使用,如果使用别人封装好的函数,你可以在不需要知道函数内代码是什么的情况下直接调用。 一、函数的组成部分 一个函数的定义包含4个部分: 函数名(function name) 形参列表(parameter list),函数名后面括号内的部分,允许为空 函数体(function body) 返回值(return value) 隐藏部分 返回类型(return type) 用一个简单的例子来介绍函数的组成部分 - Function 加法(a,b)
- Dim c
- c = a + b
- 加法=c
- End Function
复制代码在例子中, ①函数名是“加法” ②形参列表是(a,b) ③函数体是 ④返回值是“加法=c”,也就是把c的值作为函数的返回值 ⑤返回类型,也就是返回值的类型,在例子中c是返回值,c是来自a和b的加法运算,所以c是数值型,那么返回类型就是数值类型。 对于按键来说并没有强制要求写上返回类型,所以这部分是可以忽略的。 二、封装函数的流程 以下我们用封装一个找图函数作为例子: ①先编写“函数体”部分的内容,因为它是函数的核心功能,每个函数之所以不同,就是因为函数体的代码不同。 所谓函数体就是我们正常编写脚本的代码,比如我们要封装一个找图函数。 它的函数体是 - Dim intx,inty
- FindPic 0, 0, 0, 0, "Attachment:1.png","000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- TracePrint intx,inty
- End If
复制代码②填写一个函数名,封装一个无参无返回值的函数 - Function 找图()
- Dim intx,inty
- FindPic 0, 0, 0, 0, "Attachment:1.png","000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- TracePrint intx,inty
- End If
- End Function
复制代码很多新手朋友写到这一步就完事了,在语法和用法上没有错误,但是定义的是“死函数”,函数内部都是不变的,并且在调用函数时没有反馈。 ③给函数添加形参列表 什么是形参、什么是实参? 形参:找图(a) 实参:找图("1.png") 在脚本中,括号里面是变量的就是形参,一般是用在定义函数时 Function 找图(a)在脚本中,括号里面是字符串、数值或者其他非变量的,就是实参,一般是用在调用函数 call 找图( "1.png") 为什么这一步叫添加形参列表呢? 因为形参不止有一个,可以添加无数个,至于有没有上限,在按键中我没有测试过,至少添加十几二十个形参是没问题的。 为了方便大家学习,以下所有形参和实参,我们统一写成参数。 函数的参数是可以让函数具有可变性的,比如: 找图函数,如果把图片路径名称当做参数,就可以用在不同图片上。 - Function 找图(图片名称)
- Dim intx,inty
- FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- TracePrint intx,inty
- End If
- End Function
复制代码在代码中我们用 “图片名称”代替"Attachment:1.png",在调用找图函数的时候,就不只是可以找图片1.png了,可以是任意图片了 - 找图("Attachment:1.png")
- Function 找图(图片名称)
- Dim intx,inty
- FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- TracePrint intx,inty
- End If
- End Function
复制代码上面是图片路径整体替换,也可以局部替换,比如用“图片名称”替换“1.png” - 找图("1.png")
- Function 找图(图片名称)
- Dim intx,inty
- FindPic 0, 0, 0, 0, "Attachment:"&图片名称,"000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- TracePrint intx,inty
- End If
- End Function
复制代码函数加什么参数,是根据我们的功能需要,如果在函数体中是可变的部分本质上是都可以作为参数的。 比如找图函数加个找图范围的参数: - 找图(0,0,0,0,"1.png")
- Function 找图(x1,y1,x2,y2,图片名称)
- Dim intx,inty
- FindPic x1,y1,x2,y2, "Attachment:"&图片名称,"000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- TracePrint intx,inty
- End If
- End Function
复制代码因为可变性的原因,同一个功能不同人定义的函数参数未必是一样的,有的人定义的函数有1个参数,有的人定义的函数有10个参数。 两者都是正确的,同时在使用函数过程中,也可以随时添加参数以满足需要。 在网上还有很多老师讲到把数组当做函数的参数,这种是用在有很多参数的情况,就是把多个参数放到一个数组里面,每一个参数对应一个数组下标。 - Dim 图1={0,0,0,0,"1.png"}
- 找图(图1)
- Function 找图(arr)
- Dim intx,inty
- FindPic arr(0),arr(1),arr(2),arr(3), "Attachment:"&arr(4),"000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- TracePrint intx,inty
- End If
- End Function
复制代码在函数中参数只有一个数组类型的参数arr,它是所有参数的合集,在函数体内部还是要把每一个数组下标内容写到对应位置,形成一一对应的关系。 这种使用方式一般是在脚本开始部分定义大量的数组参数,后期使用的时候,直接填写对应的数组名称当做参数。 - Dim 图1={0,0,0,0,"1.png"}
- Dim 图2={0,0,0,0,"2.png"}
- Dim 图3={0,0,0,0,"3.png"}
- Dim 图4={0,0,0,0,"4.png"}
- Dim 图5={0,0,0,0,"5.png"}
- 找图(图1)
- Function 找图(arr)
- Dim intx,inty
- FindPic arr(0),arr(1),arr(2),arr(3), "Attachment:"&arr(4),"000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- TracePrint intx,inty
- End If
- End Function
复制代码注意:在按键中自定义函数不能有可省略参数,也就是你定义几个参数,调用函数就必须填写几个,否则就会报语法错误。 ④返回值 返回值的写法很简单,就是函数名=要返回的内容 需要注意的是返回值的有效性 比如:找图函数的返回值可以是找图得到坐标,这就是一个有效的返回值。 如果找图函数中包含了点击找到位置的功能,此时返回值写成是否找到图(是否点击)的true或者false可能会更好一些。 返回值还有一个相对难点,就是返回值是多个值。 还是找图函数的例子,如果返回值是坐标,那么就是2个值,intx,inty 这种情况写法有两种:一是多个返回内容拼接在一起,用分隔符号隔开。二是用数组,把每一个返回内容放入数组当中。 两者不同之处是返回值的类型,前者是字符串类型,后者是数组类型。 a.拼接返回值写法 b.数组返回值写法 - Dim 返回数组=找图("Attachment:1.png")
- TracePrint 返回数组(0)
- TracePrint 返回数组(1)
- Function 找图(图片名称)
- Dim intx,inty
- Dim arr()
- FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- arr(0) = intx
- arr(1) = inty
- 找图 = arr
- End If
- End Function
复制代码三、局部变量和全局变量 在函数内部用dim 定义的变量就是局部变量,在函数外面定义的就是全局变量。 优先级:在函数内部局部变量优先级高于全局变量,也就是同一个变量,在函数内部和函数外部同时定义了,函数调用的是内部定义的变量。 - Dim a=1
- Call 函数()
- Function 函数()
- Dim a=2
- TracePrint a
- End Function
复制代码调试输出结果:a=2 考虑到优先级的原因,如果函数内部想要调用函数外部定义的全局变量,就不能再函数内定义此变量(局部变量)。 - Dim a=1
- Call 函数()
- Function 函数()
- TracePrint a
- End Function
复制代码调试输出结果:a=1 当只有全局变量时,这个变量既可以在函数内部使用,也可以在函数外部使用,利用这个特性,我们在需要多个返回值的时候,用全局变量代替返回值。 - Dim x,y
- 找图 ("Attachment:1.png")
- TracePrint x,y
- Function 找图(图片名称)
- Dim intx,inty
- FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- x = intx
- y = inty
- End If
- End Function
复制代码用全局变量x,y代替返回值,在函数中把intx、inty分别复制给x、y,在函数外面直接输出x、y即可。 这种用全局变量代替的方式是假的返回值,对于函数本身返回值可以写true或者false 找到图的情况 找图= true没找到图的情况 找图= false有个是否找到图的返回值,可以加上判断 - Dim x,y
- If 找图("Attachment:1.png") Then
- TracePrint x,y
- Else
- TracePrint "没找到图"
- End If
- Function 找图(图片名称)
- Dim intx,inty
- FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY
- If intX > -1 And intY > -1 Then
- 找图=true
- x = intx
- y = inty
- Else
- 找图=false
- End If
- End Function
复制代码总结: 函数自定义尽可能把函数的4部分都写全,对于多个返回值的情况,可以用拼接、数组方式作为返回值,也可以用全局变量代替。 记住函数的目的节省代码提高编写速度,如果你愿意所有自定义函数都是可以省略的。 =正文完=
|