想利用Scratch实现一个简单的能实现整数的加减乘除的计算器,为啥要特别指定为整数呢?因为快做完的时候突然发现,键盘UI上并没有设计小数点-_-!!整体的设计思路是把功能分成3块:
一个计算器的诞生
1,利用键盘与鼠标获取数据并存入一个“inputText”,这也是本篇博文准备要解决的问题;
2,监控“inputText”的字符内容,其规则包括但不限于:
包含字母c时清空inputText
包含字母d时将提取inputText除末位外的所有字符并重复赋值给inputText
包含“数字串”与“+-*/”符号时:拆分为“数字串”+“符号”并依次存入一个缓存用的列表,并清空inputText
包含“数字串”与“=”符号时:拆分“数字串”存入一个缓存列表,并清空inputText
单纯的“数字串”不处理
...
目标是将输入的字符在列表中按第一项数字,第二项计算符,第三项数字,第四项计算符这样的顺序排列,并监控列表项目数是否大于等于三项,如果符合条件就将前3项组合成计算式,并将结果赋值给列表第三项,然后删除列表前2项,打着打着感觉说得很绕,用文本来演示一下吧:
输入“12+”
列表第一项 12
列表第二项 +
输入“14+”
列表第一项 12
列表第二项 +
列表第三项 14
列表第四项 +
满足条件,计算结果,赋值给第三项
列表第一项 12
列表第二项 +
列表第三项 14 + 12 = 26
列表第四项 +
删除前两项
列表第三项 14 + 12 = 26
列表第四项 +
最终就又变成了这样等待计算的形式
列表第一项 26
列表第二项 +
3,每次输入数据之后发送“刷新信号”给负责展示数据的对象,让负责展示的对象提取数据并显示在屏幕上。
接收输入数据
我们首先定义一个inputText
变量,在程序开始前将其设置为空,设置为空与设置为0的区别是,用于连接字符串时,如果设置为0,那么0会被处理成一个字符。设置为空的方法么,就是把这个0选中,然后轻松的点击一下删除Delete键。
在屏幕上显示inputText
变量,试试按几个键,博主尝试了依次按一
下123456789
键,但是因为手速过慢的关系,实际inputText
获取到的值变成了图中这个样子。
关于按键防抖
键盘事件经常被用于设计一些小游戏,比如按下向右键时控制角色前进,觉得运动距离合适的时候松开按键,角色也随着键盘弹起而停止响应。在计算器的这个实现里,如果按下按键一段时间不松开,程序会不断的将数据填充入我们的变量“inputText”,导致收获一长串的数字,即便是飞快的单击一下按键“1”,结果也有可能会得到“111”,乃至“1111”这样的值。计算个“1+2”也得依赖玩家的手速显然不太合理,有两个办法可以解决这个问题,第一是在按下按键后运行一个“等待(时长)”的积木,以避免过快输入,但等待时间过长会拖慢程序进程,太短则容易因为超过等待时间而出现误输入,所以这里更推荐的是增加一个开关变量来实现防抖。
增设防抖开关变量
现在我们增加一个名为keySwitch
的变量,预设为0,当检测到有任意按键被按下时,判断keySwitch=0
以及按键动作是否同时满足,如果同时满足则把数据保存进inputText
,数据保存的同时将keySwitch
的值修改为1,这样一来下一波判定就无法同时满足两个条件了,什么时候把值修改回来呢?判断没有任何键被按下的时候,也就是keyCount=0
的时候。
这里有个容易出BUG的地方,如果亲添加了鼠标点击输入(鼠标同样会遇到点一次输入多次的问题)的功能,为鼠标也需要做防抖的话,记得另行设置一个开关变量----比如mouseSwitch
。共用开关变量(公共变量或多或少存在这样被误修改的问题)很容易引发预想之外的后果。