第12届蓝桥杯Scratch国赛真题集锦

程题
第 1 题 问答题
博土江出题
题目说明
编程实现:博土汪出了5道加法选择题,请同学们给出正确选项
具体要求
1).博士汪问:“n +m =?”,n (0-9随机数),m (0-9随机数)

2).下方A、B、C、D四个选项,随机一个选项为正确答案,其他选项为错误答案(所有选项不能重复)

3).在询问框中输入选项,如果正确,博士汪说:“对了”,如果错误,博士汪说:“错了”; 

4).博士汪连续出5道加法选择题;
5).完成5道选择题后,博士汪说:“共答对几道题”等待1秒,说:“得了多少分”,选项内容清空 (每道选择题20分);
 

6).程序持续运行,且满足以上全部要求

 作为中高级组最后一题,本题的难度明显比前面6题都要大,本题的难点在于,如何生成A、B、C、D四个选项,这里有3个关键点:4个选项不能重复;
有且只有一个选项是正确答案;
正确答案顺序是随机的,可以是A、B、C、D四个中的任意一个;
为了实现这个功能,我们可以借助列表和随机数,先计算得出正确答案,将其插入列表,作为列表的第一项,接下来利用随机数,得到其它3个错误选项,它们都是在正确答案的基础上增加或减少一个随机数,然后插入到列表的随机位置。编程实现
接下来,我们就分如下4步编写程序来完成作品:

1.随机出题
2.生成A、B、C、D选项

3.询问并判断回答是否正确

4.统计答对题数及分数
 

题目要求,要出加法选择题,并且两个加数的范围都是0-9,所以,我们可以创建两个变量“和“m”分别表示两个加数,同时为了后面判断输入的答案是否正确,又创建一个变量“答案”来存储正确答案。然后使用连接运算符将”n”、“+”、"m"和“=?“连接起来,得到一个算式,这部分的代码如图所示:

2.生成A、B、C、D选项有了题目,接下来就需要生成A、B、C、D四个选项了,根据前面的分析,需要定义一个列表“选项”,用于保存4个选项,同时需要分别
创建“A”、“B”、"C”、“D”四个变量用于表示选项。我们可以先将正确答案插入到“选项”列表中,然后再随机3个干扰选项,并且插入到列表中,插入的时候可以使用“在选项的第x项插入指令,从而打乱列表的顺序,这部分的代码如图所示:

3.询问并判断回答是否正确
有了问题和选项,就可以询问并判断回答是否正确了,需要注意的是玩家输入的是A、B、C、D,并不是某个数字。所以,我们需要分情况讨论,如果输入A的话,就需要判断变量“A”是否和变量“答案“相等,如果输入B的话,就需要判断变量“B"是否和变量“答案“相等,以此类推...
如果回答正确,说“对了”,并且将变量“答对题数”增加1,否则就说错了,这部分的代码如图所示:

4.统计答对题数及分数上达代码只描述了一道题的出题和回答,题目要求出5道题,所以需要使用“重复执行5次指令”,将这部分的代码包裹起来当5次循环执行完毕,就需要统计答对题数及分数了,这里每道题是20分,可以使用“答对题数20得到分数,同时别忘了将变量“A”"B”、“C”和“D”四个选项情况。代码如图所示:

第2题问答题
玛雅神庙
题目说明
编程实现:玛雅神庙.
具体要求
1).点击绿旗,出现对应的角色与背景;
 

2).按下空格键,玛雅罗盘说:“请观察火把点亮的顺序”,然后神庙中的四个火把按照随机顺序分别亮起来并熄灭一次;
 

3.玛雅罗盘说:“请按照刚才的顺序点亮所有火把",然后通过上、下、左、右按键控制手指进行对应方向上的移动,手指移动到一个火把上,按下S
键,火把会再次亮起;
 

4).四个火把全部亮起,如果点亮顺序错误,玛雅罗盘说:“错误”,游戏结束;
 

5. 四个火把全部亮起,如果点亮顺序正确,玛雅罗盘说:“正确”,并按照每个火把代表的数字,分4次顺时针旋转到对应的数字位置,每次间隔1秒
顺序与点亮火把的顺序一致;

 

6).玛雅罗盘转动成功后,大门打开
 


 

接下来就需要考虑如何随机点亮顺序了,我们可以使用数字1、2、3、4表示4个火把的点亮顺序,并保存到“火把顺序“列表中,这通常
也有两种实现方法:
先依次将1、2、3、4插入到列表,然后打乱顺序;
向列表的随机位置处依次插入1、2、3、4;
从代码的简洁性角度出发,选择第二种方法更为简单,代码如下:
 这里的关键就在于“在列表的第而项前插入xx”指令,如果列表中是空的,能够插入的位置就只有一个,如果列表中有1个数据,那么新插入的数据就有两个位置可以选择了,在第一个数据之前或之后,相应的,如果列表中有两个数据,那么新插入的数据就有三个位置可以选择,以此类推..,也就是这个位置可以随机数来获取,但随机数的范围和列表的项目数有关,这就是上述代码的作用。接下来,罗盘就需要告诉4个火把分别点亮自己了,这需要用到事件广播机制,我们可以遍历“火把点亮“列表,根据列表中的数字,依次给4个火把角色发送广播,传统的做法是使用“如果..那么”指令判断数字,然后分别发送广播消息。可以利用随机数发送广播,广播消息的名字就是数字1、2、3或4,结合循环,可以让程序更为简单,代码如下:

 

对应的,火把1角色接收到广播消息“1”,先把火把切换到点亮造型,等待1秒后,再切换到熄灭造型,代码如下
 

同理,其余3个火把角色,在接收到消息“2"、消息“3"、消息“3”的时候,都需要做相同处理,代码和火把1角色基本一样,这里就不再贴出了。至此,按随机顺序点亮4个火把然后熄灭的功能就已经实现了。
2.等待玩家点亮火把并记录顺序
在罗盘角色在发送完4个广播之后,需要提示“请按照刚才的顺序点亮所有火把“并等待玩家点亮火把,在罗盘角色代码下面继续编写代码如下:
 

这里,之所以要等待1秒,是因为4个火把从点亮到熄灭之间的时间也刚好是1秒。发送完广播之后,4个火把角色就需要处理广播消息,并等待手指移到该火把上并按下S键点亮火把,一旦点亮火把,此时就需要将该火把的序号保存到“点亮顺序“列表中,并判断4个火把是否都点亮了,如果都点亮了,就需要判断二者的顺序是否正确了。以火把1角色为例,其代码如下 

 

至此,等待玩家点亮火把并记录顺序的功能就已经实现完毕。
3.比较两次点亮顺序
接下来,就需要比较计算机随机点亮顺序和玩家点亮顺序了,其实就是判断“火把顺序“和"点亮顺序“这两个列表是否相等即可,关键是如何比较呢?
简单的想法自然是直接比较两个列表,但是需要注意这种方式在scratch中并不总是正确,而且在所有的编程语言中,一般也不会直接
使用这种方式。不妨换一个思路,分别将两个列表中的数字进行连接。得到一个字符串,然后再进行比较,这个比较是在罗盘角色中进行的。代码如下:
 

需要注意的是,对于字符串而言,其初始值要设置为空,如果二者顺序相同,则说"正确",然后广播”旋转”,否则说“错误“,结束游戏。
4.转动罗盘
当罗盘接收到“旋转“广播之后,需要根据点亮顺序,依次旋转罗盘,这是本作品的又一难点,因为这里的顺序是随机的,每次都是不同的。实现方法有多种,我这里介绍最简单的一种,也是小朋友最容易理解的一种方式。首先要找到关键点,在罗盘旋转的过程中,变化的是什么呢?毫无疑问是方向,而且这里的1、2、3、4对应的方向值分别是90、-90、180和0。如此一来就好办了,如果当前的数字是1,那么就让罗盘重复右转直到方向为90度,如果当前数字是2,那么就让罗盘重复右转直到方向为-90,以此类推..在这个过程中,我们根本不用关心,当前罗盘在哪个位置,是不是很方便,具体实现代码如下:
 

5.打开大门
最后一步就是打开大门了,这个非常的简单,大门角色在接收到”开门“广播消息之后,直接切换造型即可,代码如下:
 

第 3 题 问答题
密室逃脱
题目说明
编程实现:密室逃脱
具体要求:
1).点击绿旗,出现对应的角色与背景
 

2).点击一下床上的蓝色钥匙后,钥匙可以跟随围标指针移动;
3.拖动鼠标将钥匙移到床头柜的第二个抽尾的钥匙孔处,出现对话框“抽冠打开”,等待1秒蓝色钥匙消失,可以从抽冠中拿出红色钥匙,红色钥匙出现
在画面中;
 

4).点击一下红色钥匙,红色钥匙跟随里标指针移动,移动到电脑桌第一个抽园的钥匙孔处,出现对话框"抽园打开",等待1秒红色钥匙消失、可以从抽
屉中拿出白色门卡,白色门卡出现在画面中; 

 

5).点击一下门卡,门卡可以跟围标指针移动,碰到紫色把手消失,密码锁会随机说出5个数字(0-9),输入由这5个数字组成的最大五位数并出现输入框;

 

6.如果输入的最大五位数正确,提示:“正确,门打开”,如果输入最大的五位数错误,提示:“请重新输入(还有一次机会)”,两次机会全部输错
提示:“错误,门已锁死”。
 

 

 

可以看到,这里有4个角色,结合上面的流程图,我们可以按照角色的顺序来编写程序。
1.蓝色钥匙
对于蓝色钥匙角色而言,主要有3个小功能:
初始化设置
点击钥匙,让钥匙跟随鼠标移动
打开抽屉,拿到红色钥匙
先上代码,如图所示:
 

其中,初始化包括位置设定和显示,以确保每次游戏开始时,蓝色钥匙是出现在床上。对于按下留标的处理,并没有使用"当角色被点击“指令,而使用了“等待条件”指令,这样可以确保蓝色钥匙只能被点击一次,以及只有在点击绿旗之后才可以点击钥匙。这是一个非常有用的Scratch编程小技巧,可以让程序更加严谨,减少不必要的bug。打开抽屉,这里使用的是颜色碰撞检测,一旦碰到蓝色钥匙孔,就可以说”抽屉打开“了,然后隐藏蓝色钥匙。打开抽尼,就找到了红色钥匙,从蓝色钥匙角色到红色钥匙角色,涉及到跨角色之间的通讯,这需要使用事件广撞机制,所以最后发送了一个广播”找到红色钥匙“,这就好比是蓝色钥匙角色给红色钥匙角色打了一个电话。

2.红色钥匙
红色钥匙角色的效果和蓝色钥匙基本一致,所不同的地方有如下3点:
位置不同
开始时处于隐藏状态
碰到红色钥匙孔才能拿到门卡
红色钥匙有两个代码块,一个是绿旗代码块,表示初始状态,另一个则是在接收“找到红色钥匙“广播需要处理的代码,具体代码如下:
 

同理,在说”抽屉打开“并隐藏自己之后,需要通知门卡角色,因此在代码的最后添加了一个广播”找到门卡“指令.

3.白色门卡
门卡角色的逻辑和代码基本是一样的,这里就不再赘述了,直接上代码:
 

在门卡角色隐藏之后,需要给密码锁角色发送一个”找到锁了“的广播消息。
4.密码锁
在接收到门卡角色发送的”找到锁了“的广播消息后,需要实现如下3个小功能:生成随机密码
提示用户输入密码
判断密码是否正确
这是本题的重难点,是考验孩子逻辑思维能力和处理数据能力的时候了。首先,我们来生成随机密码,密码是一个5位数,每一位都是从0-9之间随机取数,思路其实也挺简单的,就是按万、千、百、十、个的顺序依次从0~9之间取一个随机数。
具体实现也非常简单,先定义一个变量"数字串“并设置为空,然后使用字符串连接运算,逐个将每一位上的数字进行连接,同时将这些数字保存到”数字“列表中,便于后续处理,这部分的代码如下:
 

其次,我们要通过"数字“列表获取密码,密码是由这5个数字组成的最大5位数。针对这个需求,通常的做法对列表进行排序,然后依次将5个数拼成一个数字,只是这种方式难度有点大,很多孩子一时还掌握不了。细心的你也许已经发现了,这5个数字都是一位数,取值范围是0-9。我们可以换个思路,针对这5个数字,让每个数字都和9进行比较,如何相等,那么这个数字就位于密码数字的高位,接着依次和8、7、6、5、4、3、2、1、0进行比较,一轮下来,就可以得到最大5位数了。
这里需要用到计数循环以及嵌套循环,为了简化代码,可以使用自制积木来获取最大5位数作为密码,代码如下:
 然后就可以在询问之前调用这个自制积木来获取所谓的密码,并保存到变量”密码“中。接下来,玩家在输入框中输入一个数字作为密码,并判断密码是否正确。由于这里最多只有两次机会,根据上面绘制的流程图,我们只需要使用两个”如果...那么...否则“指令就可以,具体代码如图:

 

至此,整个功能就全部实现完毕

第 4 题 问答题
切换子弹
题目说明
编程实现:切换子弹
具体要求
1).点击绿旗,呈现对应的角色与背景;
 

2).按下数宁键1,发射1类型子弹-火焰弹;
 

3). 按下数字键2,发射2类型子弹-火焰散弹;
 

4).再次按下数字键1,发射1类型子弹-火焰弹;
5).子弹为持续发射状态,数字键1与数字键2可以持续切换发射子弹的类型
 注意:很多刚开始学编程的孩子,经常会漏掉这里的”重复执行“指令,导致没有任何效果,切记,"如果..那么“指令只能执行一次,通常需要和”重复执行“指令配合使用。
接下来就需要分别处理发射两种不同的子弹了。

2.发射1类型子弹-火焰弹
类型子弹始终沿着90度方向发射,因此,只需要将子弹角色设置为90度,不停的克隆即可,只是要控制一下克隆子弹的频率,通常的做法就是等待一下,比如0.05秒,这部分的代码如下:

 

一旦生成了子弹克隆体,就可以让它不停地向前移动,直到碰到舞台边缘消失,代码如下:
 

这样一来,1类型子弹就可以成功发射出去了。

3.发射2类型子弹-火焰散弹这是本题的重点,也是难点,沿着5个不同的方向发射子弹,意味着我们需要在按下数字键2的时候,一次性克隆5个子弹,并设置不同的方向。看起来挺简单的,大部分学生都会这么写:
 

从逻辑上来讲,这么写没有任何问题,但是效果看起来却有点奇怪,如下图所示:
 

眼尖的你,估计已经发现了,这里的5颗子弹并不是同时发射出去的,明显的有先后顺序。尽管这里没有"等待1秒“指令,但是代码执行还是要占用时间的,所以这里的5颗子弹还是有先后顺序的,也就导致出现了上图所示的效果。
(O 0? 能否让5颗子弹同时克隆出来呢?
当然能,今天超平老师就教你一招,借助自制积木就可以,将克隆5颗子弹的程序定义成自制积木,如图所示:
 

 

那么,你可能要问了,这里的”运行时不刷新屏幕“是个啥意思呢?其实,更确切地说,"运行时不剧新屏幕”,是不新舞台。其作用是,使得自制积木中的代码在执行时省去舞台刷新的步骤,并在整个自制积木执行完毕后再刷新屏幕。
由于刷新舞台会消耗计算机资源,需要一定的时间,因此使用“运行时不刷新屏幕“功能可以使特定的代码加快执行效率,缩短运行时间,但是用户无法通过舞台看到程序运行过程中的效果变化,可以简单的理解这部分的代码是同时执行的。除了本例中的确保多个子弹同时克隆的效果,还可以用于Scratch画笔费间绘制好图形,以及角色碰撞时控制其行为的物理引擎等总之,“运行时不刷新屏幕”功能为在Scratch中实现更多更丰富的效果提供了可能,是一个比较强大的功能。至此,发射2类型子弹的效果也完成了。

第 5 题 问答题
存钱罐
题目说明
编程实现:存钱罐
具体要求:
1).点击绿旗,出现对应的角色与背景 (初始余额为1000)
 

2).点击存钱,询问存多少钱并出现对话框
 

3).输入存钱数,余额显示存入后的总钱数;
 

4).点击取钱,询问取多少钱并出现对话框 

5).在对话框内容输入取钱数额,余额显示取出后的总钱数;
 

6).如果取出的钱数大于余额,则显示余额不足1秒后显示此时余额;

 

 

注意: Scratch中的“+”指令只对数字起作用,如果输入的是非数字内容,都会被当作0来处理。所以,如果输入的不是纯数字串,那么余额将保持不变。

2.取钱过程
接下来是取钱过程,当点击“取钱”按钮时,会询问“取多少钱?”并根据输入金额作相应处理。这里有两种情形。一是余额不足,一是余额充足,所以,我们需要使用“如果...那么...否则“双分支条件指令。如果余额充足,直接相减即可。如果余额不足,则需要先将变量“余额"修改为“余额不足”,1秒后再显示原来的余额,因此我们需要借助一个临时变量“临时余额”来保存余额。
切换到“取钱”角色,编写代码如下:
 

第 6 题 问答题
旋转的风车
题目说明
编程实现:旋转的风车 (画笔题目,使用画笔绘制不能有其他角色出现,否则0分)
 

具体要求
1).点击绿旗,使用画笔画出风车的三角形基座 (大小颜色自己设置,笔粗:20) ;

2).画出四个长方形组成的扇叶 (大小颜色自己设置) ;
3).扇叶可以顺时针持续转动 (扇叶为原地转动)
4).在舞台上能够完整呈现画出的风车 (基座和扇叶不能分离)
 

看到这个代码你有什么感觉,是不是有点情,然后是疑点重重,右转75度、105度度是怎么算出来的,移动150步、80步又是如何确定的呢?
很显然,对于中小学生而言,这种方法理解起来比较困难,可操作性也不强,我们再来看看第二种方法,先确定好三个顶点的位置.第一个顶点比较好确定,就是舞台中心。其坐标为(0.0),根据坐标轴的对称性原理。另外两个顶点相对于Y轴是对称的,如果其中一个顶点到x坐标是50,那么另一个顶点的x坐标就是-50,至于y坐标就简单多了,大致估计一下即可,比如-150,如图所示:
 

确定好了3个顶点,绘制就非常简单了,为了方便,将这部分的代码定义为一个自制积木,如图:
 

和第一种方法相比较,这种方法是不是更容易理解了,关键是可操作性强,超平老师强烈推荐这种方式。接下来我们再绘制扇叶,扇叶是有4个长方形构成的,围成一圈,这个比绘制三角形要简单多了,为了方便还是将其定义为一个自制积木,代码如下:
 

需要说明两点:
1).这里使用了嵌套循环,其中内层的循环是绘制一个扇叶(长方形》,长宽分别为130和30,单位是步(像索),外层循环是绘制4个扇叶。
2).我们给自制积木添加了一个参数“方向”,这样就可以灵活设置风车的方向,为下一步的旋转做好准备。

2.让风车旋转起来
如何让风车旋转起来,这就是涉及到顿动画原理了,什么是顿动画?所谓顿动画,就是在时间轴的每顿上逐顿绘制不同的内容,使其连续播放而成动画。翻书动画就是一个顿动画,其中的每一页纸就是一顿,翻书的过程就是连续播放,从而形成动画效果。简单来说,顿动画就是由N张静态图片收集起来,然后通过控制依次显示这些图片,因为人眼“视觉残留”的原因,会让我们造成动画的“错觉",跟放电影的原理一样!
一旦你理解了顿动画,我们要让风车旋转起来就变得容易多了。尽管绘制出来的风车是静止不动的,但是我们可以从一个方向开始(比如90度) ,先绘制一个风车,然后将方向变为91度,再绘制一个风车,依此类推...这里的每一个风车就是一顿,每绘制一个新的风车,就将原来的内容擦除掉,这样就可以形成一个顿动画,从而得到一个动态的旋转风车效果。
代码其实非常简单,如下:
 

第 7 题 问答题
文字特效
题目说明
编程实现:文字特效。
具体要求:
1).点击绿旗,舞台呈现空白状态1秒钟;

2).“蓝”宁以特效 (像素初始值:300) 出现并逐渐清晰的呈现出来
 

3).“蓝”宁呈现1秒后,“桥”字以特效 (虚像初始值:100) 逐渐清晰的呈现出来
 

 

2.“桥”字特效
对于“桥“字角色来说,当绿旗被点击时,也是不显示的,先来完成这部分的代码,如图所示:
 


当接收到"蓝“字角色发送的“出现桥字“广播后,先将“桥"字显示出来,接着就是将其虚像特效值设为100,然后就是经过多次循环,将虚像值逐渐减到0,对应的代码如下:
 

至此,”蓝“和”桥“两个文字特效就已经实现好了
不过,有一个细节需要说明一下,在Scratch编程中有7种图形特效,分别是颜色、鱼眼、旋涡、像索化、马赛克、亮度和虚像,如图所示:
 

正常情况下,所有特效的初始值都是0,也就意味着没有特效。这也是为什么在上面的代码中要将"像素化“和"虚像“都逐渐减到0的原因,当”像索化“和”虚像“减到0时,特效就没有了,也就完全清晰了。

猜你喜欢

转载自blog.csdn.net/IT_Scratch/article/details/130927695