[导读]:蓝桥杯选拔赛每一届都要举行4~5次,和省赛、国赛相比,题目要简单不少,再加上篇幅有限,因此我精挑细选了一部分题目进行解读。
绘制金字塔,本题是第10届蓝桥杯Scratch真题,出现在2019年的市选拔赛考试中,题目要求使用Scratch中的画笔相关指令绘制金字塔结构,要求先画出一个长方形砖块,然后一块一块堆成金字塔。
先来看看题目的要求吧。
一.题目说明
准备工作:
导入小猫角色,使用默认白色背景。
编程实现
用程序,画出长方形砖块,堆成金字塔,要求有一块一块砖块的效果。
评判标准:
- 20分:能够画出一个长方形(这将成为你画金字塔的砖块),一次性画成一块砖;
- 40分:能够画出金字塔(须画出10层以上的金字塔,含10层),金字塔最下面一层的砖块数,等于金字塔的层数,每上一层,砖块的数量减1,直到最上面的一层,砖块为1(如上图所示);
- 60分:能够让金字塔居中显示在舞台区;
- 80分:能够画出20层以上的金字塔,并居中,且全部显示在舞台区;
- 100分:能够画出30层以上的金字塔,并居中,且全部显示在舞台区,并使金字塔从上到下有颜色的渐变。
二.作品效果
在编程之前,先来看看作品的完整效果吧:
三.思路分析
本题属于Scratch画笔绘制作品,只有一个默认的小猫角色, 如图所示:
根据题意并结合效果图,我们可以得知,金字塔的基本单元是砖块,也就是一个小长方形,并且长方形的长是宽的2倍(这是一个非常重要的信息)。
所以,我们的第一步,就是要绘制一个小长方形,为了提高代码重用性(节省代码),可以使用函数的编程思想,也就是Scratch3.0中的自制积木来绘制小长方形,然后再使用自制积木一层一层的来绘制金字塔。
这里有两个难点:
- 如何自动计算砖块的大小,层数越少,砖块越大,层数越多,砖块越小;
- 如何获取每一层第一个砖块的位置,每往上一层,砖块数量就减1,因此其位置(包括x坐标和y坐标)在不停的变化;
接下来,就由超平老师为你一一解答,绘制出完美的金字塔吧。
四.编程实现
根据题目要求和思路分析,我们分如下3步来编写程序:
- 绘制长方形砖块
- 绘制金字塔
- 增加问答绘制不同高度的金字塔
1. 绘制长方形砖块
绘制长方形非常简单,重点需要考虑如下两个问题:1). 这个小长方形的长和宽是多少?2). 长宽是固定值还是变化的?我们不妨先画一个草图如下:
这里有4座不同的金字塔,其层数分别是10、15、20、30。通过比较,结论一目了然,小长方形的长宽是变化的,随着层数的增加而减小,层数越多,长宽就越小。
因此,砖块的长度应该使用变量来表示,在函数(也就是自制积木)中,就是所谓的参数,我们定义自制积木如下图所示:
有了这个自制积木,我们就可以绘制出任何长度的砖块来,只需要在使用自制积木的时候填入砖块的大小即可。
2. 绘制金字塔
有了绘制砖块的自制积木,接下来我们就可以使用它来绘制金字塔了。在绘制的过程中,我们需要考虑如下3个问题:
1). 砖块的长度是多少?
2). 每一层绘制多少个砖块?
3). 每一层砖块的起点在哪儿?
尽管我们可以绘制任意层数的金字塔,但针对每一次独立的绘制,金字塔的层数是确定的,为了方便,在这里添加一个变量“层数”,表示要绘制金字塔的层数,我们可以手动的设置变量的值,比如,将层数设置为20,如图所示:
而一旦层数确定了,那么砖块的长度也就可以确定下来了。Scratch舞台的长度是480步(像素),我们不妨将最底层的砖块从左到右填满舞台,而金字塔最下面一层的砖块数,等于金字塔的层数(题目的评判标准中第2条已给出)。
所以,砖块的长度就等于 480 / 层数,相应的再定义一个变量“长度”,并将长度设为 480 / 层数,如图所示:
根据题目评判标准中的第2条描述,金字塔最下面一层的砖块数,等于金字塔的层数,每上一层,砖块的数量减1,直到最上面的一层,砖块为1。
因此,我们可以定义一个变量“个数”,用来表示每一层要绘制的砖块数量,由于我们是从底层往上一层一层的绘制,所以刚开始的时候,我们将个数设置为层数即可,如图:
稍微有点麻烦的就是第3点了,即砖块的起点,每一层的起点都不相同,怎么设置呢?
方法比较多,我就不一一列举了,超平老师在这里介绍一个小技巧,简单而又巧妙。
每一层都是从左至右来绘制的,假设当前层砖块数量为n,当第n个砖块绘制完成后,将小猫左移n个砖块的距离,这样就回到了第一个砖块的位置,然后在x轴方向右移半个砖块的距离,并在y轴方向上移一个砖块的高度,这样就可以接着绘制下一层了。
绘制的核心代码如下:
简要说明如下:
1). 这里有两层循环,内层循环用于绘制当前层的砖块,外层循环则表示一层一层的绘制;
2). 这里的”将x坐标增加“指令使用了两次,第一个指令的作用是让小猫角色回到当前层的起点,第二个指令的作用是再右移半个砖块的距离;3.增加问答绘制不同高度的金字塔在上面的代码中,层数设置为20,我们可以将层数改成其他的数字,从而绘制出不同高度的金字塔。
实际上,还有一个更好的方法,就是使用问答指令,让用户输入任意数字,然后绘制出对应层数的金字塔,完整的代码如下:
需要说明的是,由于是从舞台底部开始绘制的,如果层数比较小,小猫会因为碰到舞台边缘,导致绘制效果不理想,所以建议你输入的层数大于10。如果确实想绘制10层以下的金字塔,可以把起点的y坐标设置得靠上一点,比如-100。
至此,整个作品就创作完成了,你可以输入不同的层数,绘制出不同高度的金字塔了,如果想加快绘制的速度,可以设置为加速模式。
五.总结与思考
本题难度系数为5,积木块数量45个左右 ,涉及到的知识点主要包括:
- 循环编程,重点是循环嵌套的使用;
- 画笔相关指令,包括擦除、落笔、抬笔、设置画笔粗细、设置画笔颜色等;
- 自制积木及其参数的使用;
- 变量的使用;
- Scratch问答指令;
- 如何精确计算角色的位置。
本题有一定的难度,有两个关键点,一是要找到各个变量之间的关系,即层数、砖块长度、每层砖块数量之间的关系,二是如何计算每一层第一个砖块的位置。
在绘制金字塔的过程中,我们又一次使用到了数学知识及其运算,编程和数学真是俩好兄弟,永不分家呀。
之前分享的第12届蓝桥杯Scratch省赛3真题第4题《修建金字塔》和此题非常类似,有兴趣的同学可以去看看。
如果你觉得文章对你有所帮助,别忘了点赞,你的鼓励是我坚持继续写下去的最大动力,Thanks♪(・ω・)ノ。