家用车入库_MSWLogo-FMSLOgo解

这是个有趣的LOGO复赛编程题,也可以说是LOGO竞赛复赛题中的翘楚,既漂亮又有一定的编程难度。这个题目用FMSLogo-MSWLogo或是PCLogo都能实现编程,今天先来讲讲FMSLogo-MSWLogo的编程答案。原始题目是这样的:
复赛上机题
家用车入库
现在私家车已经十分普及,家用车不使用时都要进入车库。请编写程序jycru.lgo模拟家用车入库。编程具体要求如下。
1. 整个图形尺寸不超过670×370。图形屏幕居中。其他尺寸自定。
2.
车库安排在图形的左上方。车库共3个,从左向右的编号为1-2-3。单个车库内部尺寸100×150。车库壁间隔5。
3.
为画图简便起见,小车用尺寸50×100的矩形表示,海龟位于“车”的正中。小车前进、后退时从海龟可以看见车的运动状态。
4.
小车的出发点规定在图形的右下方。小车入库时先沿着半径100的90度弧左转,在向图形的左方前进适当的距离后,再沿着半径100的90度弧左转,然后倒退入库。小车的运动用动画显示。在整个运动入库的过程中,小车不得“走错号”、不得出界、或与车库碰撞。小车入库后要求居中停放。
5. jycru程序带有一个数据表,数据表指定了小车入库的顺序。例如:
jycru [ 2 1
3]
表示依次入库的车库号是 2-1-3 。这个数据表不得为“空表”、表里面的数据可以是
1~3个。表里面的数据可以是1、2、3,顺序任意,但数据不得重复。
编制好的动画程序如上图所示。
这个命题看起来玄妙无比,但仔细分析,任何一辆车的入库动作都由4个动作部分组成(参见下图)。

第一个动作:A段 这是一个90度的圆弧。
第二个动作:B段
这是一段直线。但是这段直线的长度大有讲究。进哪个车库全靠这段直线的长度来决定。车库号是从左向右计数的,每个车库占位宽度107。那个47是编程时的补偿数据,它的大小与入口的发车起点的坐标位置直接相关:入口靠右一些,这个数值就大一些,反之就小一些。为了形成动画,就每向左移动一次移动10个点,所以就除以10。这样计算出来的“直线”动画的动作段数就是:
MAKE "ZX INT(((4-:N)*107+47)/10)
第三个动作:C段
这也是一段90度的弧线。
第四个动作:D段
车子倒退进入车库的一段直线。
上面的4个动作构成了各个车库车子进库的完整动作。
FMSLogo-MSWLogo的源程序如下。
TO JYCRK
:C ;主程序 :C是[2 1 3]这样的进库车号表数据
CS PD
;清屏落笔
CK
;画车库
RKCL :C
;三辆车入库的递归
END
TO RKCL :C
;多辆车入库的递归
IF EMPTY? :C[STOP]
;所有车都入库了就终止程序
MAKE "N FIRST
:C
;读当前车的车库号
RK :N
;执行入库
RKCL BF :C
;去掉数据中已经入库的车号
END
TO RK :N
;第:N辆车入库
;REPEAT 60[FD 100*PI/30 LT 6] 100*PI/30=10.47 解释10.47来源
SETH 0 PU SETXY 300 -150
PD
CHE 0 WAIT
100
;画未起步的车
REPEAT 15[
;画A段圆弧
PD CHE 0
WAIT 20 PU CHE 7
LT 3 FD 10.47 LT 3
]
MAKE "ZX
INT(((4-:N)*107+47)/10)
;计算B段的长度
REPEAT :ZX[PD CHE 0 WAIT 20
PU CHE 7 FD 10] ;画B段直线
REPEAT 15[
;画C段圆弧
PD CHE 0
WAIT 20 PU CHE 7
LT 3 FD 10.47 LT 3
]
REPEAT 22[PD CHE 0 WAIT 20 PU
CHE 7 BK 10] ;画D段倒退入库
CHE 0 WAIT
100 ;画泊好车的图形
END
TO CHE :K ;画单个车子的过程 :K=0画黑色
:K=7画白色擦除图形
SETPC
:K
PU BK 50 LT 90 FD 25 RT 90
PD
REPEAT 2[FD 100 RT 90 FD 50
RT 90]
PU FD 50 RT 90 FD 25 LT 90
PD
END
TO CK
;画车库
PU SETXY -315 150
PD
BK 155 RT 90 FD 5 LT
90
REPEAT 3[FD 150 RT 90 FD 100
RT 90 FD 150 LT 90 FD 5 LT
90]
FD 155 SETX -315
PU
END
如果你对更多的小学LOGO语言竞赛复赛题感兴趣,应找到《复赛详解》来看看:
加载中,请稍候......