用Scratch来制作“逢七过”游戏(基础篇)

各位同学好,我们又见面了。今天给大家带来的是用Scratch制作一款“逢七过”的演示小游戏,通过制作游戏的过程,我们继续巩固Scratch中判断和循环的用法,同时对数学知识中的除法、余数等运算进行一个加深的理解。

  首先,先来简单的介绍一下我们提到的“逢七过”这个游戏。
  这个游戏的规则很简单,就是大家围成一个圈,然后由老师指定一名同学开始从1报数,在大家报数的过程中,凡是数字能被7整除的,同学们在报到这个数字时,都必须用一声“喵”来代替,之后后面的同学继续报数,那么游戏开始时报数会是这个样子的:1、2、3、4、5、6、喵、8、9、10、11、12、13、喵、15、16……随着游戏的进行,游戏的难度也会慢慢的提升,我们目前先从最基础的规则开始制作。

  我们来思考一下这个游戏要怎么进行,我们首先想到如果想要有一个不停增加的数字,我们要运用到“变量”模块;同时为了让它不停的增加,还需要用到“控制”模块中的“循环”功能;此外,在判断数字是否能被7整除时,还需要用到“控制”模块中的“如果…那么…否则”功能;最后,如果要让角色说出这个数字,还需要用到“”模块中的“说…”功能。
  我们先画个简单的流程图来说明一下。参看“流程图(1)”。

流程图(1)

  下面,我们来看Scratch积木代码。

  嗯,这个程序很容易就做好了,点击绿旗运行,没问题,角色如我们所设计的那样“1、2、3、4、5、6、喵、8、9、10、11、12、13、喵、15……”,开始依次报数了。成功!
  下面,我们来增加难度。
  在报数的过程中,如果数字中的某一位包含了“7”,就需要用“喵喵”来代替,比如“13、喵、15、16、喵喵、18……”。
  好了,我们来想想在程序中该如何实现吧。参看“流程图(2)”。

流程图(2)

  下面,问题来了,如何来判断这个数字中含有7呢?Scratch中为我们提供了一种很便捷的方法,这个积木位于“运算”功能区中,这个方法允许代入一个字符串类的参数,如果不是字符串的话,也会使其变化为字符串,然后判断这个字符串中是否有我们要求的字符。
  这里要注意,当我们在做多个条件的判断时,一定要分清楚几个条件彼此之间的关系。比如本题目中的判断条件就是只能满足一种情况,角色要不说“喵”,要不说“喵喵”,要不说出数字,在角色准备说出一个数字的时候,仅能说出这三种情况中的某一种,而不会同时出现两种的情况。这样的判断,我们需要使用到嵌套结构来实现,我们要使判断只能出现一种结果。具体可参看下图。

  下面,我们再来增加一次难度。
  在报数的过程中,如果数字中各个位置的数字的和为“7”,就需要用“喵喵喵”来代替,比如“13、喵、15、喵喵喵、喵喵、18……”。
  这次在程序中该如何实现呢,让我们慢慢来分析。
  流程图与之前的差不多,只不过是加入了第三个判断,用来判断数字各个位置的和是否为“7”。这次我们要用到“自制积木”这个功能。
  我们通过“自制积木”功能,将当前数字通过参数传递进自制积木的内部,让内部的程序来执行完结果,然后回到外部程序中,继续我们的判断。下面我们来看一下代码。

  这里,我们对于“各位求和”这个功能做了两种不同的积木块程序。

方法一

  方法一中,我们使用余数的方法,反复“切”下数字的个位,让它们相加,然后再设法将新数字的个位“切”下,继续相加,如此反复便可以得到整个数字各个位置的和。
  在这里我们用到了——向下取整这个功能。对数字除以10的结果进行向下取整,也就相当于把数字的个位直接切除,比如(向下取整 )123÷10,得到的结果就是12。当然如果这个方法不好理解的话,我们可以看下一种方法。

方法二

  方法二使用了Scratch中提供的字符串处理方法,直接逐位取出数字中的各个位置的数字,然后相加即可。

  至此,我们完成了“逢七过”游戏的三种游戏难度的Scratch方法移植,赶快点击小绿旗,让Scratch的小猫试着给我们演示一下这个游戏吧!  

  好了,这次带来的趣味小编程就到这里了,大家有任何的想法可加我的微信(下方二维码)、微博@亿万星辰桃桃爸,跟我一同讨论少儿编程,进入编程这五彩斑斓的世界,我们下期再见。

用Scratch来解决奥数问题之“韩信点兵”(基础篇)

从今天起,我们将每隔一段时间安排一次用Scratch来解决奥数问题的栏目。在这个栏目里,我们将通过Scratch编程来帮助我们理解奥数问题中的核心所在——解题逻辑。

  下面,我们先来看看题目。

  题目出自我国古代一道流传于民间的趣味算术题——“韩信点兵”。大致的故事是,楚汉争霸,韩信率领了1500名将士和敌人交战。大战过后,虽然汉军获胜,但死伤也有近五百人,剩下的大概刚有一千人出头,回营之后,韩信想要清点一下剩余的将士。

  只见韩信命令士兵3人站一排,最后一排多出2人;5人站一排,最后一排多出3人;命令士兵7人一排,最后多出2人。

  紧接着,韩信向将士们宣布了剩余的汉军人数是1073人。大家都觉得韩信点兵如此绝妙,纷纷觉得韩信是“神仙下凡”、“神机妙算”。

  下面,各位同学们,你们能像韩信一样“神机妙算”吗?

  我们先用数学的方法来试着解答一下。

  不过首先,我们先把题目的重点重新归纳一下,然后把题目换个说法。
  一个数字除以3余2,除以5余3,除以7余2,请找到满足上述要求的,大于1000的最小的数。

  首先,我们要明白这类题目所考核的知识点是公倍数的概念,要同时满足三个要求,意味着我们要在调整其中某一个条件的时候不能影响另外两个条件,所以我们根据第一个条件“除以3余2”,找到5和7的公倍数中满足此条件的,很容易,我们发现5×7=35,35÷3=11……2,35正是满足这个要求的数字;再来看第二个条件“除以5余3”,我们同样找到3和7的公倍数中满足此条件的,这也很容易3×7=21,21÷5=4……1,于是我们能得到,21×3=63,63÷5=12……3,63就是满足第二个条件的数字;同理,我们按照第三个条件,用相同的方法,可以得到30÷7=4……2,30是满足第三个条件的数字。
  我们把三个结果相加,发现35+63+30=128,这个结果除以3余2,除以5余3,除以7余2,正好满足了题目前半部分的要求,但它并不是大于1000的。究竟如何找到满足题目后半部分要求的答案呢?显然,我们要在目前已经得出的结果上加上一个数字,但加多少合适呢?我们需要加上一个不会影响当前余数变化的数字,也就是要加上一个能同时被3、5、7同时整除的数字,这难不倒我们,3、5、7的最小公倍数是3×5×7=105,我们用之前的结果128反复加上多次105,最终便会得到我们所要的结果。(如下表)

加上最小公倍数105的次数最终结果
1233
2338
3443
4548
5653
6758
7863
8968
91073

这样,我们得到了正确的答案,1073。

如何用数学的方法来解答这道题目说完了,不免有些繁琐复杂,下面我们用编程的方法来试着解答一下。

  我们先来看一下这位同学是如何解答的。

  我们来看这位同学的答案。
  在这段代码里,这位同学在程序开始时,首先对他所用到的变量和列表进行了初始化,这样确保每次启动程序时,变量和列表都是处于“空”的状态,之后使用了循环、判断来重复的对“兵士数量”进行判断,看是否满足题目的要求,当满足题目要求时将答案存储到一个列表中,并在最后全部计算完毕后显示这个列表。

  之后的讨论,有同学指出了代码中可以改进的地方:我们需要的答案是超过1000的最小的那个“兵士数量”,也就是大于1000的第一个答案,那么没有必要设置一个列表来记录那么多的答案,我们只需要从1000开始找,找到的第一个答案就是最终的答案了。
  对于这点,我们通过讨论获得大家一致赞同,之后我们修改了部分代码。

  对于本次的题目而言,这样的答案可以说非常完美的找到了题目的答案,但编程的乐趣就是不断的升级,对于目前的答案其实还有很多地方能够继续深挖,在保证运算结果的前提下提升代码在运算时的效率,具体该怎么做,我们会在后续的“深入篇”中继续讲解。

  好了,这次带来的趣味小编程就到这里了,大家有任何的想法可加我的微信(下方二维码)、微博@亿万星辰桃桃爸,跟我一同讨论少儿编程,进入编程这五彩斑斓的世界,我们下期再见。