拼图游戏,本题是2023年5月28日上午举行的第14届蓝桥杯国赛Scratch图形化编程初中级组真题第5题,题目要求编程创作一个拼图游戏 。游戏开始后,4块拼图随机在舞台内部交换位置,每隔1秒,其中两块拼图被两个蓝色框选中并完成自动相互交换位置,当成功复原所有拼图后,游戏结束。先来看看题目的要求吧。
一.题目说明
编程实现:
拼图游戏。具体要求:
1). 点击绿旗,角色、背景如图所示;
2). 等待1秒后,4块拼图随机在舞台内部交换位置(拼图之间不能重叠);
3). 每隔1秒,其中两块拼图被两个蓝色框选中并完成自动相互交换位置;
例如:左下角拼图和右下角拼图上同时出现蓝色方框,再自动进行位置交换,交换后蓝色方框消失
4). 4秒内拼图自动交换位置后,成功复原拼图,程序结束。
评判标准:
- 5分:满足”具体要求”中的1);
- 25分:满足”具体要求”中的2);
- 35分:满足”具体要求”中的3)。
- 15分:满足”具体要求”中的4)。
二.作品效果
在编程之前,先来看一下作品的完整效果吧:
三.思路分析
本题包含4个角色,分别是拼图1、拼图2、拼图3和拼图4,如图所示:
每张拼图都包含两个造型,分别表示未选中状态和选中状态,如图:
当4张拼图按照顺序依次摆放时,就可以拼出一幅完整的图片。4张拼图,4个角色,它们的操作都是相同的,就是从一个位置移到另一个位置。
这里的关键有两个:
1). 如何表示4张拼图的顺序;
2). 如何交换拼图位置;
在整个游戏过程中,我们时刻要知道每张图片所在的位置,这就需要将拼图的顺序保存起来,由于这里有4张图片,因此使用列表是最佳选择。
可以使用数字来表示拼图的顺序(也可以称之为位置),如图:
其中,编号1、2、3、4分别对应于4张拼图,而列表项则表示每张拼图所处的位置。
上图中的列表数据表示,拼图1在第2个位置(舞台右上区域),拼图2在第3个位置(左下区域),拼图3在第1个位置(左上区域),拼图4在第4个位置(右下区域)。
有了这个列表,交换拼图位置也变得简单了。表面看起来是交换拼图位置,实际上是对列表中的数据项进行交换。
比如,要复原拼图1,实际上就是找到当前在第1个位置上的拼图3(列表的第3项)和拼图1(列表的第1项)进行交换。
我们可以先将列表中的第1项和第3项进行交换,交换后如图所示:
与此同时,我们按照列表中的位置重新设置好拼图1和拼图3的位置,就可以实现两张图片的交换了。
重复上述操作,当列表中的顺序变为1、2、3、4时,就表示整个拼图复原完毕。
需要注意,由于列表项的编号和值都是数字1、2、3、4,所以在理解上会有点抽象,要多思考一下,或者是结合画图来理解。
接下来,我们进入具体的编程实现环节。
四.编程实现
根据题目描述和思路分析,我们分如下3步来编写程序:
- 初始化设置
- 随机摆放拼图
- 自动复原拼图
1. 初始化设置
点击绿旗时,4张拼图按照1、2、3、4的顺序自左向右、自上向下依次排列,我们只需要设置它们的位置和造型即可。切换到拼图1角色,编写代码如下:
再切换到拼图2角色,编写代码如下:
然后切换到拼图3角色,编写代码如下:
最后是拼图4角色,对应的代码为:
此时,呈现的是一幅完整的图片。
2. 随机摆放拼图
等待1秒后,4块拼图随机在舞台内部交换位置,根据前面的思路分析,我们创建一个列表”顺序“,然后将数字1、2、3、4以随机顺序插入列表中。
在这里,超平老师总结了一个”插队算法“,所谓插队算法就是模拟日常生活中排队时不文明的插队行为。
如果你是第一个来到窗口的,很显然,你就排在第一位,只有一个位置可以选择;
如果你前面已经有一个人了,你有两个位置可以选择,排在第一个人的前面,或者他的后面;
如果你前面已经有两个人了,你有3个位置可以选择,即1的前面、2的前面或者2的后面。
在Scratch编程中,可以结合“在列表的第1项前插入”和“在1和10之前取随机数”两个指令来实现插队算法。
由于4个拼图角色都是平等的,因此我们可以在舞台背景中来操作列表。切换到舞台背景中,编写代码如下:
相应的,4个拼图角色在接收到广播消息后,按照列表中的顺序来调整自己的位置。
以拼图1角色为例,编写代码如下:
代码不难理解,说明两点:
1). 角色1对应于列表的第一项,它有4个位置可选,需要分别判断并设置坐标;
2). 由于后面还需要交换位置,所以这里使用了自制积木,后续只需要直接调用即可。
其它3个拼图角色的代码基本相同,不同的是拼图2对应列表第2项,拼图3对应列表的第3项,拼图4对应列表的第4项,这里就不再列出代码了。
3. 自动复原拼图
接下来就要自动复原拼图了,根据题目的描述,每隔1秒自动交换一次,4秒内完成复原。
我们可以这样来考虑,先找到拼图1,将它和位置1的拼图交换,再找到拼图2,并和位置2的拼图交换,然后找到拼图3,和位置3的拼图交换,如此一来,最多3次就可以复原成功。
根据前面的思路分析,我们先对列表中的数据进行交换,然后再根据列表中的数据重新调整拼图的位置。
在舞台背景中,继续编写代码如下:
这段代码的信息量较大,重点说明4点:
1). 这里的i表示位置,先从第一个位置开始,找到拼图1和要交换的拼图,分别用变量“图1”和“图2”来表示;
2). 在交换两个列表项的值时,需要借助一个中间变量“temp”来保存其中的一项;
3). 当数据交换完毕,对应的两张拼图需要调整位置,可以通过发送广播消息来实现,实际上,只有两张拼图需要交换位置,所以我们只给需要交换的拼图发送广播;
4). 当列表的顺序变为“1234”时,停止交换,说明复原完毕。
这里的变量“图1”和“图2”,取值范围是1~4,表示4张拼图。因此,每张拼图只需要处理自己的广播消息即可,也就是说,拼图1只需要处理广播消息“1”,拼图2只需要处理广播消息“2”,以此类推。
切换到拼图1角色,编写代码如下:
再切换到拼图2角色,编写代码如下:
同理,拼图3和拼图4在接收到消息“3”和消息“4”时,都需要做相同的处理,这里就不列出代码了。
至此,我们的拼图游戏就创作完成了,赶紧来欣赏一下自动拼图的效果吧。
五.总结与思考
本题是编程部分第5题,分数为80分,积木块数量140个左右,涉及到的知识点主要包括:
- 列表的操作与应用;
- 事件广播机制,尤其是使用变量来广播的技巧 ;
- 自制积木的使用及作用;
- 插队算法的编程技巧;
- 列表项交换的算法技巧;
本题难度较大,建议完成时间20~25分钟,中级组考生20分钟,而初级组考生约为25分钟。
本题的逻辑并不复杂,关键是要利用列表这种数据结构来表示4张拼图的位置,在应用列表时,还用到了和列表操作的两个小算法,即“插队算法”和“交换算法”。
Pascal之父、图灵奖获得者尼古拉斯·威茨,瑞士计算机科学家,提出的著名公式“数据结构 + 算法 = 程序”。
这充分说明数据结构和算法的重要性,也为我们指明了学习编程的方向,从这个角度来讲,这是一道非常好的题目。
给你留两个思考题:
1). 为什么说本作品的自动复原最多只需要3次?
2). 如果要改成每次随机选两张拼图交换位置,是不是更有趣呢,那么程序又该如何实现呢?你有什么好的想法和建议,也欢迎和超平老师交流。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香