话说,很多新人不懂得使用子程序,或者不是很理解子程序的概念,以至于在面对重复代码的时候使用很多Goto语句,导致程序上的逻辑混乱,调试困难,其实。有很大一部的goto语句,我们可以用子程序来替代。使用子程序可以让我们的脚本逻辑变得更加清晰,并且易于调试。让我们先看看按键宝典上对于子程序的解释
子程序,我们可以把它理解为在一个脚本中,如果其中有些脚本内容优化完全相同或是相似,为了简化脚本,可以把这些重复的程序段单独列出,并按一定的格式编写成子程序。主程序在执行过程中如果需要某一子程序,通过调用命令来调用该子程序,完成后返回主脚本,继续执行后面的脚本。
嗯,好吧,或许看起来有些拗口。 其实。我们可以把我们的整个程序看做成一个人,比如脚本的名字就是人的名字,那么子程序,就是人一个个的动作。让我们来举个实例,比如说拿这个动作。我们每天都要拿很多东西。如果放到代码里,我们要。。。
- 1.杯子
- MoveTo 杯子的x坐标, 杯子的y坐标
- 执行拿起动作
- 2.筷子
- MoveTo 筷子的x坐标, 筷子的y坐标
- 执行拿起动作
- 3.汽车
- MoveTo 汽车的x坐标, 汽车的y坐标
- 执行拿起动作(超人呦~~)
- 。。。。。还有很多
复制代码 我们不难发现。其实我们每次的动作都是相同的,全部都是moveto 某坐标,然后执行拿起动作。这时候。我们就该考虑用子程序了。 下面让我们看看子程序的写法
- Call 拿起(杯子的x坐标, 杯子的y坐标)
- Call 拿起(筷子的x坐标, 筷子的y坐标)
- Call 拿起(汽车的x坐标, 汽车的y坐标)
- 。。。后面想加多少加多少
- Sub 拿起(x,y)
- MoveTo x, y
- 执行拿起动作
- End Sub
复制代码 看。是不是代码要简化很多呢?如果每一个动作的代码都要十条甚至几十条,我们能简化多少行的代码呢。想想吧亲~好。让我们来解释一下这个子程序的意思。 首先,子程序的声明定义。是这样的
- Sub 子程序名(参数a,参数b...)
- 你的重复代码
- End Sub
复制代码
说明参数可以是多个,也可以一个都没有,我们可以把参数理解成一个个未赋值的变量,而调用子程序时填写的参数则是给这个变量赋值,如果我们只想单纯的重复执行一段代码。那么只需写成接下来是调用,当我们写好子程序后。我们只要执行调用的命令,子程序就会执行啦。当然。如果不调用,子程序是不会自动执行的,以下是调用代码调用子程序时填写的参数我们可以看做是给这个变量赋值,当然。如果你的子程序不带参数,这样写也是可以的。接下来,让我们做个小小的实验吧。请在按键精灵的源文件(代码模式)输入以下命令
- Call PrintMsg
- Sub PrintMsg
- MEssageBox "我执行啦"
- End Sub
复制代码 然后调试执行以上代码,我们会发现。跳出了一次弹出框,内容是“我执行啦”同理。如果多调用Call PrintMsg几次,弹出框也就多跳出几次。我们同样也可以试试以下代码
- Sub PrintMsg
- MEssageBox "我执行啦"
- End Sub
复制代码 如果不调用的话。这段代码根本不会执行,接下来让我们看看带参数的子程序(下面代码)
- Call PrintMsg("超人","蜘蛛侠")
- Sub PrintMsg(Nam1,Nam2)
- MEssageBox Nam1&"大战"&Nam2
- End Sub
复制代码 调试执行上面的代码,我们会发现。弹出框的内容变成了超人大战蜘蛛侠。这是,我们子程序中的参数Nam1和Nam2可以看做是变量。而调用子程序的参数"超人","蜘蛛侠"则是在给两个参数赋值
最后。让我们看一下子程序在脚本中的实际应用吧!让我们来看一个找色的例子(下面代码)
- FindColor 376, 401, 891, 703, "1DB6B6", intX, intY
- If intX > 0 And intY > 0 Then
- MoveTo intX, intY
- LeftClick
- End If
- FindColor 376, 401, 891, 703, "A92929", intX, intY
- If intX > 0 And intY > 0 Then
- MoveTo intX, intY
- LeftClick
- End If
- FindColor 376, 401, 891, 703, "7A1EB7", intX, intY
- If intX > 0 And intY > 0 Then
- MoveTo intX, intY
- LeftClick
- End If
- FindColor 376, 401, 891, 703, "2590D8", intX, intY
- If intX > 0 And intY > 0 Then
- MoveTo intX, intY
- LeftClick
- End If
- FindColor 376, 401, 891, 703, "BCBC60", intX, intY
- If intX > 0 And intY > 0 Then
- MoveTo intX, intY
- LeftClick
- End If
- FindColor 376, 401, 891, 703, "1616AF", intX, intY
- If intX > 0 And intY > 0 Then
- MoveTo intX, intY
- LeftClick
- End If
- FindColor 376, 401, 891, 703, "FFFFFF", intX, intY
- If intX > 0 And intY > 0 Then
- MoveTo intX, intY
- LeftClick
- End If
复制代码 好长一段代码吧~哈哈。通过观察。我们不难发现,其实上面代码中每一次找色我们执行的代码都是相同的,只不过每次找的颜色不一样,所以,我们决定用变量替代颜色,用带参数的子程序来修改这段代码。接下来让我们看看以下代码
- Call 找色("1DB6B6")
- Call 找色("A92929")
- Call 找色("7A1EB7")
- Call 找色("2590D8")
- Call 找色("BCBC60")
- Call 找色("1616AF")
- Call 找色("FFFFFF")
- Sub 找色(FColer)
- FindColor 376, 401, 891, 703, FColer, intX, intY
- If intX > 0 And intY > 0 Then
- MoveTo intX, intY
- LeftClick 1
- End If
- End Sub
复制代码 是不是简化多了呢以上的代码,还有更简化的思路~就是。用数组!对数组的概念不理解的盆友~我们下次开讲吧!
如果你感觉我的帖子对您的脚本有点帮助~请给点击右下角评分~给朵花吧!如果以上有什么写的不对的地方~欢迎指出,共同探讨!
|