中级篇——Pong3

【疑惑篇】

点击绿旗按钮开始游戏,选择单人游戏或双人游戏,通过“w”和“s”键控制红色球拍,通过“↑”和“↓”键控制蓝色球拍,先获得11分者获胜。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

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

Pong2基础上改动:

  1. 使用变量增加比分记录。
  2. 使用变量修改原有程序。

积木提示

当绿旗被点击

当背景换成[背景1]

当角色被点击

移动(10)步

移到x:(0) y:(0)

面向(90)方向

将旋转方式设为[左右翻转]

碰到边缘就反弹

将x坐标设为(0)

将y坐标增加(10)

将y坐标设为(0)

x坐标

y坐标

方向

说(你好!)(2)秒

说(你好!)

换成([造型1])造型

下一个造型

换成([背景1])背景

下一个背景

显示

隐藏

播放声音([喵])等待播完

播放声音([喵])

当接收到[消息1]

广播[消息1]

等待(1)秒

重复执行

如果<>那么

如果<>那么否则

重复执行直到<>

停止[全部脚本]

碰到([鼠标指针])?

碰到颜色(颜色)?

按下([空格])键?

([舞台])的[背景编号]

加法

减法

乘法

除法

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

大于

小于

等于

建立一个变量

使用变量

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

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

显示变量[我的变量]

隐藏变量[我的变量]

注意事项

  1. 如何判断玩家是否获得11分?
  2. 如何通过变量替换原程序中的数值?

【解决篇】

前面我们已经完成了Pong的单人和双人游戏的选择,在一场真实的乒乓球比赛中,双方不会以一个球定胜负,而是会有一个比分的累积。这个案例中,我们就通过学习程序开发中另外一个重要的知识,变量,让两个玩家谁先获得11分,谁才算获胜。

如果你学过高级编程语言,变量往往会是你最先学习的语法知识。什么是变量?在日常生活中,你会发现有无数的东西会不断地发生变化。例如你的年龄,今年是3岁,明年会变成4岁,再过一年又会变成5岁。你在蝙蝠躲避球中坚持的时间,每次的发挥不同,最终坚持的时间也会不同。所有这些会发生变化的东西,我们都把它们叫做变量。

一个变量有两个部分组成,首先,它有一个名字(变量名) ,像刚刚说的“年龄”和“坚持时间”。此外,它还有一个具体的值(变量值) ,年龄的值就是刚刚说的“3岁”、“4岁”、“5岁”,坚持时间的值就是你每局游戏结束时提示的具体的时长。

你可以将变量想象成一个小盒子,里面可以用来放东西。例如,有一个水果盒,盒子里可以放苹果,也可以放柠檬。水果盒就是变量名,苹果或者柠檬就是变量值。

我们在之前的案例中,实际上已经使用过很多的变量。例如,运动分类中的x坐标y坐标方向积木,外观分类中的造型[编号]背景[编号]大小积木,侦测分类中的碰到([鼠标指针])?碰到颜色(颜色)?颜色(颜色)碰到(颜色)?到([鼠标指针])的距离积木等等。这些积木的名称就代表了变量的名称,积木的返回值就代表了变量具体的值。

不过这些变量都有一个特点,我们只能获取它们的变量值来使用,不能对变量值进行修改。

除了上面这些Scratch提供的现成变量之外,我们还可以创造自己的变量,并且可以对变量值进行修改,再向上面这些积木一样使用它。

接下来,我们就通过修改Pong游戏,看看应该如何使用变量。

为了提高游戏可玩性,我们希望玩家之间可以多增加几个游戏回合,而不是像Pong2中一样一球定胜负,这时候我们就需要能有个类似记分牌的东西,可以记录两个玩家的得分。如何解决?在这里,我们就可以创建一个变量作为记分牌,变量值就是记分牌上记录的分数。

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

应该如何取名字?要让其他人看见你取的名字时,可以明白这个变量代表什么东西。例如,上面取的“水果盒”,别人看见后就可以猜到里面是用来装水果的。在这里我们需要记录两个玩家的分数,那就可以建立两个变量,名称分别叫做“红色得分”和“蓝色得分”。

在变量名称的下面有两个选项,“适用于所有角色”和“仅适用于当前角色”,它们代表了这个变量的归属。

如果选择的是“仅适用于当前角色”,说明你创建的变量只属于当前角色,这个变量也就是它的个人财产。其他角色看不见这个变量,也不能修改和使用它。

如果选择的是“适用于所有角色”,说明你创建的变量是大家共同所有,每个角色(包括舞台)都可以看见它、修改它、使用它。

在这个案例中,我们先不考虑这两种选项的区别,选择默认的“适用于所有角色”即可。等到了高级篇中,我们再通过其他案例,学习如何使用“仅适用于当前角色”的情况。

输入完名字,点击“确定”按钮。在变量分类中就会增加两个刚刚创建的变量积木,积木的名称就是刚刚输入的变量名。同时在舞台上也会多出两个变量框,左边黑色的是输入的变量名,右边橙色的就是当前的变量值,默认为0。

一个变量在舞台上有三种不同的显示模式,分别是正常显示、大字显示和滑杆显示。通过鼠标右键菜单或者鼠标双击变量就可以在三种模式间进行切换。

在这个案例中,我们可以使用大字显示,将它们分别放在两个玩家各自的区域顶部,代表它们的记分牌。

接下来,我们就开始通过程序来控制变量,将游戏变为11分制的比赛。

点击绿旗按钮,我们首先进入的是游戏开始菜单界面,此时游戏还未开始,不需要显示玩家的得分,所以这两个变量应该像球拍和球一样先隐藏起来。如何做?很简单,变量分类中有一个显示变量[我的变量]和一个隐藏变量[我的变量]积木,它们的用法跟外观分类中的显示隐藏积木类似,使用它们就可以将积木参数中所选的变量在舞台上显示或隐藏起来。

具体由谁来进行操作呢?因为我们在创建变量时选择了“适用于所有角色”的选项,所以任何角色或者舞台都可以来操控它们。例如,我们可以交由舞台来统一管理,当绿旗被点击后,先将这两个变量隐藏起来,接着再换成Blue Sky背景,循环播放背景音乐。

点击绿旗按钮进行测试,现在进入BlueSky背景时,已经看不见这两个得分变量,玩家可以正常选择一种游戏类型进行游戏。

接下来,什么时候才需要显示这两个变量呢?是不是当游戏开始时显示即可。等待倒计时结束,倒计时角色发送“开始游戏”消息,此时你同样可以利用舞台或者其他任意角色,当接收到“开始游戏”的消息,使用显示变量[我的变量]积木将它们显示出来。

接下来,就是这个游戏修改的重点,如何通过变量记分?

在之前的程序中,我们通过判断小球角色的位置,当它的x坐标超过获胜的坐标值时,即宣判某一方获胜,结束游戏。

现在为了增加游戏的回合数,每当小球的x坐标超过获胜的坐标值时,不再是直接获胜,而是其中一方得分增加。这时就要用到变量分类中的将[我的变量]增加(1)积木。

它的用法跟将x坐标增加(10)积木类似,当你的变量值为一个数字时 ,使用将[我的变量]增加(1)积木就可以在原有的变量值基础上增加一个数字。

现在,需要把程序中原来的说话积木和广播“游戏结束”积木,替换为将[我的变量]增加(1)积木,此时小球越过获胜坐标值时,不再会说话,而是变成把“蓝色得分”增加1分。同样的,原本说“红色获胜”的位置,也用将[我的变量]增加(1)积木替换,使“红色得分”增加1。

点击绿旗按钮进行测试,当小球越过获胜坐标值时,记分牌的分数就会增加。不过问题也同时出现了,分数每次不是增加1分,而是增加了3分或者4分。这是为什么?

因为当我们将原本广播“游戏结束”的消息积木删除以后,小球超过获胜坐标值时,得分会增加1分,可是此时程序并不会停止。小球又会重新开始执行重复执行积木中的操作,继续移动15步,然后重新判断自己是否超过获胜坐标值,如果超过了,得分又会再增加1分。小球像这样一直不停的重复移动,重复判断坐标位置,重复增加得分。一直到小球离开获胜坐标值范围,得分不再增加。

应该如何修复这个BUG?

想象一下真实的比赛中,当一方得分后,会如何继续比赛?是不是会重新发球,开始新的一轮比赛。我们现在也可以来模拟真实的比赛。

在我们的程序中,小球是如何发球的?是不是当小球接收到“开始游戏”的消息时,该事件积木后面的指令串就是发球开始比赛的操作。

现在某个玩家得分后,我们只需要重新执行该指令串,小球就会重新发球开始新一轮的比赛。如何做到呢?

我们可以增加一个新的广播消息“发球”。现在当接收到“开始游戏”消息时,我们不再执行刚刚的指令串,而是变成接收到“发球”消息时才去执行。

接着,我们来考虑什么时候需要广播“发球”消息?是不是当接收到“开始游戏”时,还有其中一个玩家得分时,就需要重新发球。

重新点击绿旗按钮进行测试,现在当一个玩家得分时,得分变量可以正常的增加1,并且小球会从舞台中央重新发球,开始新一轮比赛。

现在还差最后一步,我们的游戏目前不会结束,得分会永远不停的增长。按照我们的游戏设计,当其中一方先获得11分时,游戏就会结束,在舞台中间出现文字提示。

如何判断游戏是否应该结束?是不是每当一个玩家得分以后,我们就需要去判断一次它的得分是否达到11分?如果达到11分,和之前一样,就需要广播“游戏结束”,否则就要广播“发球”,继续比赛。

这一次游戏结束时,除了完成之前的操作之外,我们不再通过小球说话的形式提示哪方获胜,而是变成了通过文字的形式显示在舞台中间。

蝙蝠躲避球类似,我们可以在倒计时角色中增加两个造型,分别写上红色获胜和蓝色获胜,颜色可以设置成与玩家球拍一样的颜色。

当倒计时角色接收到“结束游戏”消息时,它需要判断谁获胜?然后换成相应的造型显示出来。如何判断呢?是不是跟小球角色判断哪方获胜一样。

点击绿旗按钮,重新开始测试。你又会发现一个问题,比赛刚开始,双方的得分并没有清零,而是接着之前的得分值继续往上涨。如何处理?当我们的游戏开始时,需要使用将[我的变量]设为(0)积木将得分变量设置为0分。该积木与将x坐标设为(0)积木类似,不论原来的变量值是多少,它会直接给变量设置一个新的值。

点击绿旗重新测试,现在游戏已经能正常运行。当其中一方先获得11分时,游戏结束,舞台中间出现文字提示。

既然学习了变量,你还可以继续思考一下,我们能否将游戏中的其他东西也使用变量替代?

例如,我们现在的游戏是获得11分获胜,如果要改变游戏规则,变为获得5分即可获胜,你需要怎么修改?是不是需要在小球角色和倒计时角色判断得分是否等于11的地方,把11都改为5。

像这样进行修改时,不光操作麻烦,而且一旦你忘记改变任意一个地方,程序就会出现Bug,无法按照预想的模式进行。

在这里,我们就可以利用变量来解决这个问题。新建一个变量叫做“获胜分数”。

接着,将原来所有使用数字的地方,替换为“获胜分数”这个变量。想一想,原本填入的数字11或者5,它们代表的意思是什么?是不是就是用来判断游戏胜负的获胜分数?你的程序需要完成的任务并没有发生改变,只是你将原本固定的数字,替换成了一个可以任意改变的变量。

最后,只需要在游戏开始时,根据游戏规则去设置获胜分数的值,例如11分,或者5分,或者3分。不论你的游戏规则如何改变,你只需要调整这一个变量值,就获得了不同的游戏效果。

在之前的游戏中,我们通过红球拍的造型编号来区分不同的游戏类型,从而对它进行不同的操作。学习了变量之后,你还可以通过创建变量来区分不同的游戏类型。

变量值不光可以设置为数字,也可以设置为文字或布尔值(true和false)。例如,当开始界面的两个按钮被点击后,分别将“游戏类型”变量设置为“单人游戏”和“双人游戏”。

接着,红球拍不再需要根据造型编号进行判断,改为通过该变量值进行判断即可。

除此上面说到的这些用法,你还可以自己尝试着将游戏中的其他东西,也通过变量进行代替。例如,新建一个“球速”变量,代替小球移动(10)步积木中填入的具体数字。当小球由慢变快时,只需要修改“球速”的变量值即可。

变量是编程中最简单又最灵活的功能,几乎所有需要你输入数字或文字的地方都可以使用变量代替。它体现了一种将世界进行抽象思考的模式,也是影响你在学校中数学成绩的重要因素。能否有效的使用变量,是你在今后学习中需要重点掌握的能力。

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

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

Last Updated:
Contributors: lanheixingkong