查看文章 |
HSP编程基础教程(三)过程流程:跳转
2007-03-22 22:54
一、跳转 在了解变量和常量之后,我们开始正真的编程,程序是由多个命令组合而成的指令集。 HSP的程序是按着行号,从第1行到第N行按顺序逐行执行下来的,就是执行的方向的总是不变,绝对不会倒着逆向执行。不仅HSP,所有的编程语言都一样,就像时间的方向总是向前,绝对不会倒流。但是也像人类的历史一样,在某段时期,历史总是不断重复的。程序也是这样,虽然不能逆向,但是也可以重复,或者说是循环。就是重复执行第几行到第N行的命令多少次,这种循环的执行的情况,在程序中是常见的,因为计算机就是代替人类做重复枯燥的运算工作。在了解循环之前,我们先来看看一些简单和程序的执行方向(或者说流程)有关的命令: end 这个大家都知道了,就是结束的意思,什么结束?就是程序结束,我们的小白窗口自动关闭。试一下,一闪而过,好像什么也没发生。我们在前面加一个信息框(这个信息框就是我们经常看到的,一出现总是“咚”的一声,有时夜深人静的时候挺吓人的),让它停一下: dialog "我要走了~~" end 能不能停久一点?再加个stop(停止),意思就是停止执行我们的命令,不再往下执行了(绝对不会执行end) dialog "我要走了~~" stop end 看看,不会结束了吧。停止执行程序了,是不是小白窗口什么也不做了吗?也不是,虽然停止执行我们的程序,但是窗口或窗口上的组件(比如:按钮),还在等待一些操作(就是事件),比如点击按钮(如果有按钮)。点击按钮后执行哪部分的程序?这就要了解子程序入口了,就是这部分程序只在按下按钮后才执行的,不按就不执行。那么这部分程序应该放在哪?放在最前面是不可能了(因为我们的程序是顺序执行下来的),那只在stop之后了,因为我们的窗口上不可能只有一个按钮,也不可能只执行一个按钮的命令,为了区别开来,也给子程序入口(英文是Lable标签,我觉得翻译成子程序入口比较合适,子程序即程序的一部分,而不是主体的程序)安上不同的名称,子程序入口名称命令规则也变量的相似: 1、只能用英文字母大小写A到Z、数字0到9和下划线“_” 2、变量名第一个字符不能用数字0到9,只能用英文字母和下划线“_” 3、不能用系统保留字(命令或系统变量) 并且和变量不同,在名称前加个*号,表示是个子程序入口,像下表示 dialog "我要走了~~" stop *woyaozou end *是不是像一把钻头,在这个地方开了个洞口,洞口上写着“woyaozou”(我要走,当然什么名称是由你定的,只要不重复,方便记忆)。不过我觉得还是叫“水帘洞”比较好,以后猴子就能从这里路过了^○^。那么我们怎么执行或跳到“水帘洞”呢,刚才已经说了,程序虽然stop了,但窗口还是等待一些事件,比如最常用的:单击按钮。如果学过VB的可以在相应的按钮上选择OnClick事件,不过HSP不是这种可视化编程语言,把按钮“画”到窗口上就行了,要自己用命令创建,并关联上相应的点击事件的子程序(够直接的吧,按钮本来就是用来“按”的): dialog "我要走了~~" button "结束 ", *woyaozou stop *woyaozou end button就是创建按钮的命令(button中文意思“按钮”),有两个参数:第一个是按钮上面显示的标题,第二个是点击按钮后执行的那程序的入口名称(要带上*号),第二个参数的*woyaozou 是和下面的*woyaozou 是相对应的,就是按下按钮后,跳到“*woyaozou”这个洞口再执行下去,就算中间隔了很多行,也照样能遥相呼应。 有没有奇怪,按钮标题为什么后面加一个空格,因为又遇到了前面提到的,HSP对中文识别不好的问题,加个空格解决问题了,如果觉得后面加了空格,显示就不对称了,可以在前面再加一个空格。试一下,怎么样,虽然stop了,但还是能响应按钮的点击。 如果有多个按钮呢,怎么开洞口?去掉信息框,再加上两个按钮: button "问候 ",*nihao button "介绍",*jiesao button "结束 ",*woyaozou stop *nihao mes "你好啊~" stop //这里一定要再次用stop,不然又会往下执行了 *jiesao mes "我叫小白~" mes "你叫什么?" stop //这里一定要再次用stop,不然又会往下执行了 *woyaozou end 看到了没有,*nihao和stop、*jiesao和stop、*woyaozou和stop(这里虽然没写上,不过我们执行到最后一行肯定是停止的),分成三个独立互不干扰的“隔间”,或者是程序段,它们里面程序语句是按下相应的按钮才执行的。 是不是只有按下按钮才会跳到“洞口”,也不是。可以用用goto命令,go to我们在刚开始学英语经常念到“go to school、go to bed”,用在这里就是“goto”到某个洞口。例如在第一个stop前就跳到*nihao“洞口” button "问候 ",*nihao button "介绍",*jiesao button "结束 ",*woyaozou goto *nihao mes "程序要停止了~" stop *nihao mes "你好啊~" stop //这里一定要再次用stop,不然又会往下执行了 *jiesao mes "我叫小白~" mes "你叫什么?" stop //这里一定要再次用stop,不然又会往下执行了 *woyaozou end 自己试一下,发现没有,在goto后的那句 mes "程序要停止了~" 并没有执行(没显示出来)。这是怎么回事,原来在*nihao的洞里有个stop已经在那里停止执行了,而且goto不会折回头的,而且跳到哪里就在哪里往下执行,直到遇到stop。 goto不会折回的,那么有没有可以折回头的跳转,就是我们只想进“洞”一下,但又想返回原来的goto的地方,再往下执行。这当然可以了,很简单了,在洞里面我们不stop了,而是return(返回),那么程序执行的方向就乖乖的返回到原来GO的地方。但是跳到洞口不用goto了,而是用gosub(go sub,sub是子程序的意思),gosub是专门和return搭配的,而goto是专门和stop搭配的。我们来看看,gosub是怎么return的。为了看得更清楚先把上面的无关语句清理掉,但洞口依然。 color 0,0,255 ;蓝字 font "simsun",12 gosub *nihao mes "程序要停止了~" stop *nihao mes "你好啊~" return //这里换成return *jiesao mes "我叫小白~" mes "你叫什么?" stop 看到goto和gosub的区别了吧,gosub先进*nihao洞里执行mes "你好啊~" ,又返回原来gosub处往下执行mes "程序要停止了~",遇到下面的stop最后停下来,为直观的看到这个流程,我标上流程线: ![]() (那些不在程序语句上的线不是倒上执行,而是表示瞬间跳转到) 上面说到goto和stop搭配,其实也不尽然。goto很灵活的,无论有洞口在哪,只要有“*”,就算是上天入地都可以。如果跳回以前的执行过的语句也可以,像这样: color 0,0,255 ;蓝字 font "simsun",12 *goudong //经过这句不执行的,就好像我们路过路边,看到一个狗洞,虽然什么也不做,但记得这里有个洞,往后再遇到跳到这个洞名的,就从这里钻出来 mes "你好啊~" wait 10 //这个命令是等待一段时间的意思 goto *goudong //这是向上跳转,可谓是上天了 看看会怎么样? 哇!一直在显示"你好啊~",那是因为我们让执行的方向不断的跳到*goudong,再向下执行mes "你好啊~",这样不断的重复,谓之循环。 在这个不断的循环中,一定要在中间加入一个wait(等待)命令,就是在这里停留一段时间,再往下执行。为什么要停留呢,如果不停留,窗口就不能做别的事了,比如有点击按钮,移动窗口都不响应这些事件了。 不信你把wait 10 去掉看看?怎么样,窗口像僵死了一样吧。wait后面是停留的时间长度,单位是10ms,就是0.01秒。像上面就是10×0.01=0.1秒。 暂停0.1秒,让窗口检测有没有移动窗口,按钮等等这些事件,还有做最重要的,就是把刚才我们这些字显示出来。和wait类似的命令还有await,前面多个a。区别是后面参数定义的时间单位不同(await是1ms,更精确些,但占用CPU的时间就相对长些) 这个种循环就是我们编程常用的,特别是HSP,比如不断的循环检测有没有按下键盘上某个键(以后会学到这些命令),在一个关卡里不断的绘制地图,直到从这个关卡里跳出(跳出循环),到另一个关卡(到另一个循环)。 其实,窗口程序自己也在处理和等待各种事件中循环(不需要我们编写的,是WINDOWS系统窗口自有的或已经是系统编好的程序) 那么,这种循环到底什么时候才结束?关闭窗口就结束了,或者你又用goto从循环里面钻出来。 总结一下: 如果程序是一个过程,那么goto走的就是不归路,而gosub就是有去有来,可以返回原来的跳转处,再继续往下执行。goto可是跳到没谱的,被专家称为是会破坏结构的完整(有洞*就可以往哪钻) 初学者还是谨慎使用的好,不然转到自己都晕。开篇前说过程序的流向就像时间轴,如果用goto跳到以前的语句,就像是瞬间回到过去,再重新做一些过去做过事情,如果不断回去不断的重做,就是一个不间断的循环了。 在下一章节,我们会学到另一些循环,有条件的循环,达到条件才不循环,或规定次数的循环等等。 本次讲座要点: 1、了解程序的流程和子程序入口 2、了解goto和gosub 3、了解什么是循环 |
最近读者:


