初窥补红蓝脚本
第一章概述
第一章以补红脚本为基础,从简入繁,从易到杂,详细讲述补红脚本的制作方法与按键精灵基础知识。在描绘整个补红脚本的基础上,为第二章自动打怪脚本的制作方式铺垫基础。如果你能从坚持看完第一章,可以肯定的是,你会达到简单游已有的各专区补红蓝脚本的设计水平。
正文开始:
很多朋友都留言来信询问,如何制作自己的补红补蓝脚本。其实编写方法多种多样,不一而足。在本章里,会以补红蓝脚本做为切入点,实际讲述各种脚本的编写方法。并避开枯燥的编程概念讲解,以实为主,通过大量的应用例子掌握按键精灵。
首先出现在本节中的一些术语做一个简短的说明:
坐标——屏幕象素的坐标值,如当前分辨率为1024×768,则屏幕左上角的坐标是:0,0。右下角则是:1024,768。
抓色/抓点——抓取屏幕内某一象素点的坐标极颜色。使用方法:控制命令->抓点坐标/颜色->在面图上点左键,加入到坐标点->退出抓点->选好坐标颜色后->插入
关键字——按键精灵的保留字,不可以做变量使用。
了解以上内容后,就可以开始我们的脚本之旅了。
先考虑手动玩的情况,当自己的血或者魔法值低于某一临界值时,我们就要使用各种补血补魔的药品了。同样,按键精灵也通过这点判断,如果屏幕坐标的某一点颜色,不等于血或魔的颜色,就该吃药了。我们来看在按键精灵里的写法:
IfColor138109ef844b1
KeyPress491
EndIf
对以上代码解释如下:
如果(138,109)的颜色不等于#ef844b颜色,则
按键<1>
条件结束
其中138,109是血条上任意问题,ef844b是血的颜色。
ifcolor——是按键精灵的关键字,表示这句是判断颜色。
138109——分别是屏幕上X,Y的坐标值。
ef844b——是屏幕上的颜色16进制的BGR值
1——代表条件,该位置可以设置0,1,2三个值,0是相等,1是不等,2是模糊相等
只有以上的代码是不足够的,原因在于以上代码只运行一次。我们要让他不断的检测颜色,这样就达到自动补红补蓝的目的了。
看两句代码:
Rems
Gotos
解释:“Rems”可以理解为在该位置做一个标记s。而“Gotos”则是无条件跳到此标记执行,其中s可以自定义,跳到Rem[标识符]处。rem和goto都是按键精灵的关键字。
这里说一下程序运行机制,每行代码都有行号,脚本解释器要一行一行代码的执行下去,直到执行最后一行代码或碰到EndScript语句(该语句在后面会有讲解),没有任何代码可执行了,程序就退出。我们的目的是让程序持续不断的进行检测,有了rem..goto就完美解决了。来看最后的实例:
Rems
IfColor138109ef844b1
KeyPress491
EndIf
Delay100
Gotos
解释:Delay是暂停运行的关键字,后面跟随的100,表示暂停0.1秒。
整个程序结构清晰,一目了然,不再做过多的解释。补蓝脚本留做作业。
回顾本节所讲解的关键内容:
ifcolor..endif关键字的使用方法
IfColor[X坐标][Y坐标][GBR颜色][对比条件]
rem..goto关键字的使用方法
Rem[标记名]
Goto[标记名]
delay关键字的使用方法
Delay[暂停时间,单位毫秒]
再接再力渗透补红脚本
我碰到过不止一款游戏,用上一节所讲述的脚本,使用并不正常。通过测试分析,了解到游戏画面与血条画面刷新并不同步。这会导致判断错误,解决办法是通过取游戏血条的底色来判断。这个方法只适合底色不变,或变化不大的游戏。对比值给0或2
IfColor1381091b7c5d0
KeyPress491
EndIf
但如果底色是透明的(随环境变化而变化,没有固定的颜色),就比较不好做了,比如韩国的Archlord这款游戏。先给出一篇代码,然后实例讲解。
i=0
For5
IfColor1381092312ff0
i=i+1
EndIf
EndFor
Ifi=0
//加血
EndIf
本段代码引出了两个概念:
1、变量:如第一行的i=0和ifcolor体中的i=i+1
2、循环语句:for5
3、条件语句:ifi=0
下面分别对这两点进行讲解。
1、变量:
变量的概念,对于初学者来说,确实不容易理解。为了加深理解,这里放弃书面语描述,先讲变量如何使用。
我们来描绘这样一段生活中的场景:手里拎了很多东西,并想进超市,那么必然要存包,在从超市出来后,再把存起来的东西取出来。再描绘另外一段生活中的场景:我们取银行存钱,拿着银行卡,可以在很多地方取钱消费。
就这样一个存和取的动作,已经代表了变量的应用,变量就是以上描述中的柜子和银行卡,我们把数据存到变量中,然后在需要该数据的时候再从变量拿出来用。但实质上,变量并不是柜子,他是一个代替品,或者说是代名词,假设我们把数字22存到变量a中,那么a就代表了22,当我们需要使用这个22的时,直接用a来代替他就可以,22并不会从a中消失。而他的特性就像柜子一样,可以储存我们需要他储存的各种数据。
看具体实例:
a=22//在这里我们给一个变量名叫a的变量,赋值22
b=a//这里则是把a变量的值22取出,赋值给b变量,而a变量的值不会消失,此时a和b的值都是22
c=a+b//把a和b的值取出来做加法操作,赋值给c变量,此时a和b的值都是22,c的值是44
a=a-1//这句和数学上的理解就不一样了,首先从a中取出值22,然后减1,最后的结果再送回给a,此时a的值是21
把以下代码复制到按键精灵中,运行一次,看看效果,会加深理解。
a=22
VBSCallCallMessageBox(a)
b=a
VBSCallCallMessageBox(b)
VBSCallCallMessageBox(a)
c=a+b
VBSCallCallMessageBox(a)
VBSCallCallMessageBox(b)
VBSCallCallMessageBox(c)
a=a-1
VBSCallCallMessageBox(a)
对于变量的描述,到此还远远不够,在此,仅解释了变量做加减法的操作,不过对于解释本节开始的代码已经足够。更加复杂的内容,会在以后陆续讲到。
2、循环语句:for5
循环语句比较容易理解,for5的作用就是循环for到endfor中的数据5次。实际看一次效果会彻底理解,不再做过多解释:
for3
VBSCallCallMessageBox(3)
endfor
这段代码会弹出三次3。
3、条件语句:ifi=0
从语意上,我们看的出,如果i等于0,则做某些操作。首先要说的,if作为按键精灵关键字,承担的作用就是分支语句块,关于这点会在下节做详细的描述。if和ifcolor两个关键字是按键精灵唯一的条件语句。条件语句,既满足条件,则执行某些操作,否则执行另外一些操作。在if后面会跟随一个条件判断句,在这里就是i=0。条件判断句的结果只有两种:“真”或“假”,“是”或“非”。要么正确,否则就不正确,没有中立的存在。从变量的解释中,我们看到i的值可能是0,也可能是1到4中任何一个数。如果i是0的话,那么i=0的结果就是“真”,否则他就是“假”。
看具体实例:
if1=2//假
if3=3//真
把下面代码复制到按键精灵中,运行一次,会对if语句有更深的理解。
a=1
ifa=1
VBSCallCallMessageBox(1)
endif
ifa=0
VBSCallCallMessageBox(0)
endif
这里有一个可能引起歧义的地方,我在这里做一个解释。
我们发现在变量赋值的时候,我们使用“=”。而两个值对比的时候,我们还是使用“=”。到底这个=号有几种作用,什么时间发生什么作用呢?这里我说明一下:在=号不需要任何返回值的情况下,则是“赋值运算符”,需要返回值的情况,则是“比较运算符”。在if当中,if语句后面,需要有一个真假值的存在,以判断if下面的语句是否执行。
通过以上两个概念的简单理解,我们来分析一下本节开始部分代码的流程:
i=0//首先给变量i赋值0
For5//循环执行5次ifcolor语句
IfColor1381092312ff0//如果左边(138,109)的颜色等于2312ff
i=i+1//把i变量的值加1
EndIf//结束ifcolor语句块
EndFor//结束循环体
Ifi=0//如果循环5次的颜色都不相等,则
//加血
EndIf//结束if语句块
高级补红蓝脚本写做的基础知识1
本节比较特殊,并不会讲述实际的脚本编写技巧,而是对前两节内容并没表述清晰,或还存在疑问的地方,进行深入剖析。以求把握设计的精髓。
回顾上一节内容:
1、变量的简单使用与赋值方法
2、if..endif语句的使用方式
3、for..endfor语句的使用方式
变量的详细讲述:
在上节中,我们知道了变量的简单应用,这里会对变量有一个详细清晰的描述,并提出一些错误的方法,以求避免。在之前的教程发出去之后,看客们的热情异常高涨,根据之前所讲内容,纷纷编写出自己的脚本,但在其中发现了某些影响全局的错误。其中就包含变量的错误使用。好,我们开始。
VBS中,变量只有一类型,既变体型。何为变体型,这要从VB中讲起。VB中变量分为很多在种类型,包括整型、浮点型、字符串类型等等。对于我们学习按键精灵的编写,深揪VB中的变量类型是毫无用处的,这里表过不谈。
在VBS变量只有一种类型,什么是数据类型呢?我们知道变量是一个存储空间,在VB中每一种变量所能存储的数据是不同的。比如:a=1那么a变量存储的是整数类型,而b=1.1。那么b变量存储的是小数类型。如果这时把a=b,则出现错误。因为整数类型并没有存储小数类型的能力,VB解释器会出现一个执行期错误。关于数据类型,如果想知道更多,在搜索引擎里可以找到非常多的内容。当然,如果不知道,对我们的课程也不会有丝毫影响。
回过之前的话题,VBS变量只有一种数据类型,这种数据类型叫做变体型,既是说,无论你向变量里储存任何数据,那么该变量都可以自动变为相应的数据类型。明确了这点,我们就可以在按键精灵里随意赋值了。这里要提一下字符串类型。因为字符串与其他数据类型的不同性,所以使用方法会略有不同。也是初学者经常出现的问题。
我们暂且可以把数据类型理解为两种:数字类型和字符类型。数字类型包含我们日常所能碰到的所有类型,包括整数,小数,负数。而字符类型则是英文的26个字母及中国汉字和其他国家的文字。
数字类型的赋值方法:
a=32
b=2.2
c=-25
d=-4.4
其中a,b,c,d分别是整数,小数,负数。
字符串的赋值方法:
x="abcdefg"
y="1234567890"
z="你好"
我们发现字符串类型和他的名字一样,是一个一个的字符串接起来的。并且在其左右分别有一个双引号。
通过以上的例子,我们看到,数字类型与字符串类型的唯一区别就在于是否有这个双引号。那么我们可以这样说,只要有双引号的,就是字符串类型,其他都是数字。我们看一个错误的例子,加深理解:
a=32//这句是对滴
a="bb"//这句也是对滴
a="cc"dd"//这句出现错误,程序会以为是字符串cc,而后面dd"无法解析,所以整句话出现错误。
vbscallcallmessagebox(a)//这里的结果是bb,按键精灵忽略所有发生的错误,继续一条运行。
有朋友会问,那如果我要在整个字符串中加一个"号该如何解决呢,这里我告诉大家:在"号内把两个""连起来就可以了,在这里第一个"是转义字符,这里不比深揪,会用就好了。看例子:
a="a""b""c"//a的值是:a"b"c
a="a""b""c"""//a的值是:a"b"c"
a="""a""b""c"//a的值是:"a"b"c
最后一个变量要说的地方,字符串相加。
我们都知道数字可以相加,那么字符串如何相加呢,这里我透彻的告诉大家。按键精灵中的字符串相加有两种运算符,分别是“+”和“&”。“+”只有在两边都是字符串的情况下才可使用。如果两边都是数字,或者只有一方是数字的情况下,使用“&”就可以达到字符串连接的目的。当然,两边都是字符串也可使用“&”号。这里我推荐大家在做字符串连接的时候,不要使用“+”,统一使用“&”操作。这样,看见“+”号就是数字相加;看见“&”就是字符串相加了。这样写也是良好的编程习惯。
高级补红蓝脚本写做的基础知识2
一、if语句详解:
在按键精灵中,只有两个if语句,分别是:ifcolor和if。在前面两节对if和ifcolor都有明确的介绍。这里补充之前没有提到的地方。
先看if语句
原形:if[条件判断式]..else..endif
其中条件判断式比较容易理解,在前一节已经略微的讲过了。这里结合各种数据类型,详细的讲解出来。
if[条件]..else..endif
其中条件是表达式,需要返回真假值,根据返回值执行其余代码。if..else..endif组成了一个条件分支。要么执行if到else中的语句,要么执行else到endif中的语句。而选择分支的条件就根据条件返回的真假值了,返回真,就执行if到else中的代码,返回假就从else开始执行。在没有else的情况下,则条件返回真就执行if到endif中的语句,否则就跳过整个if块,从endif后面开始执行。
这里强调一下条件部分该注意哪些问题:
1、ifa=b这样的语句中,a和b必须是同一种类型。也就是说a和b都要是数字,或者a和b都是字符串。
2、ifa>b这样的语句中,a和b必须是数字类型,如果拿字符串对比,可能出现结果和你的预期并不相同。
3、ifa=b这样的语句中,=号两边分别是数字和字符串,应该避免出现这种情况。假设出现了这种情况,我说一下解释的过程,首先把字符串转换成数字,然后再进行比较。if1="1"这样的语句是没有问题的,因为"1"可以自动转成数字1。而if1="a"那么整句就是出现错误,在按键精灵中忽略这种错误,结果就是if语句后面的语句会强制执行,并导致以后的代码部分失效(堆栈不匹配)。所以使用if语句的时候,应该尽量避免数字和字符串比较,如果真要这样的话,最好执行一个强转函数,看例子:
a="123456"
b=123456
ifint(a)=b
endif
这里我们使用了一个int(a)把a转换成数字类型。函数查找请使用按键精灵中的“vbscript生成器”
二、再来看ifcolor
原形:ifcolor[x][y][颜色][条件]..else..endif
其中x,y是屏幕坐标位置;
颜色是你要对比的颜色;
条件非常的重要,它只能给三个值0,1,2中的任意一位。下面接三个值分别予解释。
0是x,y点的真实颜色与我们给的颜色想对应,则是真,否则是假。
1恰好与0相反,x,y点的真实颜色与我们给的颜色一样的话,则是假,否则是真。
而2是模糊比对,这里详细解释一下。我们知道屏幕上的颜色由RGB三元色组成,每种色的染料比例不同,屏幕上的色就不相同。而在windows中,每种色的可变化的值是从0-255。纯白色点的三元色值都是255,而纯黑色则都是0。用16进制表示就是从00到FF.不知道16进制和10进制是怎么转换成的,可以用附件中的计算器选科学型转换。所以我们看到按键精灵取到的颜色是类似于0A1B2C这样16进制表示的代码,分别是由GBR三种颜色组成。知道了这点,就可以正确的理解模糊值了。(这里透露一个小秘密,按键精灵的模糊值范围是50。如果你看不懂,就略过这里,只要知道模糊判断不会把绿色判断成红色就可以了)
else同if语句,如果找到颜色则不执行else。找不到则执行。
总结今天说讲内容:
1、按键精灵中变量只有一种数据类型。
2、字符串类型要用双引号括起来,及在字符串中增加"字符
3、“&”号作为字符串相连符
4、按键精灵会忽略所有的错误,而执行下一条
5、if..else..endif的执行顺序。以及数字、字符串的比较方法。
6、ifcolor..else..endif的执行顺序。
如何把按键脚本变成外挂
首先,您必须要下载安装一款软件做为脚本运行的平台,目前较为流行也最为好用的软件首推—按键精灵!
第二,从网上搜寻您觉得的合适您使用的一个好的脚本
第三,把脚本和按键精灵软件有机结合起来,有2种方法。
1、复制脚本到指定位置
2、粘贴到源文件编辑框
今天我就从总体上对VBS进行介绍,希望能给大家一个直观的印象。另外,讲解与按键官网的按键精灵教程(李悦制作)相结合,帮大家看懂这个东东。
一、概述
要让计算机做事情就必须由人给它指令。原来的指令很复杂,都是些0011001之类的东西,后来逐渐简化,指令也更接近于人类的语言。VBS(Microsoft(R)VisualBasic(R)Scripting)也是高级语言的一种,和其他高级语言相比,它有简单易学的特点,是电脑初学者涉足编程领域的良好入口。
如果说从低级语言进化到高级语言是人类控制计算机的战略问题,那么具体的设置变量、循环就是控制计算机的具体战术问题。我们现在学习的也就是用VBS让计算机为我们工作的战术。
二、从最简单的东西入手。
网络叫卖脚本:
vbsi
vbsi=10
whilei>0
SayString卖XXX,价格面议。
vbsi=i-1
delay10000
endfor
看到这个脚本很多人就嗤之以鼻了,实现不断叫卖的方法很多,有的比这个脚本简单几倍。但随着讲解的进行,我们会发觉VBS提供给我们的是一个强大的工具。下面先来这几行都是什么意思。
vbsi//告诉计算机有个叫i的变量。
vbsi=10//这个变量为10
whilei>0//当这个变量大于0的时候就执行下面直到看见第一个endfor的地方。
SayString卖XXX,价格面议。//按键语句:输出文字
vbsi=i-1//这个变量减去1,然后又把减1后的数作为i的值。
delay10000//按键语句:暂停10秒(10000毫秒)
endfor//回到while处
效果:叫卖10次后就结束。
现在我要花点力气解释一下为什么要折腾出这么多麻烦的东西。
变量的用处和重要性
其实这个程序完全可以写成
SayString卖XXX,价格面议。
delay10000
SayString卖XXX,价格面议。
delay10000
……重复N次
SayString卖XXX,价格面议。
delay10000
其实再复杂的程序段都能被还原成顺序的程序,用很多复杂的东东不是为了显示编程能力,而是为了给自己方便。
当我们一直卖XXX的时候可能没有什么感觉,但当我们卖YYY的时候呢?要全部改过吗?或者我们要重复1000次,后来只重复500次了,难道要认真地数500下,然后删除后面的吗?当然,我们编这个小程序改起来还比较惬意。但要提高发展就得做大程序,还必须要依靠我们的变量朋友。
变量其实是一个字符代号,象你我的名字一样,为的是把各个变量区别开来,让他们分头工作。为变量取名字的时候可以用数字、字符、和下划线,但不可以用汉字、空格和其它奇奇怪怪的符号,另外数字不能用于第一个字符。
在使用变量之前要先写一个象vbsi这样的语句,意思是现在本人指派一变量,取名为i,参加到这个程序运行中。其实你可以不用履行这样的报名程序,直接在程序的某处使用i,但实践证明这是一个不好的习惯,让你写大程序的时候寸步难行。
然后vbsi=10则告诉程序,这个变量i现在的值为10,以后凡是用到i的地方,就相当于是10在那里。比如vbsj=i+1其实就相当于j=10+1,所以j的值为11。
变量的魅力不仅在于它可以代替数字,而且还可以代替字符,但和数字比起来,字符有其特殊性。
比如:
vbsi="字符"
vbsj="串接"
vbsa=i&j
此时a就是字符串接。注意这里出现的两个新符号:"号和&符号。可能有人已经猜出来他们的作用了。"号之间的内容为字符。电脑对vbsi=10和vbsi="10"有着截然不容的理解。&号为字符串接号。如果a=j&i,那么a就是串接字符。
知道了变量的用法后,我们就可以把叫卖程序改得更有趣。比如我们想让程序说不同的话,先说10次卖XXX,再说10次卖YYY。那我们就可以写成:
vbsi
vbsi=10
whilei>0
ifexpressioni<=5
SayString卖XXX,价格面议。
endif
ifexpressioni>5
SayString卖YYY,价格面议。
endif
vbsi=i-1
delay10000
endfor
其实我们用了个编程的小技巧,就是用变量i的大小控制程序的走向。可见前5次卖YYY,后5次卖XXX。
或者我们先叫XXX一次,再叫YYY一次,然后重复前面的动作:
vbsi
vbsi=10
whilei>0
ifexpressionimod2=0
SayString卖XXX,价格面议。
endif
ifexpressionimod2=1
SayString卖YYY,价格面议。
endif
vbsi=i-1
delay10000
endfor
这里也用了一个用i控制程序运行的方法。mod是和+、-、*一样的运算符号,作用是取余数。如10mod2=0的意思是10除以2,其余数是0。同样9mod2=1,8mod2=0,7mod2=1,6mod2=0,5mod2=1……
哎呀,暂时写到这里。
先说长变量名的问题。和人名一样,人少的时候,用一个字还行,比如尧、舜、禺。人多了就必须用多一点字了,比如帕尔多帕契夫斯基。今后为了阅读程序的方便,还是多写几个字吧。
vbscall和vbs一样都是标志。前者表示将用一个函数。至于什么是函数,可以看以后的帖子。现在先解释一下函数是什么。如果还没有忘记数学的话我们应该知道函数就是x->y的一种关系(映射)。即特定的x一定会得到特定的y,而不是相同的x,前后两次计算得到不同的y。
VBSCallGetCursorPos(y,h)@<stdlib.vbs>可以看成三部分。
VBSCall是标志,提醒电脑这句话是个按键精灵的函数。
@<stdlib.vbs>可以不用管他,通常理解为函数库头文件名称。将来也许会出现其他的比如iostring.vbs。这个文件在按键精灵安装文件夹的script文件夹里。
最重要的就是中间的GetCursorPos(y,h)了。我们会发现所有VBSCall打头的句子都是中间的这部分不一样。
还记得数学里函数是怎么表示的吗?f(x)=y或者是f(x)=一串计算式,比如ax2+bx+c。
f的意思是founction(函数)的头字母,在计算机里f可以是这个函数的名字,比如GetCursorpos(是getcursorposition,得到鼠标位置的意思。瞧这里也涉及到取名的问题,这个名字是不是取得不错,比起只有一个两个字母的名字,这个名字既直观又相对较短)。
x自然就是括号里的东西,有时我们有几个x,他们就用,号隔开。比如GetCursorPos(y,h)的第一个x是变量y,第二个x是变量h。
这时,你会发现少了f(x)=y中的y,也就是特定的x对应的特定的y。在这里有y,但对本函数来说已经不重要了,我们需要的是函数把y变成鼠标的横坐标值,h变成鼠标的纵坐标值。
实际上这里不是真正意义上的函数,从函数库stdlib.vbs中来看,这里的所谓函数其实是QMDispatch.QMFunction对象的一个方法。算了,这个问题以后再说。
同样的道理,FindColor(y-200,h-200,y+200,h+200,"ffaa8c",g,k)有七个x,要做的工作是在前四个x的范围内找到第五个x指定的颜色值,把发现第五个x指定值的颜色点的x坐标放到第六x,y坐标放到第七个x。f(x)=y中的y就不管了。
FindColor的前四个参数组成一个小于等于屏幕的方框,查询的颜色就在这个小方框内进行。依次代表屏幕左边到寻色方框左边框的距离,上边到寻色方框上边的距离,左边到寻色方框右边的距离,上边边到寻色方框下边的距离。注意上下左右都是怎么说的。如果是0,0,1,1的话,说明是左上角一个像素点范围内查询。如果是0,0,800,600的话,说明是800*600这么大快区域。至于什么是像素点,请看我的签名处提到的那个帖子。
dim不是变量。是VBS的保留字,保留字的意思是VBS语言的一部分,不能被用户作为变量、函数的名字。dim的意思是提醒计算机它后面跟的是将来要用的变量,可以不写。
我们从1楼知道了变量的重要性,现在总结一下。变量在汇编语言(低级语言)的时候就已经出现了。现在到了VBS这样的高级语言,变量将发挥更重要的作用。
作用1:替代数字或字符。
在程序里有些数字或字符会用到很多次,编辑和修改的时候一次要改很多,而且容易漏掉某些地方。现在我们先用变量把他们定义了,让变量代替他们到程序里去折腾,将来编辑修改时会很方便。方便的后果是,你的程序更不容易出错。
作用2:参加运算。这是变量之所以叫“变”的原因。
它能随时被赋予新的含义。但需要注意的是,你的变量原来是数字的最好不要中途变成了字符或者相反的变换。这会让电脑不知所措的。具体的原因等你学习了更多的东西自然就知道了。另外字符的运算只能是连接,就是&号,使前后两字符串连接在一起。同时数字与字符不能在一起运算。
幸运的是我上面说的那么多禁止的地方很多都是老皇历了。在VBS里有些禁忌是无所谓的。比如数字和字符,VBS会根据运算符号来确认到底参加运算的应该看成数字好还是看成字符好。i=10和i="10"有时候VBS分的不是那么清楚,它会根据是+还是&来判断结果应该是什么。
作用3:控制程序走向。
通过1楼,我们看到了最后的两个叫卖脚本。它通过条件的不同来产生不同的叫卖效果。这里的效果实际上是程序根据不同的条件走向了不同的地方。前一个例子是我们通过变量的大小来决定叫卖哪一句,后一个例子是我们通过变量除以2的余数来决定叫卖哪一句。
这一贴我们着重说一说用变量来控制程序的走向。
电脑读脚本如同我们读书一样。注意:这里我们写的东西确实是程序,却老是说成脚本。这里先解释一下:一般我们说的程序是直接能被电脑运行的文件。比如Qmacro.exe文件。当我们双击它的时候按键精灵就跳出来了。你尝试过将这个文件用记事本打开吗?其实记事本可以打开任何文件。打开后,我们会发现很多乱七八糟的符号,这些符号是只有计算机才能读懂的。我们能读懂的并且计算机能直接运行的(只是看起来是直接可以运行)只有脚本,即Script。
试验过用记事本打开程序文件后千万不要改动并保存啊,改了一小点都不能运行了。
好了,只需要记住,电脑读脚本和我们读脚本没什么两样。只是它读的比我们快,并且是以行作为读取单位。电脑是一边读脚本一边按照脚本的意思来执行命令。
既然如此,我们在写脚本的时候就能充分发挥我们的文学细胞,运用插叙、倒叙、顺序、注释等多种写法来完成我们的脚本。电脑里大概有注释、顺序、选择序、循环序和跳转序几种读脚本的方法。
先说注释。注释的作用是让读者更明白文中的意思。脚本里的注释有点不一样,电脑可不需要什么注释,它只负责按命令执行。我们在脚本中加入注释的目的是为了自己方便。比如我们的程序写长了,这时可以在脚本里加入点注释,提醒自己谁谁谁是干什么的。
加入方法:Rem注释语句。
程序在遇到Rem的时候就视而不见了。但后面我会告诉你,电脑还是看得见用Rem打头的语句的。
注释使我们能控制电脑哪句可以执行,哪句不能。比如你修改你的脚本的时候,原来的那句话也许将来还能用上,于是你在添加新语句的时候不必将原来的删除,而是在它前面直接加上注释的Rem。这样程序就不执行了,而且将来好改动。
次说顺序。
其实只要没有什么特殊的情况电脑都会老老实实按顺序读下去。这就没有什么多讲的了。
再次说选择序。
很奇怪,电脑看脚本有时候还真有些不求甚解,它可以根据你的命令有选择读一些语句,而放弃读一些语句。这有利于我们控制它按我们的意思根据不同情况来行动。而不同的情况其实很大程度上说的是变量的情况。比如变量是否大于10。
要实现选择序,我们就先要判断一下条件。在按键精灵里只有一个语句负责判断。
ifexpression。这个语句是ifexpression(如果表达式[是否为真])的意思。
这里解释一下什么叫表达式,其实也没有什么解释的必要,就是算式。但这里的算式比数学算式的含义多得多。除了1+1=2,1+2=3什么的;还包括变量参与的运算,比如a+1>b,b+2<c;甚至还包括没有运算,比如就只有变量a放在ifexpression后面。
然后我们解释中括号里的[是否为真]是什么意思。在VBS里用1和VBTRUE来表示真,用0和VBFALSE来表示假。ifexpression的意思是,如果后面的那个算式是成立的,那么我就执行我下面的语句直到遇到第一个endif的地方。
那么什么样的算式才叫成立呢?也就是说为1或VBTRUE呢?
1+1=2成立,为1或VBTRUE,1+1=3不成立,为0或VBFALSE。a+b>10就看a和b运行到此的值是多少了。只有一个变量a呢?当a的值为0时,就不成立,当a不为0时就成立。
另外说一下VBTURE和VBFALSE是什么东东。其实就是1和0。作用是便于阅读和防止冒失鬼把用于判断的变量中途放到其他算式里去参加运算,使原变量值改变了。
1楼的最后两个脚本都是通过ifexpression来控制程序走向,产生不同效果。
可见ifexpression1这个语句永远成立。ifexpression0永远不成立。当然我们也可以用ifexpressionVBTRUE来实现永远成立。ifexpression1+1=2永远成立,ifexpression1+1=3永远不成立。
具体格式:
ifexpression表达式
中间语句(可以又有一到N个ifexpression和while)
endif
然后我们说循环序。
和选择序一样,它也要作一个判断;与之不同的是循环序是在判断了后面的表达式是否为真后执行到第一个endfor语句,然后又回到原来判断的那个语句,再判断一次,如果成立,又执行下面的。这样一直循环下去,直到有一天它发现判断表达式不成立了,脚本就接着endfor后面的语句执行。
比如while1这个语句就会无限循环下去。
在1楼的第一个脚本就是通过循环语句来实现不断叫卖,而且通过变量大小能控制脚本叫卖多少次。
具体格式:
while表达式
中间语句(可以又有一到N个ifexpression和while)
endfor
最后说跳转序。
一个是Goto标记。意思是当读到这句时就到标记处继续执行。这里的标记其实是我们第一个介绍的老朋友Rem注释语句。
比如前面你写了Remaa
后面就可以用Gotoaa来实现回到Remaa这一行来继续执行。
另一个是Gosub子程序标记。意思是当读到这句时就到子程序标记处继续执行。当读到第一个Return语句时回到Gosub那一句。子程序标记是Sub。
以上所有的控制语句,都可以在按键精灵编辑窗口左边的“控制动作”一栏找到。
以后我们进一步说表达式成立到底是什么意思,以及子程序是什么东东,它和函数有什么关系。
确切的讲,子程序和跳转如同插叙一样,或者说是“下转xxx页”。和跳转不一样的是,跳转会直接运行下去,而子程序到了return语句的时候会回到调用这个子程序的地方,接着下一句继续运行。
子程序的作用可以将程序分成明显的几个功能块,便于你调试、阅读。这在写大程序或者和别人合作写一个脚本的时候特别有用。比如你本人写找矿程序,当找到矿后调用“移动到矿边”子程序。这时你可以让你的朋友来写这个子程序。或者让你的程序显得更有逻辑性。
另外,子程序和函数的区别也很简单。子程序其实是一段脚本,你可以在不同的地方重复执行这一段脚本。函数是一个关系映射。函数有x和y,即通过特定的x来得到特定的y,而子程序不存在这些。但他们都可以被看成是一个功能模块。
子程序和函数的更深层次的区别是对待变量的不同态度。子程序是一段脚本,和调用它的主程序是一家人。适用于主程序的变量同样适合于子程序(特别注意:这句话仅适用于按键精灵脚本)。函数则和调用它的主程序是两家人,相互不承认对方的家庭成员(变量)。要想在主程序和函数之间共用变量,就必须经过传递这一道手续。我们写在函数名后面括号内的变量或数字、字符就是履行发送任务,在函数内部,要履行接收任务。不过请放心,在按键精灵脚本里没有必要写自己的函数。我们只需要用好按键精灵提供给我们的函数,比如findcolor。但看了前面的说明,你应该明白,在findcolor等函数后面括号里的参数顺序和大小是多么重要。
等把什么是表达式成立讲清楚后,VBS基本上就可以用来写脚本了。前面的都是些死记硬背的东西,后面将讲一些编程技巧,然后用一个识别数字脚本的整个产生过程来总结这些技巧。
现在你去看官网上的那个关于VBS的教程应该可以轻松一点了。先前我们讲了函数,那么我们就只看那个教程里第五个题目《函数》。这时你会发现VBS为我们准备了些什么好礼物。
名词解释:
返回值:其实就是特定x输入后得到的特定y。这个y可以赋予给变量。
比如:Abs取绝对值函数。
DimMyNumber
MyNumber=Abs(50.3)'返回50.3。
MyNumber=Abs(-50.3)'返回50.3。
同样,你可以用到三角函数、时间函数、字符处理系列函数等等。VBS为我们提供了一个强大的功能函数模块,尽情使用吧。
多说一句,方法是对象的一个动作。(头晕了吗?听我慢慢讲)
我先前说计算机读脚本想人读书,这种情形是从上到下的一个程序执行过程,无论有多少循环和跳转,其实都是一个依一定逻辑规则的执行过程。这被称为面向过程的程序设计。
另外有一种程序设计思想叫面向对象的程序设计,即程序编写者将逻辑思维转变成形象思维,把万事万物看成对象,这些对象有属性和行为。比如花,它的属性有红色、白色等,有大、小等,有各种形状;同时当一定条件来临时花会按自身的规律发生变化,比如春来花开,秋到花谢等。我们把属性仍叫属性,把行为叫方法。
在VBS里有7个对象。详见官网VBS教程第7个目录:《对象》。目前来看对我们最有用的是FileSystemObject对象。那一串英文翻译过来时“文件系统对象”的意思。