![App Inventor创意趣味编程进阶](https://wfqqreader-1252317822.image.myqcloud.com/cover/643/31486643/b_31486643.jpg)
逻辑设计
当前显示的视力检测字母“E”的产生
首先,你要明白一套字母“E”图片的命名是有规律的。例如本套视力检测系统是从度数4.0到5.3,每个等级中有四个朝向的图片。
图片命名规律为:度数*10_num.png(度数*10用全局变量place来存储,num为1-4的随机数,分别表示上下左右四个方向),如度数5.0大小,朝向为左的图片命名就是“50_3.png”。
因为显示字母“E”图片和文本显示当前视力这两个功能经常用到,所以将它们打包写成一个函数showPic,方便之后调用。具体代码如图1-23所示。
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_22_1.jpg?sign=1738844060-sHyXux9rFbXpXe0yWPaknQcjzST3uBFF-0-4d10edbfac01b000030a19a862287beb)
图1-23 函数showPic代码
获取从Micro:bit端传来的值
首先,我们要明确在Micro:bit端用的发送消息的代码为:
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_22_2.jpg?sign=1738844060-EQvL7NUfNd44PnGzVA9eL9Qvrp6kIuxJ-0-1b75ea47c79375a6aab2714674675066)
那么在App Inventor端相对应的接收消息要用的代码为:
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_22_3.jpg?sign=1738844060-L15120xG4OpypJOtatO5LlPMXUo6uI2r-0-8b8599820b3c78168aa62d5d5d739eeb)
同理,如果我们在Micro:bit端用的发送消息的代码为:
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_22_4.jpg?sign=1738844060-jzDkoU840NyXHhuBNpqOfDUN5ATEdPuz-0-47f3eff810378b859651c634b5a24831)
那么在App Inventor端相对应的接收消息要用的代码为:
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_22_5.jpg?sign=1738844060-orq2Yhs8bheReStX6WwGj52uCjR7gepk-0-73067417889b778b513d5632525f37b8)
只要Micro:bit每按一次A键,都会将key-value传递过来,将value的值每次都赋值给全局变量a,变量a随着A键切换不断在更新,但是只要Micro:bit按下B键,就表示确定了选择,此时就将前一次传来的a值赋值给全局变量b,那么变量b的值就是最终确定的值。b值可能为1,2,3,4,5,分别对应朝向上下左右与看不清。接下来只要对b值进行判断即可。具体代码如图1-24所示。
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_23_1.jpg?sign=1738844060-o6EKQMOMWfUGDPjUiKKC7rwPu0oclMdc-0-b5512ea9e875c165b682f8a321b531b2)
图1-24 获取来自Micro:bit端的值
对全局变量b进行判断
通过对全局变量b(代表Micro:bit端确认的朝向)与全局变量num(代表App Inventor端产生的朝向)进行对比,如果相等说明答对,并且累加变量correctNum,记答对次数,调用函数success;否则为答错,并且累加变量errorNum,记答错次数,调用函数error。需要说明的是,每轮判断次数用全局变量checkTimes记录,之后便于确定第几张图片显示对或者错小图标。函数judge的代码如图1-25所示。
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_23_2.jpg?sign=1738844060-iEQd9IaWGCO26WuOGnDFo6zSAv6bNiTX-0-e6f85cd5bc566ab8885c03c28c314546)
图1-25 函数judge的代码
函数success的具体实现
由于本视力检测将度数等级分为四个等级,每一个等级对于答对次数的要求都是不一样的,所以先要判断此时处于四个等级中的哪一个,再进一步对变量correctNum进行判断。如果达到了每一等级答对次数的要求,那么度数升一级(等同于变量place累加1),如果没达到,那么继续出示下一个字母“E”。部分代码如图1-26所示。
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_24_1.jpg?sign=1738844060-cejm8QM67Icr6lppNFxqVcIIrgYbvcEe-0-05d26cc1221bf54fc93566919af3fa17)
图1-26 函数success的部分代码
函数error的具体实现
同理,每一个等级对于能包容的答错次数也是不一样的,所以先要判断此时处于四个等级中的哪一个,再进一步对变量errorNum进行判断。如果达到每一等级最多答错次数,那么度数降一级(等同于变量place减去1),如果没达到,那么继续出示下一个字母“E”。部分代码如图1-27所示。
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_24_2.jpg?sign=1738844060-JM6b5DkuONR3rRlRrRrPgcVnook7zoWi-0-5b9362b6dbc7df8879cc6353409f3f8c)
图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所示:
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_25_1.jpg?sign=1738844060-e4bbpKhttSIccBIOpEpmbGTqorC6vqyd-0-69b23509da0914cb4a1e0638093c7be5)
图1-28 函数showPicture的部分代码
滑动条调节度数
初始时,度数从5.0开始,假设某测试者视力不太好,从5.0开始测太浪费时间,那么他可以用滑动条手动调整测试的起点度数。每次移动滑动条,说明度数等级有调整,那么显示对错的小图片要设为不显示,变量checkTimes、correctNum、errorNum清零。
滑动条相关代码如图1-29所示,函数clear的部分代码如图1-30所示。
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_25_2.jpg?sign=1738844060-lgKanu9eoeF1bXwSc7f2dfjoG3iDowow-0-5aa30b92a1d86f37da6d4b2de6bbf818)
图1-29 滑动条相关代码
![](https://epubservercos.yuewen.com/2835BE/17042066704482606/epubprivate/OEBPS/Images/38545_25_3.jpg?sign=1738844060-QfZQjeNLo3i8zboEIfRJZEpzde96Yr2w-0-4a34c220c3d252f88f781a678961f276)
图1-30 函数clear的部分代码