火柴梗是怎样组成数字的

2023年3月厦门官方(市教育局-市科学技术协会)举办的小学生信息学竞赛,要求参赛者在不超过30分钟的时间里现场编程用火柴梗组成数字实现5-0倒计时,然后显示2023年份数字。关于火柴梗的要求如下。
这题目里面用到的数字只有6个:0~5。编写6个子程序(过程)来画0~5,需要的时候分别调用当然可以,但这绝对不是培养“编程思维”的正确思路,何况这样编程工作量太大,考试的30分钟限制摆在那里呢。正确的做法是找规律,编写一个能够通吃输出0~9全部数字的单一程序,需要显示哪个数字就调用这个单一的程序输出需要的某个数字。
从题目的要求来看,这种最多由7根火柴梗组成的数字从A点起步是最科学的。从1~7转向下一根火柴梗几乎全都是向右转RT
90,唯有从3转向4是是“直走”。这在编程上很容易实现:画到第3根时照样按整体的规律右转90度,然后补上左转90度,这样第4根火柴梗就变成“直着走”了。编程表达为
if :i=3[lt 90]
那么怎么区别0~9每一个数字的特征呢?这就可以编制一个“表”,把0~9数字的特征全部写在里面:
make "shu
[
[1 1 1 1 1 1 0] ;0
[0 0 1 1 0 0 0]
;1
[0 1 1 0 1 1 1]
;2
[0 1 1 1 1 0 1]
;3
[1 0 1 1 0 0 1]
;4
[1 1 0 1 1 0 1]
;5
[1 1 0 1 1 1 1]
;6
[0 1 1 1 0 0 0]
;7
[1 1 1 1 1 1 1]
;8
[1 1 1 1 1 0 1]
;9
]
这个“表”的组成规律是:每个笔画该显示火柴梗的地方是 1 ,不需要显示火柴梗的地方是0。这个数字“表”其实是所有7段数字的“字库”。有了这个字库,就能显示输出任意的数字了。

这里面每根火柴梗的画法是有讲究的。最好画成左右对称的,火柴的上下各留8~12点的间隙,这样方便将第7根火柴拼接在中间。
画单根火柴的子程序 hc
:k 有一个 :k
参数 :k=1
时火柴用黑色画,火柴可见。 :k=0
时火柴用白色画,火柴不可见。
运行 0_9 主程序,可以在屏幕上连续显示 0-9 各个数字如上图。
to 0_9 ;画0-9数字主程序 for
fmslogo8.3.2
cs HT
make "shu [
;数字字库表
[1 1 1 1 1 1 0]
;0
[0 0 1 1 0 0 0]
;1
[0 1 1 0 1 1 1]
;2
[0 1 1 1 1 0 1]
;3
[1 0 1 1 0 0 1]
;4
[1 1 0 1 1 0 1]
;5
[1 1 0 1 1 1 1]
;6 考试时6-9可以不要写入的数据
[0 1 1 1 0 0 0]
;7
[1 1 1 1 1 1 1]
;8
[1 1 1 1 1 0 1]
;9
]
for[n 0 9][
;显示0-9数字的循环
cs zhi :n wait
60 ]
cs
end
to hc :k ;单根火柴 :K=1黑色
:K=0白色
if :k=1[setpc 0]
;火柴可见
if :k=0[setpc 7]
;火柴不可见
setpensize 1 pu fd
8
lt 90 fd 4 rt 90
pd
repeat 3[fd 100 rt 90 fd 8 rt
90]
lt 90 bk 4 lt
90
setpensize 14 fd 1 bk
1
pu setpensize 1 fd 12
pd
end
to zhi :n ;读取字库的子程序
make "nn item :n+1
:shu
for[i 1 7][
make "k item :i
:nn
hc :k rt
90
if :i=3[lt
90]]
end
有了以上的编程思考,再完成整个“倒计时”编程就不难了。那怕是显示再多的数字都是轻而易举的事。
加载中,请稍候......