新浪博客

LOGO编程《打靶游戏》

2026-01-29 10:37阅读:
LOGO编程《打靶游戏》
LOGO编程《打靶游戏》
学习LOGO编程,在掌握了基础的知识操作架势之后,最好找一些“命题”,也就是一些“课题”,按照要求编写一个比较完整的程序。这里提供的是2018年厦门市科协和教育局官方联合举办的小学生信息学竞赛的复赛上机题。要能够编写出符合题意的程序,你必须在复赛有限的时间里,先看懂题目的要求,计划出编写程序的思路,再编写并调试通过程序,这特别考验参赛者的编程功力。原题目如下。


打靶是同学们喜欢的游戏,本游戏用来模拟练习打靶精度。游戏由一段环形靶、人和小球三部分组成。靶子位于屏幕中间,人位于海龟原点,小球从人站立的位置以指定角度(从键盘输入)抛出(运动动画),若击中靶子,则显示“score:得分”,否则显示“score:0”,试编程模拟实现这一打靶过程。
说明与要求:
1.靶子由两段长度各为120度的圆弧和9条分隔线组成,圆弧的半径分别为250和200,分隔线的长度为50。在每段圆弧内,有一个值为1~20的随机整数作为靶上分数。
2. 在海龟原点位置有个人(以半径为10的实心圆代替),以指定的角度抛出一个半径为5的蓝
色实心小球,小球沿着指度角度(300<=角度<360,或者0<=角度<=60)做直线运动(动画),当小球碰到靶子停止运动,并在人的下方显示靶上的分数,如(图二)所示。若没打中靶子,则得分为0。
3.若刚好打在分隔线上,可任意选择分隔线左边或右边的数字作为得分来显示。
4. 例如,执行过程daba 350(朝向350度),则输出如(图二)所示图形;执行过程daba 65(朝向65度),则输出如(图三)所示图形。
LOGO编程《打靶游戏》

编程分析: 难度系数
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
LOGO编程《打靶游戏》
LOGO编程《打靶游戏》
LOGO编程《打靶游戏》
LOGO编程《打靶游戏》

我的更多文章

下载客户端阅读体验更佳

APP专享