色实心小球,小球沿着指度角度(300<=角度<360,或者0<=角度<=60)做直线运动(动画),当小球碰到靶子停止运动,并在人的下方显示靶上的分数,如(图二)所示。若没打中靶子,则得分为0。
3.若刚好打在分隔线上,可任意选择分隔线左边或右边的数字作为得分来显示。
4. 例如,执行过程daba
350(朝向350度),则输出如(图二)所示图形;执行过程daba
65(朝向65度),则输出如(图三)所示图形。

编程分析:
难度系数
1. 这是一个类似游戏的小程序。思考难度系数分解:
画人+画圆弧及间隔
将随机数填写入间隔中
球的动画
判断得分
2. 在不同的LOGO系统中随机数有微小的差异。
PCLogo中RANDOM 20产生1~20。
MSWLogo-FMSLogo中RANDOM 20产生0~19。
产生出来的8个随机数要完成两个任务:一是准确地写屏填写到圆环中;二是填写到“表”:F中。游戏抛球击中圆弧的哪一段(从左向右计数1~8号),就取出表:F中的数写屏显示出来。
3. 抛球得分判断是重头戏,
首先,抛球到左边,350度和-10度是等效的。只要抛出的角度>180度要进行这样的处理:IF :N>180[MAKE 'N
:N-360]。
圆环每段15度,从-60度~+60度。每15度占1个号码,所以度数必须除以15并取整。但是有负的60度~负的1度呀,这样还要补偿14度,这个段位计算出来才准确。这个数学模型是全程序中最抽象的部分:
MAKE 'NN INT((:N+74)/15)
;重要!计算抛球角度对应的圆环段数1~8段
真正的得分是要到表:F中读取的。如果算出来的段位数是负数、或大于9,显然是零分!
其实还有一个“擦边球”,就是球击中最左边的边缘时,按规则也应算式击中第1段:
IF OR :N=-60 :N=300[MAKE 'NN 1]
;击中最左边擦边球得分段数
4.
作为LOGO动画,每次刷新的项目和内容越少,图像越流畅。在这个动画中,先画一个直径10
的蓝色的球,WAIT稍稍延时,就用白色的球覆盖掉,然后前进5,画下一个位置的蓝色的球。到达终止的最后位置时再画一个在末了位置上的蓝色的球,就算完成任务。由于弧形的“靶”并没有刷新,所以这样的动画确实是非常流畅没有闪烁感的。
5.
MSWLogo-FMSLogo中是没有画点的命令的,只好用画一个很短的点来代替画一个点:SETPC 1 PD FD
1,用画圆再填色形成“球”不是上策。但是在PCLogo中有DOT画点命令直接用DOT命令实现球的前进动画效果一样完美:
PU FD 20 SETW 10
;开始画抛球动画
FOR 'I 1 9[PD SETPC 1 MAKE 'X XCOR MAKE 'Y
YCOR \
DOT SE :X :Y WAIT 20 SETPC 15 DOT SE :X :Y PU
FD 20 ]
PD SETPC 1 MAKE 'X XCOR MAKE 'Y YCOR DOT SE
:X :Y ;画最后静止的球
编程程序:程序拷贝到编程系统中就能运行使用
;
FMSLogo编程适用
TO DBYX :N ;打靶游戏主程序 :N抛出球的角度
CS HT
SETLABELFONT [[黑体] 24 12]
;设置写屏字体为黑体24×24号字
MAKE 'F [] MAKE 'DF 0
;:F存储分值表 :DF击中得分值
BH
;画靶环
SETPC 0 SETPENSIZE 20 PU HOME PD FD 1
;画中心人的圆点
DONGHUA :N
;画抛球动画
IF :N>180[MAKE 'N :N-360]
;处理大于180度的抛球角度
MAKE 'NN INT((:N+74)/15)
;重要!计算抛球角度对应的圆环段数1~8段
IF OR :N=-60 :N=300[MAKE 'NN 1]
;击中最左边擦边球得分段数
;PR :NN
;命令窗口跟踪击中段位数 也可以不显示
MAKE 'DF 0
;先拟定真实得分0分
IF AND :NN>0 :NN<9[MAKE 'DF ITEM :NN :F]
;读取1~8段得分数
;PR :DF
;跟踪真实得分数也可以不显示
XSDF :DF
;将真实得分数写屏
END
TO BH ;显示靶环
SETPENSIZE 1 SETPC 0
PU SETH -60 FD 200 RT 90 PD
;画内环
REPEAT 120[RT 0.5 FD 200*PI/180 RT 0.5]
PU HOME SETH -60 FD 250 RT 90 PD
;画外环
REPEAT 120[RT 0.5 FD 250*PI/180 RT 0.5]
PU HOME
FOR[I -60 60 15][
;画弧段间隔
SETH :I
PU FD 200 PD FD 50 PU BK 250]
FOR[I -60 45 15][
;产生8个随机数
MAKE 'SHU 1+RANDOM 20
;产生1~20随机数
MAKE 'F LPUT :SHU :F
;将随机数存入表:F中
PU HOME SETH :I+3
;在靶环上显示数字
FD 210
PD LABEL :SHU ] ;写屏显示数字
END
TO DONGHUA :N
;画球滚动的动画
SETH :N SETPENSIZE 10 ;对准抛出方向:N度
PU FD 15
;跨出“人”位置免得在“人”上面留下痕迹
FOR[I 15 195 5][PD SETPC 1 FD 1 WAIT 5
;在距中心15~195处显示动画
SETPC 7 BK 1 PU FD 5]
;用白色球擦除先前蓝色的球
SETPC 1 PD FD 1 ;画终止时留下的球
END
TO XSDF :DF ;真实得分写屏
PU SETX -40 SETY -20 PD SETH 90
MAKE 'XS WORD 'SCRORE: :DF
LABEL :XS
END
------
;
MSWLogo编程适用
TO DBYX :N ;打靶游戏主程序 :N抛出球的角度
CS HT
SETLABELFONT [[黑体] 24 12]
;设置写屏字体为黑体24×24号字
MAKE 'F [] MAKE 'DF 0
;:F存储分值表 :DF击中得分值
BH
;画靶环
SETPC 0 SETPENSIZE[20 20] PU HOME PD FD 1
;画中心人的圆点
DONGHUA :N
;画抛球动画
IF :N>180[MAKE 'N :N-360]
;处理大于180度的抛球角度
MAKE 'NN INT((:N+74)/15)
;重要!计算抛球角度对应的圆环段数1~8段
IF OR :N=-60 :N=300[MAKE 'NN 1]
;击中最左边擦边球得分段数
;PR :NN
;命令窗口跟踪击中段位数 也可以不显示
MAKE 'DF 0
;先拟定真实得分0分
IF AND :NN>0 :NN<9[MAKE 'DF ITEM :NN :F]
;读取1~8段得分数
;PR :DF
;跟踪真实得分数也可以不显示
XSDF :DF
;将真实得分数写屏
END
TO BH ;显示靶环
SETPENSIZE[1 1] SETPC 0
PU SETH -60 FD 200 RT 90 PD
;画内环
REPEAT 120[RT 0.5 FD 200*PI/180 RT 0.5]
PU HOME SETH -60 FD 250 RT 90 PD
;画外环
REPEAT 120[RT 0.5 FD 250*PI/180 RT 0.5]
PU HOME
FOR[I -60 60 15][
;画弧段间隔
SETH :I
PU FD 200 PD FD 50 PU BK 250]
FOR[I -60 45 15][
;产生8个随机数
MAKE 'SHU 1+RANDOM 20
;产生1~20随机数
MAKE 'F LPUT :SHU :F
;将随机数存入表:F中
PU HOME SETH :I+3
;在靶环上显示数字
FD 210
PD LABEL :SHU ] ;写屏显示数字
END
TO DONGHUA :N
;画球滚动的动画
SETH :N SETPENSIZE[10 10] ;对准抛出方向:N度
PU FD 15
;跨出'人'位置免得在'人'上面留下痕迹
FOR[I 15 195 5][PD SETPC 1 FD 1 WAIT 5
;在距中心15~195处显示动画
SETPC 7 BK 1 PU FD 5]
;用白色球擦除先前蓝色的球
SETPC 1 PD FD 1 ;画终止时留下的球
END
TO XSDF :DF ;真实得分写屏
PU SETX -40 SETY -20 PD SETH 90
MAKE 'XS WORD 'SCRORE: :DF
LABEL :XS
END
------
; *
PCLogo编程适用
TO DBYX_P :N ;打靶游戏主程序 :N抛出球的角度
DRAW HT
MAKE 'F [] MAKE 'DF 0
;:F存储分值表 :DF击中得分值
BH
DONGHUA :N
;画中心的人及抛球动画
IF :N>180[MAKE 'N :N-360]
;处理大于180度的抛球角度
MAKE 'NN INT((:N+74)/15)
;重要!计算抛球角度对应的圆环段数1~8段
IF OR :N=-60 :N=300[MAKE 'NN 1]
;击中最左边擦边球得分段数
PR :NN
;跟踪击中段位数
MAKE 'DF 0
;先拟定真实得分0分
IF AND :NN>0 :NN<9[MAKE 'DF ITEM :NN :F]
;读取1~8段得分数
PR :DF
;跟踪真是得分数
XSDF :DF ;真实得分写屏
END
TO BH ;显示靶环
SETW 1 SETPC 0
PU SETH -60 FD 200 RT 90 PD
;画内环
REPEAT 120[RT 0.5 FD 200*PI/180 RT 0.5]
PU HOME SETH -60 FD 250 RT 90 PD
;画外环
REPEAT 120[RT 0.5 FD 250*PI/180 RT 0.5]
PU HOME
(FOR 'I -60 60[SETH :I PU FD 200 PD FD 50 PU BK
250]15)
(FOR 'I -60 45[MAKE 'SHU 1+RANDOM 20 MAKE 'F LPUT :SHU :F
\
PU HOME SETH :I+5 FD 228 PD TT :SHU ]15)
END
TO DONGHUA :N
;画球滚动的动画
PU HOME SETH :N SETW 20 DOT SE XCOR YCOR ;画中心的人
PU FD 20 SETW 10
;开始画抛球动画
FOR 'I 1 9[PD SETPC 1 MAKE 'X XCOR MAKE 'Y YCOR \
DOT SE :X :Y WAIT 20 SETPC 15 DOT SE :X :Y PU FD 20 ]
PD SETPC 1 MAKE 'X XCOR MAKE 'Y YCOR DOT SE :X :Y
;画最后静止的球
END
TO XSDF :DF ;真实得分写屏
PU SETX -30 SETY -20 PD
MAKE 'XS (WORD 'SCRORE CHAR 58 :DF)
TT :XS
END
