刚完成了一个scratch版的简单运算的计算器,本来想接着做混合运算式解析的。刚好家里的小朋友学到了认识算盘的课程,可能学校里没有认真听老师讲解,所以回家做练习的正确率对错各占一半,但据博主估计,对的那一半里可能还有一部分也是全凭运气。给小朋友讲解的时候没有趁手的工具,想起来何不用scratch来实现一个呢?于是就有了这个计划之外,但也意外的有意思的一个小项目。
任务目标与实现思路
项目的目标是在屏幕上展示一个算盘的图形,根据鼠标的滚轮动作来控制算珠的上下运动,并在屏幕实时显示当前显示图形所代表的数值。实现过程刚好与这个思路相反,是通过鼠标的滚轮动作来提升或减少一个变量的值,然后按位分析这个变量,比如变量的最终值是“百位1,十位2,个位3”,则把电子算盘的个位栏拨动3个算珠,十位栏拨上2个,百位栏则拨上1个。
学习arduino的时候接触过这种七段数码管显示器,它的七段灯管可以分别开合,以供显示不同的数字。比如显示8的时候,所以灯管都需要打开,而显示数字0的时候,中间的4号灯管则需要关闭。
电子算盘的从数字转向算珠状态的转化借鉴了这种方式,将1个竖列算珠的初始状态位都设置为0,当某个算珠被拨动后视为状态1,算珠按上图编号,需要显示为1的时候,算珠的状态应该是“1000000”,也就是编号为1的算珠被抬了起来:
代表数字 算珠状态(1~7)
数字1 1000000
数字2 1100000
数字3 1110000
数字4 1111000
数字5 0000010
数字6 1000010
数字7 1100010
数字8 1110010
数字9 1111010
数字0 0000000
这里设置了一个35行的命名为“states”的列表,每7行代表一个数位,一共可以记录5个数位,也就是“个十百千万”,当个位数为8的时候,我们就把列表的第一至第七行的值依次修改为“1110010”,显示在屏幕上,就是代表1的3个小算珠抬起,代表5的一个算珠下落。需要设置算盘十位的显示状态时,就去修改列表第8至14项的值。
数据处理部分的逻辑
数据处理部分涉及的参数与列表如上,states列表用于存储总计35个算珠的屏幕展示状态,为0时保持不动,为1时则弹出。model列表则用于存储算珠状态模板,某个数位为2的时候,算盘对应列的1到7个算珠的状态按model列表的第2项取。count用于轮询states表的35个项目,stringCount用于轮询输入数字的每个数位上的数字,而modelCount变量则负责按位取出model列表某一项的字符,因为model列表单项有7个字符,所以需要循环7次。
博主设计了一个5列的算盘图样,支持最高的数值为“1-99999”,虽然有时候这个数字和很小,但我们每次都应该去刷新这5列的算珠状态,以确保能够正确显示,这也是最外层的一个循环,重复执行5次。在最外层循环取到数位值后,比如个位数是8,那么我们就用model列表的第8项里的7个字符去替换states列表中的第1到第7项(1-7项对应算盘右侧第一列也就是个位的状态)。