APP下载

透过事件处理了解简单的多线程

2019-09-10

电脑报 2019年12期
关键词:调用关卡代码

Python极客战记关卡主要是偏向锻炼用户的基本语法结构和计算机思维,让大家熟悉极客战记的操作与代码的使用。来到了森林,关卡将会变得更多更难,同样,到了森林,大家就正式开始接触编程的几大重要知识点:条件判断、运算符、函数、对象属性。

关卡简介

事件处理函数,看起来本关与它前面的几关考查内容相同,其实不然,如果忽略了事件处理函数的某个特点,那你可能就无法通过本关了。其实大多数关卡需要填充的代码并不多,大家如果完完全全按照注释填写,便可顺利过关,但如果不熟悉考查的知识点,多数同学都会按自己的想法对注释要求的代码“画蛇添足”,导致无法过关,本关也是如此。

事件处理函数

先来了解一下事件处理函数,我们初次接触了这个知识点:每个关卡的目标页和提示页(图1),都会包含对当前关卡涉及的新知识点的讲解,同学们每次都有认真阅读吗?

函数大家已经比较熟悉了,而事件(Events)却是一个新的概念,什么是事件?当你的英雄说话发出声音时,听见声音的人就是发生了听见(hear)事件,当你的英雄出现在游戏里时,你的英雄就是发生了生成(spawn)事件。因此当你的英雄做某事时,则必然会有相应的事件发生。

而事件处理函数,可以看作一个监测工具,或者说一个更高级的判断代码,时刻检测着某事件,若发生了,则调用相应的函数。因此,事件处理函数的使用格式为(图2):pet.on(发生的事件名,调用的函数)。这里有一个易错点,要监测的事件,我们要填写的是事件的名字,也就是字符串,因此此处的事件名必须是包含在双引号内。

如果你到了这一关还不了解字符串的话,问题就比较严重了,可以点击链接,了解字符串的相关知识。而要调用的函数,我们直接把这个函数的函数名写上去即可,不需要用双引号包括。

可能到这里大家会有一个疑问,为什么事件名是一个字符串,而函数名不是字符串,不需要加双引号呢?这是因为创建一个函数,实际上就是定义一个函数:def 函数名,此时你的函数名就被关键字def进行了定义,定义以后,这个函数名就不再是一个名字了,它变成了一个函数,它代表的就是这个函数,它成为了一个有定义的对象。

也就是说,虽然我们明白,这个单词,它是这个函数的名字,但是电脑没有名字这种概念,它只知道,这个单词指的就是这个函数。即:函数名被定义以后,成为了一个对象,因此电脑就可以直接通过调用这个单词来调用函数。因此函数的调用则不需要使用双引号。

明白了事件函数的使用方法以后,我们再看看事件处理函数的特点。上方有提到,事件处理函数就像一个时刻监测事件的机器,因此它一旦被运行,被启动了,就永远不会结束,会一直执行它的任务:监测并调用相应函数。这与普通的代码是有区别的,大家都知道,正常的代码,都是按自上而下的顺序执行,执行完了,这一行代码就结束了。因此我们的大部分通关代码都是放在一个while-True无限循環内的,为的就是利用循环,让我们的代码无限运行,不要一次性就结束了。

而事件处理函数则非常方便,这行代码一旦被执行,它的监测工作就永远不会停止,也不会影响其他代码的运行,就像一个帮你做事的智能机器人,你可以做你自己的事,而一旦发生了事件,它就会尽职尽责地运行需要运行的函数。那么此时最大的变化即是:执行代码的人,从一个人(你的英雄),变成了两个人(你的英雄和你的智能机器人),大大提高了代码的效率,这就是多线程的思想。明白了事件处理函数,我们就可以看看我们的关卡代码了。

现在的你,应该可以一眼就能看出当前代码的结构了。4到7行(图3),代码定义了一个叫sayTwo的函数,它和我们常见的函数有个区别,它自带了一个叫做event的参数,这个参数用于接收发生的事件,目前暂时没有什么作用,属于可有可无的存在。第9行,则是使用pet.on事件处理函数,来监测“hear”事件的发生,调用sayTwo函数,那么此时通关思路为:编写sayTwo函数与事件处理函数。

英雄说话提问

触发事件处理函数,调用sayTwo函数让宠物回答。此时,存在一个易错点,有的同学认为,英雄此时提了3个问题,所以宠物需要回答3次,所以他的代码是这样的:在sayTwo函数里让宠物连续回答了3次答案(图4)。

然后就会发现并不能过关。上文中有提到事件处理函数是一个时刻运行永不停止的机器,也就是说无需在sayTwo函数里写3次回答,游戏里每发生一次说话,宠物都能执行一次回答,因此英雄提了3次问题,宠物就发生了3次hear事件,则相应的,宠物会按顺序执行3次sayTwo函数。试想,如果你在sayTwo函数里,填写了三句回答,那么此时你们的对话就变成了:

英雄:一加一等于几?宠物:2,英雄:x^3 - 6x^2 + 12x - 8 = 0,x等于多少?宠物:2,英雄:火星有多少卫星?宠物:2,宠物的每次回答都连续说了2,而正确答案其实就是2,仅有一个,不能再多,所以无法过关。因此将多余的两次回答删去即可过关。通关代码如图5。

猜你喜欢

调用关卡代码
电塔岛历险
疯狂冒险岛
基于Android Broadcast的短信安全监听系统的设计和实现
神秘的代码
一周机构净增(减)仓股前20名
重要股东二级市场增、减持明细
近期连续上涨7天以上的股
时空穿梭
利用RFC技术实现SAP系统接口通信
C++语言中函数参数传递方式剖析