这是Scratch蓝桥杯真题解析第105讲。蓝桥杯选拔赛现已更名为STEMA,即STEM 能力测试,是蓝桥杯大赛组委会与美国普林斯顿多文化教育研究中心合作推出的考试项目。STEM能力测试致力于综合评价学生的 STEM 水平,对学生的科技素养、逻辑思维和编程能力等三方面进行客观科学的测试。
洗牌发牌,本题是2023年1月15日举行的第14届蓝桥杯STEMA考试Scratch图形化编程真题中级组编程部分第5题,也是最后一题。题目要求编程实现洗牌发牌游戏,当按下空格键时,五张纸牌牌面背朝上进行随机洗牌,1秒后在五张牌中随机抽取两张牌放到舞台下方边缘处,在按下A键时翻开牌面。
先来看看题目的要求吧。
一.题目说明
编程实现:
洗牌发牌。
具体要求:
1). 运行程序,角色、背景如图所示(五张草花牌面按照从小到大顺序排列);
2). 按下一次空格键,五张草花牌面背朝上进行随机洗牌(能看到牌面移动过程);
3). 等待1秒,在五张草花牌中随机抽取两张牌放到舞台下方边缘处(两张纸牌按照抽取的先后顺序排列);
4). 按下一次A按键,五张牌翻开牌面;
评判标准:
- 5分:满足”具体要求”中的1);
- 10分:满足”具体要求”中的2);
- 5分:满足”具体要求”中的3);
- 10分:满足”具体要求”中的4)。
二.作品效果
在编程之前,先来看一下作品的完整效果吧:
三.思路分析
本题只有一个角色,就是扑克牌,如图所示:
不过,角色包含6个造型,如图所示:
其中前面5张是牌面,分别是10、J、Q、K和A,最后一张是扑克牌背面。根据题目描述,本作品需要完成如下4个功能:
- 初始化纸牌
- 洗牌
- 抽牌
- 翻开牌面
其中初始化纸牌最简单,就是依次克隆5张纸牌并切换到不同的造型。翻开牌面就是切换造型,但是每张牌的造型并不相同,如果知道自己是哪个造型呢?这就需要用到私有变量,在克隆的时候,将造型保存到私有变量中即可。抽牌就是在5张纸牌中随机选取两张,最简单的思路就是给纸牌定义一个私有变量,表示编号,并将编号分别设置为1、2、3、4、5,然后在1~5之间随机选择两个数字,将对应的纸牌移到下方即可。
洗牌是这个作品的难点,怎么找到突破口呢?
超平老师建议你从变量入手,这里的变量是指哪些是变化的,哪些是不变的。很明显,在洗牌过程中,每张牌的编号和造型是不变的,真正变化的是位置,因此位置信息是我们关注的焦点。
进一步思考,可以发现5张牌的y坐标其实是固定不变的,只有x坐标是变化的,我们可以将5张牌的x坐标保存到一个列表中,如图:
其中,列表的编号可以直接对应于纸牌的编号,每张纸牌可以通过编号获取自己的x坐标信息。所谓洗牌就是将列表中的数据顺序打乱,然后将纸牌移到新的位置即可。
接下来,我们就进入具体的编程实现环节。
四.编程实现
根据题目描述和思路分析,我们可以分4步来编写程序:
- 初始化纸牌
- 洗牌
- 抽牌
- 翻开牌面
1. 初始化纸牌根据前面的思路分析,我们先创建好两个私有变量“_ID”和“造型”,其中“_ID”表示编号,再创建一个列表“x坐标”,并进行相应的初始化。然后使用循环克隆5张纸牌,每克隆一次,就将本体右移一点,并切换造型,同时需要设置私有变量的值,并将纸牌的x坐标添加到列表中,对应的代码如下:
对应的,再将克隆体显示出来,代码非常简单:
运行程序,效果如下所示:
同时,每张纸牌的私有变量”_ID“分别被设置为1、2、3、4、5,私有变量“_造型”分别被设置为10、J、Q、K、A。
2. 洗牌
接下来就是洗牌了,在按下空格键后开始洗牌,按下空格键的写法通常有两种:
- 使用“当按下空格键”指令
- 使用“重复执行” + “如果…那么” + “按下空格键”指令
- 使用“等待条件” + “按下空格键”指令
该选择哪一种呢?
第一种最为简单,它的特点就是所有的角色包括克隆体都会响应按键操作,所以在有克隆体的时候,要谨慎使用。
后面两种都可以,相对来说,第三种更好一些,不管是哪一种,都需要附带松开按键的判断,确保按下并松开按键算一次。
我们选择第3种,在上面的绿旗代码块下面添加如下代码:
这里定义了一个自制积木,专门用于洗牌操作,对应的代码如下:
洗牌的思路是这样的,在列表中随机选择一项,先删除,然后再重新插入到列表中。这里使用了两个变量“编号”和“temp”,编号是1~5之间的数字,temp则是对应的坐标值。
这里重复执行了5次,实际上,你可重复更多的次数,比如10次,20次。
执行这段代码,就可以将列表中的x坐标打乱,接下来,就需要移动纸牌了,所以这里发送了一个“洗牌”的广播消息,继续编写代码如下:
简单说明三点:
1). 首先将纸牌背面朝上,也就是换成扑克牌造型;
2). 虽然列表中的坐标顺序打乱了,但是列表的编号是不变的,它对应着每张扑克牌的“ID”,所以可以通过“_ID”分别获取每张牌的x坐标,再使用滑行指令移到对应位置即可;
3). 一旦纸牌交换位置了,就会出现左边纸牌挡住右边纸牌的情况,这里做了一个简单的处理,就是利用纸牌的坐标数据,计算每张纸牌等待不同时间移到最前面,从而确保靠右的纸牌处在上面一层。
3. 抽牌
接下来就是抽牌了,抽牌的思路很简单,就是在数字1~5中,随机选择两个数字。不过我们需要考虑两个问题:
- 写在哪个地方
- 如何随机得到两个不同的数字
为什么有写在哪个地方的疑问呢,原因在于所有的克隆体都会执行“当作为克隆体启动时”代码块,而这里的随机两个数字只需要执行一次就行,尽量不要写在克隆体代码块中。
其实,我们可以写到“洗牌”的自制积木中,也就是在洗牌的同时,顺便随机两个数字,它是写在绿旗代码块中的,所以不会执行多次。
在“洗牌”自制积木中,增加代码如下:
简单说明两点:
1). 为了方便,这里使用了两个变量“牌1”和“牌2”,分别表示两张牌的编号;
2). 为了确保“牌1”和“牌2”不重复,这里通过循环来设置“牌2”的值。
对应的,在克隆体代码块中,增加代码如下:
代码非常简单,就是先找出第一张牌,移到下方左边,再找出第二张牌,移到下方右边。
4. 翻开牌面
由于前面已经将每张牌的造型保存到私有变量“_造型”中,我们只需要切换到对应的造型即可,代码非常简单,如下所示:
至此,我们的洗牌翻牌作品就创作好了,赶紧来试试效果吧。
五.总结与思考
本题是中级组最后一题,分数为30分,积木块数量72个左右 ,涉及到的知识点主要包括:
- 克隆编程,重点是掌握克隆体的特点和一些陷阱;
- 变量的使用,尤其是私有变量在克隆中的作用;
- 列表的使用,重点是将列表数据打乱顺序;
- 判断按下鼠标操作的实现方法;
- 等待条件指令的灵活运用。
作为中级组最后一题,本题难度较大,考察的重点是克隆编程及列表的使用,尤其是克隆体的编程技巧和特点,需要考生具备扎实的编程知识。
最后再留一个思考题,本作品中的洗牌只进行了一次,如果每按一次空格键就洗一次牌,该怎么做呢?
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香