2.3 变量
在Scratch编程中,变量是一个非常重要的编程元素,可以把它想象成一个数据盒子,用来存放程序中使用的各种数据。这些数据包括用户通过键盘输入的信息、游戏的状态和得分、角色的大小和坐标、解方程用到的各个未知数等。可以说,如果没有变量,将无法编写程序。
在Scratch的“数据”指令面板中提供一些操作变量的指令积木,这些积木默认情况下不会显示在指令面板中,只有在创建了变量之后才会显示。如图2-3-1所示,这是在创建了一个名为“得分”的变量后,在数据指令面板中显示的用于操作变量的一些指令积木。
2.3.1 跟我做:小猫变大变小
变量的作用非常大,使用也很简单。在本案例中,我们将学习使用变量进行编程,通过调整一个名为“大小”的变量的数值,控制舞台上的小猫变大或变小,具体步骤如下。
(1)启动Scratch软件并创建默认的项目,还是熟悉的白色背景和小猫角色。
(2)切换到“数据”指令面板,单击“建立一个变量”按钮❶,弹出一个“新建变量”对话框❷。在对话框中的“变量名”文本框中输入“大小”❸,然后单击“确定”按钮(或者按回车键),这样就创建了一个名为“大小”的变量❹,它会出现在“数据”指令面板中,同时也会出现在左侧的舞台上,如图2-3-2所示。
图2-3-1 一些操作变量的指令积木
图2-3-2 创建一个名为“大小”的变量
(3)从“事件”指令面板中拖动一个“当被点击”指令积木到小猫角色的脚本区。
(4)切换到“控制”指令面板,把“重复执行”指令积木拖动到右侧的脚本区,拼接在“当被点击”指令积木之下。
(5)切换到“外观”指令面板,把“将角色的大小设定为…”指令积木拖动到脚本区,将它嵌入到“重复执行”指令积木的内部。
(6)再次切换到“数据”指令面板,把前面创建好的“大小”变量拖动到脚本区,将它嵌入到“将角色大小设定为…”指令积木的圆孔内。至此,这个案例程序编写完毕,脚本清单如图2-3-3所示。
(7)在舞台上的“大小”变量上右击,在弹出的菜单中选择“滑杆”命令。这时舞台上“大小”变量的外观发生了变化,多出了一个能够调整变量数值的滑杆,如图2-3-4所示。
图2-3-3 “小猫变大变小”脚本清单
图2-3-4 切换变量显示器为“滑杆”模式
(8)单击按钮运行程序,再拖动这个滑杆上的小圆点,可以看到舞台上的“大小”变量的数值在0到100的范围内变化,同时小猫角色的大小也会发生相应变化。
2.3.2 变量显示器
当创建一个变量后,在“数据”指令面板中就会出现一个同名的变量积木,同时变量积木前面的选择框处于选中状态(见图2-3-2),使得这个变量能够出现在舞台上。我们把在舞台上显示的“变量”称为变量显示器,它为变量提供一个可视化的外观。在Scratch项目中,可以把变量显示器作为舞台上的一个数据部件来使用,比如用于显示游戏的得分、状态或玩家名字等信息。变量显示器有3种样式的外观模式,分别是“正常显示”“大屏幕显示”和“滑杆”,可以通过变量显示器的右键菜单切换这3种外观模式,如图2-3-5所示。
当变量显示器切换到滑杆外观时,它的右键菜单中将多出一个“设置滑杆最小值和最大值”命令,可以通过它调出“滑杆数值范围”设置窗口,如图2-3-6所示。经过设置“最小值”和“最大值”之后,就可以限定变量在给定的数值范围内变化。
图2-3-5 切换变量显示器的3种外观模式
图2-3-6 设置变量显示器的滑杆数值范围
2.3.3 变量的数据类型和操作
变量是一种存放各种数据的容器,这些数据在Scratch中被分为3种类型,即数字类型(Number)、字符串类型(String)和布尔类型(Boolean)。数字类型指的是整数、小数等,比如123、-2、9.8等;字符串类型指的是一个文本值,通常由数字、字母和符号等键盘上可直接输入的字符或者可以由输入法输入的汉字等字符构成,可以用来表示一本图书的名字、一句话或一段文字等;布尔类型指的是一个逻辑值,只有真(用true或1表示)和假(用false或0表示)两种情况。例如,对于关系运算“1>0”的运算结果是true,而“1>2”的运算结果是false。
在Scratch中创建变量时,并不需要指定变量的数据类型,而是在使用变量时由Scratch自动转换数据类型。通常,我们创建变量之后,在脚本中使用“将…设定为…”积木给变量设定一个数字类型或字符串类型的数据,那么Scratch就会把这个变量指定为相应的数据类型。Scratch还为数字类型的变量提供一个“将…增加…”积木,可用于增加或减少变量的数值。
在图2-3-7所示的脚本中,首先将变量x设定为5,这时变量x被指定为数字类型,然后对变量x进行增加1的操作,它的值变为6;再对变量x进行增加-3(减少3)的操作,它的值变为3。最后,将变量x的值传递给变量y,使变量y的值变为3。
如果试图对字符串类型的变量进行增加或减少的操作,那么这个变量的值将会被设置为NaN,它是英文Not a Number的缩写,意思是“不是一个数字”。
在图2-3-8所示的脚本中,首先将变量s设定为一个字符串abc,这时变量s被指定为字符串类型,然后对变量s进行增加1的操作,它的值变为NaN。可见,对字符串类型的变量不能使用“将…增加…”指令积木进行操作。但是,可以对字符串进行连接的操作,在本章后面的内容中会对此进行介绍。
图2-3-7 对数字类型变量的操作示例
图2-3-8 对字符串类型变量的操作示例
虽然布尔类型的数据使用true和false表示,但是不能通过将true或false传递给一个变量而使它变成布尔类型的变量。在Scratch中有些指令积木能够返回布尔类型的数据,可以将这些数据传递给变量而使其被指定为布尔类型。当变量是布尔类型时,它的取值true等于1,false等于0,可以使用“将…增加…”积木对它进行操作。
图2-3-9 对布尔类型变量的操作示例
在图2-3-9所示的脚本中,首先将一个字符串true传递给变量b,这时变量b的值为true,再对变量b进行增加1的操作,这时变量b的值变为NaN。可见,变量b是字符串类型,不能通过把true传递给变量而使它被指定为布尔类型。
接着,将大于运算“2>1”的结果传递给变量b,这时变量b的值为true,再对变量b进行增加1的操作,这时变量b的值变为2。可见,这时变量b被指定为布尔类型,而true等于1。
最后,将小于运算“2<1”的结果传递给变量b,这时变量b的值为false,再对变量b进行增加-1(减1)的操作,这时变量b的值变为-1。可见,这时变量b也被指定为布尔类型,而false等于0。
2.3.4 变量的命名和作用域
在Scratch中创建一个变量时,需要给变量指定一个名字。可以使用字母、数字和下划线等可以通过键盘输入的字符为变量命名,也可以使用中文给变量命名。尽管Scratch对变量命名的要求非常宽松,任何可输入的字符几乎都能作为变量名,但是建议不要这么做。初学者从一开始就养成良好的变量命名习惯,有利于以后学习Python、C/C++或Java等高级语言。下面介绍一些值得遵守的变量命名规范的建议。
(1)变量名由英文字母、数字和下划线构成,并且以英文字母开头。尽量不使用特殊字符,除非你明确这么做的真正目的,并且保持风格统一。
(2)为变量起一个能够准确表达其作用的、有意义的名字,使程序更容易维护和理解。
(3)变量名的首字母采用大写或小写。由多个单词组成变量名时,每个单词的首字母大写或者各个单词用下划线分隔。请确定一种风格,并保持统一。
(4)尽量不要使用汉语拼音作为变量名,而应使用英文命名,这也是提高自己英文水平的机会。
(5)对于国内的编程初学者(比如小学生),建议先使用中文命名变量名,这样可以集中精力学习编程。等到编程熟练之后,再使用英文命名方式。
在Scratch中,如果要修改变量名或删除变量,可以在“数据”指令面板的变量名上右击,在弹出的快捷菜单中选择“重命名变量”或“删除变量”命令。
除了给变量命名,在创建变量时还需要指定变量的作用域。变量的作用域是一个专业的编程概念,通常分为全局变量和局部变量。在Scratch中,变量的作用域分为两种:“适用于所有角色”和“仅适用于当前角色”。如果在创建变量时选择“适用于所有角色”,那么就会创建一个全局变量,这个变量在整个Scratch项目的各个角色和舞台的脚本中都能被访问和修改。如果在创建变量时选择“仅适用于当前角色”,那么就会创建一个局部变量,这个变量仅在当前角色的脚本中能够被访问和修改。
变量的作用域在创建之后无法修改,但是可以先将变量删除再重新创建,达到修改变量作用域的目的。
2.3.5 动手练:求两数之和
1.练习重点
变量积木的使用。
2.问题描述
请设计一个程序脚本,输入两个数,计算出两数之和。
3.解题分析
(1)使用问答积木询问并接收用户输入的两个数,存放在变量a和b中。
(2)使用“将…增加…”指令积木把变量a和b的值累加到变量s中。
(3)使用“说”指令积木输出两数之和(变量s的值)。
4.练习内容
图2-3-10 “求两数之和”空白脚本
(1)把图2-3-10所示的程序脚本中的空白积木替换为真实积木。
(2)修改上述脚本,使用“运算”指令面板中的加法运算积木实现求和功能。