高级篇——猜数字1

【疑惑篇】

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

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

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

  1. 生成小猫心里想的4个不同的数字。
  2. 小猫询问玩家,猜猜看它想的数字是什么?
  3. 玩家输入答案后,使用列表记录玩家猜过的答案,显示在舞台右侧。
  4. 判断玩家是否回答正常。如果回答正确,恭喜玩家回答正确,说出他总共猜了多少次;如果回答不正确,告诉玩家猜对了其中几个数字。
  5. 重复2~5步,直到玩家猜对数字。

积木提示

当绿旗被点击

说(你好!)(2)秒

当接收到[消息1]

广播[消息1]

重复执行(10)次

如果<>那么

如果<>那么否则

重复执行直到<>

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

回答

大于

小于

等于

不成立

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

连接(苹果 )和(香蕉)

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

(苹果)的字符数

(苹果)包含(果)?

建立一个变量

使用变量

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

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

建立一个列表

将(东西)加入[列表]

删除[列表]的全部项目

[列表]的项目数

[列表]包含(东西)?

隐藏列表[列表]

注意事项

  1. 如何随机生成4个不同的数字?
  2. 如何判断玩家的猜对了几个数字?
  3. 如何重复让玩家猜?

【解决篇】

猜数字的游戏相信你一定玩过了,先由一个人随便想出几个数字记在心里或写在纸上,再由其他人来猜他所想的数字是什么。每猜一次,就会提示对方猜对了几个数字。可以限制猜的次数判断输赢,也可以不限制次数,比赛谁用的次数最少。

在这个案例中,我们要来学习使用Scratch变量分类中另外一个重要的知识点,列表

Pong3中我们说过,你可以将变量想象成一个小盒子,里面可以用来放东西。使用盒子会有一个问题,一个盒子里面只能装一样东西。

例如,你建立了一个变量叫颜色,那它就可以用来存储颜色值,例如红色,黄色,或蓝色。

假如你需要同时存储红黄蓝三种颜色,使用变量的话你就需要建立三个变量,分别叫做颜色1,颜色2,颜色3。游戏过程中如果颜色还会增加,那你就还需要继续手动增加变量个数,操作极为麻烦。为了解决这种问题,于是就有了列表。

与变量类似,你可以将列表想象成一个购物车,与变量盒子不同的是,在一个购物车中,你可以放入很多不同的变量值。并且每个变量值都会有一个固定序号,方便你从购物车中找到它们。

例如,你先点击变量分类中的“建立一个列表”按钮,将会弹出一个创建列表的新窗口。同创建变量一样,要创建一个列表,首先要做的第一件事就是给这个列表取一个名字。

点击确定,这时在舞台上就会显示你新建的列表框。顶部是列表名称,中间是列表中的变量值,底部是添加按钮和列表中的变量值数量。

你可以直接点击左下角的“+”号按钮,给列表中添加变量值。每个变量值的左侧会有一个数字,代表了这个变量值在列表中的编号或者叫索引值。例如,红色的编号为1,黄色的编号为2,蓝色的编号为3。

编号就像是变量值的身份证号,当你想要获取某个变量值时,就可以通过编号去查找。例如,查找编号3的变量值,就可以得到蓝色。反过来,也可以通过变量值去查询它的编号。例如,查询黄色的编号,就可以得到编号为2。

接下来,我们就通过案例来看看,具体如何使用列表。

第一步,还是把用到的背景Room1添加进来。

第二步,添加角色。

在这里,使用的是默认的小猫角色,不需要修改。

第三步,使用指令积木实现程序。

1. 生成小猫心里想的4个不同的数字。

第一个需要思考的问题是,如何生成4个不同的数字?

可能你马上能想到使用在(1)和(10)之间取随机数积木,将它的参数范围设置成1000和9999之间。这样可以获取到一个4位数,但是无法保证4个数字不重复。

转换一下思路,我们需要的是4个数字,可以重复使用在(1)和(10)之间取随机数积木在0和9之间获取随机数,每次获取之后与之前的数字进行比较,看看是否相同,如果相同就重新获取。

现在问题就变成了,每次获取的数字,你要如何存储和比较呢?

也许你会想到,可以新建4个变量分别来存储4个不同数字,再将它们两两之间相互比较,使用这种方法比较时会很麻烦。

有一种简单的方式,你可以先建立一个变量,可以取名叫“正确答案”,利用它来存储4个不同的数字。接着,再建立一个变量,取名叫“随机数”,利用它来保存在(1)和(10)之间取随机数积木获取的随机数。

因为需要4个数字,我们只用重复获取4次随机数,然后利用连接(苹果 )和(香蕉)积木将它们拼接在一起即可。

点击绿旗按钮测试一下,现在可以正常生成4个随机数,不过它们之间可能会有重复。接下来,我们就开始来将它们去重。

在这里会用到运算分类中的(苹果)包含(果)?积木。这个积木的用法很简单,它可以用来判断某个字符串中,是否包含另外一个字符串。包含时,该积木返回true,不包含,返回false。

例如,“苹果”两个字中是否包含“果”字,返回true。“苹果和香蕉”中是否包含“香蕉”,也返回true。“苹果和香蕉”中是否包含“梨子”,返回false。

需要注意的是判断多个文字时,文字的顺序也必须一致,才会返回true,否则返回false。

例如,“苹果和香蕉”中是否包含“蕉香”,返回false。“苹果和香蕉”中是否包含“果香”,也返回false。“苹果和香蕉”中是否包含“果和香”,返回true。

现在,你只需要在获取随机数后,利用(苹果)包含(果)?积木对它进行一下判断,看看正确答案中是否包含了当前获取的随机数,如果包含了,就重复不停地获取新的随机数,直到正确答案中没有包含当前获取的随机数,再将它与正确答案拼接在一起。

除了这种方式之外,还有没有别的方法呢?最开始我们说过,列表可以用来存储多个变量值,在这里我们就可以使用列表来存储这四个不同的数字。

与前面的方法类似,先新建一个列表,取名叫正确答案。

现在我们不需要再将随机数拼接起来,只需要将它们分别添加到列表中即可。如何添加呢?使用将(东西)加入[列表]积木。第一个参数就是你要向列表中加入的东西,在这里就是我们获取到的随机数;第二个参数是你要加入的列表名称,在这里就是正确答案列表。

在添加数字之前,最好先用删除[列表]的全部项目积木将列表里面原有的东西全部清空。

点击绿旗按钮进行测试,现在列表中已经可以加入4个数字,但是他们同样会有重复。为了避免重复,与之前的解决方案类似,你需要将当前获取的随机数与列表中的数字进行比较。

如何比较呢?使用[列表]包含(东西)?积木,它的用法与(苹果)包含(果)?积木类似。第一个参数是列表名称,在这里就是正确答案列表;第二参数是需要比较的东西,在这里就是当前获取的随机数。如果列表中已经包含了参数中的东西,就会返回true,不包含就会返回false。

例如,列表中有一个苹果和一个香蕉时。

判断列表中是否包含苹果,返回true。是否包含香蕉,也返回true。是否包含梨子,返回false。

需要注意的是,比较时要与列表中的某一项完全一致,才会返回true。例如判断是否包含果,返回false。是否包含蕉香,也返回false。

模仿之前的去重方式对程序进行修改,变成下面这样。

点击绿旗按钮测试一下,现在列表中已经可以存储4个不同的数字了。

2. 小猫询问玩家,猜猜看它想的数字是什么?

这一步很简单了,只需要使用询问(你叫什么名字?)并等待积木向玩家提问即可。

在此之前,舞台上的正确答案不能被玩家看见,所以你需要将正确答案隐藏起来。变量的隐藏你之前已经学过了,列表的隐藏和变量一样,你可以不勾选列表名称前面的复选框。

或者使用隐藏列表[列表]积木,参数选择需要隐藏的列表名称即可。

3. 玩家输入答案后,使用列表记录玩家猜过的答案,显示在舞台右侧。

玩家输入答案后,你就可以使用回答积木获取到答案。首先,你可以把答案记录在一个列表中,显示在舞台上,作为提供给玩家的提示。

如何实现?建立一个列表,可以取名叫“回答记录”。每次回答以后,同样使用将(东西)加入[列表]积木将玩家的答案记录在列表中。

在这里会有一个问题,玩家在输入框中输入答案时,是可以任意发挥的。他有可能只输入了一个数字就提交了答案,所以说我们在拿到答案时,可以先检查一下,玩家输入的答案符不符合我们的要求。

例如,如果玩家输入的数字有4个,我们就加入回答记录中,否则我们就提示玩家“只能回答4个不同的数字”。

4. 判断玩家是否回答正常。如果回答正确,恭喜玩家回答正确,说出他总共猜了多少次;如果回答不正确,告诉玩家猜对了其中几个数字。

接下来,我们就要开始对玩家是否答对进行判断了。

在这个游戏中,我们并不关心数字的顺序,只要数字相同即可。如何判断呢?

与生成正确答案类似,你需要把玩家回答的数字每一个都取出来,看看它们在不在正确答案列表中。如果4个数字都在正确答案列表中,说明回答正确,否则就是回答错误。你可以像这样来做。

现在可以判断出玩家是否答对,但是答错时没办法知道玩家的答案中猜对了几个数字。所以我们需要把判断改变一下,将对4个数字的判断拆分成4个判断,再建立一个变量作为计数器,可以取名叫“回答正确的个数”,用它来计算玩家答对数字的个数。

现在从回答中每取一个数字就判断一下它是否在正确答案列表中,如果在列表中,回答正确的个数就加1。最后只需要看看回答正确的个数等不等于4,就知道玩家是否猜对。

当然在判断之前,别忘了先将回答正确的个数设置为0,否则玩家多次回答时,这个数字会不停的往上累积。

现在有两个地方可以思考一下进行优化。

第一个可以优化的地方,在之前的回答记录中,我们只记录了玩家回答的数字,没有记录该数字中有几个数字是正确的。现在我们可以把猜对的数字个数也记录一下,给予玩家更多提示。

如何记录呢?在这里你可以自己设计记录的方案,重点在于你所记录的内容需要能够让玩家区分,哪部分是回答的数字,哪部分是猜对的个数。

例如,我在回答的数字和猜对的个数中间使用“:”将它们隔开,“:”前面是回答的数字,“:”后面是猜对的个数。假设玩家回答的数字是8293,其中有两个数字猜对了,记录在列表中的内容就是“8293:2”。

第二个可以优化的地方,注意观察我们把回答中的数字一个一个取出来做比较,每一个判断其实都很像,唯一的区别只是从回答中获取数字的位置不同。

假如你现在建立了一个变量叫“数字的位置”,这个变量值最开始是1,然后依次递增,是不是就可以用这个变量取代我们之前写的数字。

仔细观察,现在每一个判断是不是完全一样了,既然每一步都是重复的操作,你有没有想到使用重复执行积木来合并它们?例如把上面的代码修改成下面这样。

继续往下思考,在这里为什么需要重复执行4次?因为我们需要做4次判断。为什么需要做4次判断呢?因为回答中有4个数字,我们需要每一个都取出来做比较。所以说重复执行中的4次,其实等于回答中的数字个数。所以你还可以进一步修改代码,将它变成下面这样。

这样一来,首先我们的代码变得更简洁,其次当你改为猜5个数或者6个数时,上面的代码你不需要做任何修改。

这种优化方式,在以后的案例中会经常使用。利用一个自增变量和重复执行(10)次积木,将重复的代码块合并在一起。

5. 重复2~5步,直到玩家猜对数字。

最后一步,如果玩家没有猜对,我们需要重新询问,继续让它猜。接着对玩家输入的答案重新做判断,直到玩家猜对为止。如何实现呢?

第一种实现方式。既然询问和对答案的判断都是重复的,自然会想到使用重复执行积木。我们只需要重复不停的询问和判断,直到它回答正确才结束重复执行。有没有想到重复执行直到<>积木,在这里结束的条件就是看看回答正确的个数是否等于4。

第二种实现方式,我们可以利用消息来重复询问和做判断。具体怎么做呢?很简单,我们将询问和判断部分单独拆开,改为当接收到[询问]消息时开始执行。

现在你要思考的就是,哪些地方需要发送消息?

第一个就是生成正确答案之后,第一次询问。第二个是回答的字符数少于4个时,重新询问。第三个是回答错误时,也要重新询问。

这样一来,猜数字的小游戏就完成了。点击绿旗按钮测试一下,你会发现游戏会有一个bug。当玩家输入的是4个相同的数字,并且这个数字正好是正确答案的数字之一时,也算猜对。如何修复这个bug,就留给你作为扩展练习。修改完bug之后,你还可以思考如何将游戏改为猜5个数字或者6个数字,看看需要修改哪些地方?能不能使用变量来代替需要修改的地方?

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

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

Last Updated:
Contributors: lanheixingkong