洗牌发牌-第14届蓝桥杯STEMA测评Scratch真题精选
洗牌发牌,本题是2023年1月15日举行的第14届蓝桥杯STEMA考试Scratch图形化编程真题中级组编程部分第5题,也是最后一题。题目要求编程实现洗牌发牌游戏,当按下空格键时,五张纸牌牌面背朝上进行随机洗牌,1秒后在五张牌中随机抽取两张牌放到舞台下方边缘处,在按下A键时翻开牌面。
先来看看题目的要求吧。

题目说明

编程实现:
洗牌发牌。
具体要求:
1). 运行程序,角色、背景如图所示(五张草花牌面按照从小到大顺序排列);
2). 按下一次空格键,五张草花牌面背朝上进行随机洗牌(能看到牌面移动过程);
3). 等待1秒,在五张草花牌中随机抽取两张牌放到舞台下方边缘处(两张纸牌按照抽取的先后顺序排列);
4). 按下一次A按键,五张牌翻开牌面;
评判标准:
5分:满足"具体要求"中的1); 10分:满足"具体要求"中的2); 5分:满足"具体要求"中的3); 10分:满足"具体要求"中的4)。

思路分析

本题只有一个角色,就是扑克牌,如图所示:
初始化纸牌 洗牌 抽牌 翻开牌面
洗牌是这个作品的难点,怎么找到突破口呢?
进一步思考,可以发现5张牌的y坐标其实是固定不变的,只有x坐标是变化的,我们可以将5张牌的x坐标保存到一个列表中,如图:
其中,列表的编号可以直接对应于纸牌的编号,每张纸牌可以通过编号获取自己的x坐标信息。所谓洗牌就是将列表中的数据顺序打乱,然后将纸牌移到新的位置即可。
接下来,我们就进入具体的编程实现环节。

程序实现

根据题目描述和思路分析,我们可以分4步来编写程序:
初始化纸牌 洗牌 抽牌 翻开牌面

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. 翻开牌面
由于前面已经将每张牌的造型保存到私有变量“_造型”中,我们只需要切换到对应的造型即可,代码非常简单,如下所示:
至此,我们的洗牌翻牌作品就创作好了,赶紧来试试效果吧

总结与思考

克隆编程,重点是掌握克隆体的特点和一些陷阱; 变量的使用,尤其是私有变量在克隆中的作用; 列表的使用,重点是将列表数据打乱顺序; 判断按下鼠标操作的实现方法; 等待条件指令的灵活运用。
作为中级组最后一题,本题难度较大,考察的重点是克隆编程及列表的使用,尤其是克隆体的编程技巧和特点,需要考生具备扎实的编程知识。

添加 家长论坛微信
全部 0条评论