魔法师盖城墙-第11届蓝桥杯Scratch国赛真题第4题

[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第10讲。

第11届蓝桥杯青少年组国赛原定于2020年4月25日举行,因疫情推迟到2020年10月31日,并且改为在线考试。Scratch分为初级组和中级组,其中初级组面向7~10岁孩子,中级组面向11~14岁孩子。

魔法师盖城墙,本题是第11届蓝桥杯Scratch国赛真题编程第4题,中级组和初级组都有此题。题目要求考生编程实现当我们输入城墙规模,魔法师就能瞬间变出相同规模的城墙,本题难度系数为4。

作品说明

背景信息:

童话世界里发生了一件大事,兽人族要进攻人类的国家,人类魔法师使用魔法修建了高高的魔法之墙,来抵御兽人族的进攻,让我们为魔法师们加油吧!

编程实现:

当我们输入城墙规模,魔法师就能瞬间变出相同规模的城墙。

具体要求:

1). 点击绿旗,出现魔法师说:“输入m * n(m表示每层砖块的个数,n表示一共的层数,中间必须用乘号连接。m取值范国:1 < m < 15,n取值范围:1 < n < 15,选取m和n范围内的数值输入到对话框);

图片[1]-scratch魔法师盖城墙_第11届蓝桥杯scratch国赛教程-超平的编程课

2). 例如8 * 12,点击之后,魔法师说“开始建造8 * 12的城墙”;

图片[2]-scratch魔法师盖城墙_第11届蓝桥杯scratch国赛教程-超平的编程课

3). 盖出城墙。(大小参考值:30)

图片[3]-scratch魔法师盖城墙_第11届蓝桥杯scratch国赛教程-超平的编程课

效果预览

在编程之前,先来看看作品的完整效果吧:

思路分析

本题一共有两个角色,分别是魔法师和砖块,如图所示:

图片[4]-scratch魔法师盖城墙_第11届蓝桥杯scratch国赛教程-超平的编程课

相应的流程也非常清晰,根据用户输入的层数m和每层砖块数n,使用Scratch克隆建造一座m * n的城墙。这里的难点在于如何获取用户输入的m和n,尤其要注意用户输入的时候,可能没有空格,也可能带有空格。

比如8*12,*两边都没有空格,又比如8 * 12,*两边都有空格,再比如8 *12和8* 12,一边有空格,一边没有空格。因此,我们编写的程序要具备良好的容错性,能够同时处理好这些不同的情况,具体实现我们稍后再说。

编程实现

根据题目描述以及上面的思路分析,我们分3步来进行编程:

  • 魔法师询问并发号施令
  • 拆分字符串,获取m和n的值
  • 克隆砖块建造城墙

1.魔法师询问并发号施令

在点击绿旗后,魔法师首先会询问“输入m * n”,当用户输入完成后,魔法师会发号施令,说“开始建造m * n的城墙”。这需要使用问答指令,同时利用字符串连接运算指令拼接成一句完整的话,其代码如图所示:

图片[5]-scratch魔法师盖城墙_第11届蓝桥杯scratch国赛教程-超平的编程课

执行完这段代码后,用户输入的内容就保存到变量“算式”中了。接下来,就需要对“算式”进行拆分,获取其中m和n的值了。

2. 拆分字符串,获取m和n的值

针对乘法算式m*n,不管中间有没有空格,也不管中间有几个空格,其关键在于*的位置,一旦确定了*的位置,就可以将算式一分为二,再分别对左边和右边的字符串下进行去空格处理,就可以得到m和n了。

所以,这里要分两步:

  • 确定*的位置
  • 去空格处理

先来实现第一步,确定*的位置,为了简单起见,可以定义一个自制积木,将其命名为”确定乘号位置“,代码如图所示:

图片[6]-scratch魔法师盖城墙_第11届蓝桥杯scratch国赛教程-超平的编程课

代码也比较好理解,这里使用了一个计数循环,对”算术“字符串进行逐个遍历,如果字符为*,那么就其对应的编号保存到变量”index“中。

接下来,就可以分左右两边来进行去空格处理,同理,为简单起见,将其定义为自制积木”拆分字符串“,代码如图所示:

图片[7]-scratch魔法师盖城墙_第11届蓝桥杯scratch国赛教程-超平的编程课

需要注意,此处的”字符串“和”索引“是自制积木的参数,也就是在自制积木中才能使用的变量。其中,”字符串“表示要拆分的目标字符串,”索引“表示要拆分的位置。

这里仍然采用了计数循环,第一个计数循环从1到索引的位置,如果字符不为空,则作为有效字符,追加到变量m中。第二个计数循环从索引+1的位置开始直到字符串结尾,如果字符不为空,则作为有效字符,追加到变量n中。这样就可以获取到m和n的值了。

自制积木定义好了,接下来需要使用了,在绿旗指令所在代码块的”说2秒“指令下面编写代码如下:

图片[8]-scratch魔法师盖城墙_第11届蓝桥杯scratch国赛教程-超平的编程课

需要注意的是,这里的变量”m“和”n“的初始值要设为空字符串,不能设为0,因为整个过程中对”m“和”n“所做的是字符串连接操作,不是数学运算。

一旦获取到m和n的值了,接下来就可以建造城墙了,而建造城墙是在”砖块“角色中进行的,因此,需要发送一个广播消息。

3. 克隆砖块建造城墙

当”砖块“角色接收到广播消息之后,就可以开始克隆了,克隆的思路也很简单,就是一层一层的克隆。

先将本体移到舞台左下角,每一层要克隆m个,就是重复执行m次,每克隆一个,就右移30步左右。一层克隆完毕,将本体移到左边,同时y坐标增加相应距离,开始克隆第二层,依此类推,一共有n层,所以需要将这个过程重复执行n次,其代码如图所示:

图片[9]-scratch魔法师盖城墙_第11届蓝桥杯scratch国赛教程-超平的编程课

至此,我们的作品就大功告成啦,有了高高的魔法之墙,就可以抵御兽人族的进攻了。

总结与思考

本题难度适中,代码量大概在85个积木块左右,涉及到的知识点包括:

  • Scratch问答指令,包括”询问并等待“和”回答“指令;
  • 字符串连接运算,以及字符串拆分的编程技巧;
  • 变量及其初始化,尤其要注意作为字符串时的初始化;
  • 计数循环,要结合变量和指定次数循环来实现;
  • 自制积木的定义使用及参数的理解;
  • Scratch克隆编程。

需要注意的是,在Scratch中,字符串非常灵活,如果是一个纯数字字符串,只要将它放在需要数字的指令中,它就会自动变成数字,比如”重复执行10次“指令、加减乘除等运算指令。

针对本作品,有几个地方还可以进一步完善:

1). 对于用户输入无效的算式,没有做相应的处理,在实际编程时,是必须要进行判断并给出反馈提示的;

2). 对于m和n的取值范围,都限定在1~15之间,因为舞台空间有限,此处也没有做相应处理;

如果能处理好这些细节,我们的程序就会变得更加健壮,你想好怎么做了吗?


需要素材和源代码的,可以转到这里,魔法师盖城墙-2020.10.31蓝桥杯国赛第4题

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容