高级篇——猜数字2

【疑惑篇】

点击绿旗按钮,小猫会在心里记住4个不同的数字(0-9),玩家需要猜出这4个数字分别是几。每次回答后小猫会提示回答正确几个数字,以及有几个数字位置正确,舞台右侧显示回答记录(回答数字:答对的数字个数:位置正确的数字个数)。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

每个场景中的每个角色在做什么?

猜数字1基础上改动:

  1. 判断猜对的数字位置是否正确。
  2. 舞台列表中显示猜对的数字个数和猜对的位置个数。
  3. 修改游戏获胜的条件。

积木提示

当绿旗被点击

说(你好!)(2)秒

当接收到[消息1]

广播[消息1]

重复执行(10)次

如果<>那么

如果<>那么否则

重复执行直到<>

询问(你叫什么名字?)并等待

回答

大于

小于

等于

不成立

在(1)和(10)之间取随机数

连接(苹果 )和(香蕉)

(苹果)的第(1)个字符

(苹果)的字符数

(苹果)包含(果)?

建立一个变量

使用变量

将[我的变量]设为(0)

将[我的变量]增加(1)

建立一个列表

将(东西)加入[列表]

删除[列表]的全部项目

[列表]的项目数

[列表]包含(东西)?

隐藏列表[列表]

【解决篇】

猜数字1中你已经可以让玩家猜测小猫心里想的数字,这次我们再将难度升级,除了需要猜对数字是什么,还需要猜对所有数字的先后顺序。

如何实现呢?

在改动之前,我们可以先来分析一下已完成的代码分别在做些什么。我们可以将代码大致分为5个部分。

  1. 初始化游戏变量
  2. 生成随机的正确数字。
  3. 询问玩家。
  4. 判断玩家输入的数字。
  5. 根据判断结果完成不同操作。

接下来,你就可以思考,我们现在需要进行的改动,与以上哪些部分有关?

1. 判断猜对的数字位置是否正确。

在上面的第4步中,我们会去判断玩家输入的数字是否正确。现在除了数字是否正确之外,还增加了数字位置的判断。所以,你只用在第4步的基础上,增加位置的判断即可。

如何判断位置呢?

每一个数字在列表中都有一个按顺序排列的编号,我们又是将玩家回答中的数字,从第1个开始,按照顺序依次取出来做比较。如果一个数字在列表中的编号与我们取出的顺序一样的话,那就可以认为该数字是正确排列的数字。

例如,正确答案为3891,玩家的回答是2301。当取第1个数字2进行判断时,该数字不包含在正确答案列表中,所以不是正确的数字。当取第2个数字3进行判断时,该数字包含在正确答案列表中,所以是正确答案。但是3在列表的编号是1,在回答中的顺序是第2个,所以它不是一个正确排列的数字。当取第3个数字0进行判断时,该数字不包含在正确答案列表中,所以不是正确的数字。当取第4个数字1进行判断时,该数字包含在正确答案列表中,并且1在列表中的编号是4,在回答中的顺序也是第4个,所以它是一个正确排列的数字。

接下来,就可以在scratch中实现它。

在计算正确的数字个数时,我们建立了一个变量“回答正确的个数”来存储它。现在除了回答正确的个数,还需要记录顺序正确的个数,同样的可以新建一个变量来存储它。

顺序正确的个数在哪里判断呢?是不是只有当一个数字是回答正确的数字时,它才有可能是顺序正确的数字。所以你只需要在原来判断是否回答正确的如果<>那么积木中,再增加一个数字顺序的条件判断即可。

刚刚说过,我们需要通过数字在列表中的编号和它在回答中的顺序进行比较,从而判断它是否排列正确。

数字在回答中的顺序就是“数字的位置”的变量值。那数字在列表中的编号如何获取呢?你可以使用[列表]中第一个(东西)的编号积木。它的第一个参数是列表的名称,第二个参数是需要查询编号的东西。它的返回值就是这个东西在所选列表中最小的编号。如果该东西不在列表中,返回0。

例如,一个列表中有3个苹果,1个香蕉。

当你获取香蕉的编号时,返回2。当你获取苹果的编号时,返回1。因为3个苹果的编号分别是1、3、4,返回最小的编号1。当你获取梨子的编号时,返回0。因为列表中没有梨子。

回到案例中,如果[列表]中第一个(东西)的编号积木获得的编号等于“数字的位置”的变量值,那么顺序正确的个数就加1。

2. 舞台列表中显示猜对的数字个数和猜对的位置个数。

既然现在我们增加了一个判断条件,那在给予玩家提示时,应该将把顺序正确的个数显示给玩家。

这一步很简单,只需要在拼接原有提示的文字的位置,再拼接上顺序正确的个数就可以了。别忘了,也要使用一个符合将它与回答正确的个数区分开,在这里我还是继续使用“:”作为分隔符。

现在第一部分就是玩家回答的数字,中间部分是回答正确的数字个数,最后一部分是顺序正确的数字个数。

例如,2301:2:1表示2301这个数字中,猜对了2个数字,其中有一个数字的位置是正确的。

3. 修改游戏获胜的条件。

最后我们还需要修改一下游戏获胜的条件。之前,只需要回答正确的个数等于4即为获胜,现在增加了位置判断,需要顺序正确的个数等于4才为获胜。同样的,你还可以将小猫说话的提示也一并修改,告诉玩家它猜对的数字中有几个位置是正确的。

以上,我们就已经完成了猜数字游戏的修改。

当你在制作一个复杂的游戏时,会使用非常多的积木块。在开发过程中,你或许会知道每个积木块的作用是什么。可是当你将写好的游戏发给别人,或者自己隔了一两个月再看它们时,你可能就会脑袋发蒙,不知道这些积木到底在做什么了。

这时候,你最好能像文章最开始那样,根据功能将所有的积木块进行归类,然后通过某种方式来区分它们。如何对它们进行区分呢?你现在就可以使用Scratch中最后一个基础分类,自制积木

在我们之前所有的案例中,我们都在使用Scratch提供给我们的积木块来实现我们的案例。使用自制积木,我们就可以创造属于自己的积木块,然后在编程区使用它。

具体如何做呢?

与建立变量类似,点击自制积木分类下面的“制作新的积木”按钮,会弹出一个制作新的积木的窗口。

现在,你要完成的第一件事,同样是为自己的积木取一个名字。如何取名?名字要能代表你的积木可以完成的事情。例如,我们现在制作一个积木叫做“初始化游戏变量”。

此外,你还可以决定自己的积木是否需要增加参数,运行时是否需要刷新屏幕。在这里先不选择参数,勾选上运行时不刷新屏幕。它们具体的作用我们在之后的案例中再详细讲解。

点击完成,这时在左侧的自制积木分类下面会多出一个新的积木,积木名称就是你刚刚取的名字。在编程区中,也会多出一个类似事件积木的积木,它是用来定义你的自制积木的功能。

这个初始化游戏变量积木具体完成什么功能呢?是不是用来初始化我们的游戏变量,具体就是我们前面划分的第一部分的内容。所以,现在我们将第一部分的三个积木块拖入定义初始化游戏变量积木下面。

定义好了积木块的功能,接下来我们只用像使用其他积木一样,将初始化游戏变量积木拖入原本那三个积木的位置,当程序执行到我们的初始化游戏变量积木时,它就会实际去执行定义初始化游戏变量积木下面的指令串。

同样的,在初始化游戏变量之后,我们开始生成随机的正确数字。还是制作一个新的积木,名称叫做“生成随机的正确数字”。

然后将生成随机数这部分指令串拖入定义生成随机的正确数字积木后面,再将新积木拖入原来的位置使用。

现在你可以将修改完的指令串与原本的指令进行一下对比。

首先,原本的指令串使用了很多积木块,而新的指令串只有三个积木块,指令串变得更加简洁。

其次,在原本的指令串中,单独每个积木块的作用你可能很熟悉了。但是当他们合在一起时,又是在完成什么功能,就需要你停下来分析一下才会知道。而新的指令串每个积木的功能从积木名称上就可以知道,你更容易知道程序的每一步在做些什么。

以上两个理由只是使用自制积木的好处之一。在你以后的开发中,当你需要使用很多积木块完成一个独立的功能时,就应该思考一下,能不能使用自制积木。

接下来,你还可以继续尝试着将询问部分的指令串也像上面一样,通过自制积木封装起来,这就留给你作为练习了。

需要说明的是,通常情况下,这种封装也没有绝对的对错之分,就像案例分析一样,更多是依靠自己对程序的理解,将它们进行拆分。如果你自己封装完成后,可以与我的进行对比,看看我们的想法有哪些不同。

想看更多学习案例,欢迎点击查看《Scratch 3学习手册》open in new window

想要获取所有案例源码和素材,以及获得我对你在学习中所遇问题的一对一解答,欢迎加入石头解忧杂货店

Last Updated:
Contributors: lanheixingkong