- App Inventor创意趣味编程进阶
- 吴明晖
- 1265字
- 2020-08-27 15:53:21
逻辑设计
当前显示的视力检测字母“E”的产生
首先,你要明白一套字母“E”图片的命名是有规律的。例如本套视力检测系统是从度数4.0到5.3,每个等级中有四个朝向的图片。
图片命名规律为:度数*10_num.png(度数*10用全局变量place来存储,num为1-4的随机数,分别表示上下左右四个方向),如度数5.0大小,朝向为左的图片命名就是“50_3.png”。
因为显示字母“E”图片和文本显示当前视力这两个功能经常用到,所以将它们打包写成一个函数showPic,方便之后调用。具体代码如图1-23所示。

图1-23 函数showPic代码
获取从Micro:bit端传来的值
首先,我们要明确在Micro:bit端用的发送消息的代码为:

那么在App Inventor端相对应的接收消息要用的代码为:

同理,如果我们在Micro:bit端用的发送消息的代码为:

那么在App Inventor端相对应的接收消息要用的代码为:

只要Micro:bit每按一次A键,都会将key-value传递过来,将value的值每次都赋值给全局变量a,变量a随着A键切换不断在更新,但是只要Micro:bit按下B键,就表示确定了选择,此时就将前一次传来的a值赋值给全局变量b,那么变量b的值就是最终确定的值。b值可能为1,2,3,4,5,分别对应朝向上下左右与看不清。接下来只要对b值进行判断即可。具体代码如图1-24所示。

图1-24 获取来自Micro:bit端的值
对全局变量b进行判断
通过对全局变量b(代表Micro:bit端确认的朝向)与全局变量num(代表App Inventor端产生的朝向)进行对比,如果相等说明答对,并且累加变量correctNum,记答对次数,调用函数success;否则为答错,并且累加变量errorNum,记答错次数,调用函数error。需要说明的是,每轮判断次数用全局变量checkTimes记录,之后便于确定第几张图片显示对或者错小图标。函数judge的代码如图1-25所示。

图1-25 函数judge的代码
函数success的具体实现
由于本视力检测将度数等级分为四个等级,每一个等级对于答对次数的要求都是不一样的,所以先要判断此时处于四个等级中的哪一个,再进一步对变量correctNum进行判断。如果达到了每一等级答对次数的要求,那么度数升一级(等同于变量place累加1),如果没达到,那么继续出示下一个字母“E”。部分代码如图1-26所示。

图1-26 函数success的部分代码
函数error的具体实现
同理,每一个等级对于能包容的答错次数也是不一样的,所以先要判断此时处于四个等级中的哪一个,再进一步对变量errorNum进行判断。如果达到每一等级最多答错次数,那么度数降一级(等同于变量place减去1),如果没达到,那么继续出示下一个字母“E”。部分代码如图1-27所示。

图1-27 函数error的部分代码
函数showPicture的具体实现(显示每次对错的小图片)
函数showPicture是带两个参数的,x传递过来的是变量checkTimes的值,y传递过来只有1和0两种值,1表示答对,0表示答错。x值范围为1~8,因为对错的小图片最多为8张(一轮中最多可以答8次)。例如第4次答错,那么x为4,y为0,实现的效果为图像4显示图片“wrong.png”。部分代码如图1-28所示:

图1-28 函数showPicture的部分代码
滑动条调节度数
初始时,度数从5.0开始,假设某测试者视力不太好,从5.0开始测太浪费时间,那么他可以用滑动条手动调整测试的起点度数。每次移动滑动条,说明度数等级有调整,那么显示对错的小图片要设为不显示,变量checkTimes、correctNum、errorNum清零。
滑动条相关代码如图1-29所示,函数clear的部分代码如图1-30所示。

图1-29 滑动条相关代码

图1-30 函数clear的部分代码