变量详解

变量详解

> LeekScript 教程

你要掌握的第一个概念就是:变量。

变量用来存储信息。创建变量时,我们会给它起一个名字。之后就可以用这个名字读取它保存的信息,或者给它存入新的信息。变量是所有程序的基础,某种程度上,它就是你的韭葱的记忆。

变量是什么?

我们不会深入讲解计算机内存的工作原理。你只需要知道,你的韭葱能够记住数字,很多很多的数字……

当你创建一个变量时,就是在韭葱的记忆里预留一块位置来存放信息。你相当于在对它说:记住这条信息,待会儿你会用到它!

你可以把变量想象成抽屉。假设你的韭葱脑袋里塞满了抽屉。想收好袜子时,你拉开一个抽屉,把袜子放进去,再在抽屉正面贴上一张写着“袜子”的标签。

Leek Wars 里也是一样!(只不过没有袜子。)假如你想记下某一时刻自己的生命值,就需要一个抽屉。你会通过代码把生命值放进一个抽屉,并在上面写上“生命值”。等你需要这条信息时,就告诉你的韭葱:把“生命值”抽屉里的东西给我。

类型

在计算机领域,变量是按类型划分的。你可以存储不同种类的信息:

LeekScript 是一门动态类型语言。因此,你不需要亲自规定变量是什么类型,语言会替你处理。声明一个变量,往里面存放任何你想存的东西,变量都会适应它的内容。这个机制让初学者用起变量来更简单,但如果不留神,它也可能让你栽跟头。

创建变量

首先,你得给变量起个名字。不过起名要遵守几条规则:

因此,“nombreDeVie”、“poireau”、“ma_cellule”、“poireau1”都是合法的变量名。注意大小写:“poireau”和“Poireau”是两个不同的变量。

起个聪明的名字

变量最好不要随便起名。把变量命名为“a”“b”“c”……看起来简单又方便,尤其是在你想不出名字的时候。可是,回想变量“h”到底是干什么用的所浪费的时间,比你写代码时省下的时间还要多……

名字要准确,要用能清楚表明用途的变量名。缩写可以用,但别滥用。一个存放敌人所在格子的变量?“enemyCell”就是个很好的名字。一个存放与敌人之间距离的变量?简单的“distance”就够了,不过如果你要存储多个距离,就得写得更具体些。

声明变量

终于该讲讲关键字 var 了。就是它让你能够创建变量。

var maVariable;

这段代码声明了一个名为“maVariable”的变量,所以我们称之为“声明”。用抽屉来比喻的话,这段代码创建了一个贴着“maVariable”标签的抽屉,而且它是空的。注意行末的分号“;”,它表示一条语句的结束。千万别忘了它!

一个什么都不装的变量用处不大。下面是在声明变量的同时给它赋值的写法,我们称之为“初始化”。

var maVariable = 5;

这样就创建了一个名为“maVariable”、值为整数 5 的变量。我们同样创建了一个贴着“maVariable”标签的抽屉,但这一次,我们在里面放了值“5”。可以说,这一行是在告诉你的韭葱:记住 maVariable 等于 5。

我们用 debug 函数来输出变量的内容。调用这个函数的写法是“debug();”,并在括号里写明它要输出什么。

var maVariable = 5; debug(maVariable); //输出:5

这段代码会在战斗日志中输出“maVariable”的内容。用一场测试战斗试试看吧。

变量可以存储任何东西。你可以往里面放整数、小数,甚至文本。

var unEntier = 5; debug(unEntier); //输出:5

var unDecimal = 3.14; debug(unDecimal); //输出:3.14

var duTexte = "Bonjour !"; debug(duTexte); //输出:Bonjour !

注意,如果是文本,就必须用双引号“"”括起来。

另外注意,小数要用点号表示,而不是逗号。

布尔值

最后,还有一种数据类型可以存储,它叫作布尔值。

布尔值是一种只能取两个不同值的变量,不多也不少。

整数可以是 0、1、2 等等,而布尔值只能是 true 或 false。

布尔值的世界里没有灰色地带,在它看来,一切非真即假(英文就是 true 或 false)。

我们来声明几个布尔值!

var monBooleen = true; debug(monBooleen); // 输出:true monBooleen = false; debug(monBooleen); // 输出:false

请务必明白,这不是文本。注意这里没有引号。true 和 false 是两个特定的值,就像 1、-2、3.14、"pouet" 等等一样。

赋值

创建一个带值的变量固然不错,但如果能随心所欲地改变它的值,那就更好了!

而实现这一点的语法你已经知道了。再看一遍这段代码:

var maVariable = 5;

你已经学过,关键字 var 用来创建变量。而等号“=”表示给这个变量赋一个值。

所以,要改变变量的内容,可以这样写:

var maVariable = 5; debug(maVariable); // 输出:5

maVariable = -10; debug(maVariable); // 输出:-10

var maVariable = 5.64; debug(maVariable); // 输出:5.64

maVariable = "J'aime les poireaux !"; debug(maVariable); // 输出:J'aime les poireaux !

maVariable = true; debug(maVariable); // 输出:true

这叫作赋值。我们把值 -10 赋给了 maVariable。你随时都可以改变变量的内容,想怎么改就怎么改。

全局变量

还有另一个关键字可以用来声明变量:global,它用来声明所谓的“全局变量”。

你现在已经知道,你的代码会在韭葱的每个回合执行一次。因此,用 var 声明的变量在每个回合都会被重新创建,同时也会被重新初始化。

全局变量则不是这样。如果你这样声明一个全局变量:

global maVariable = 5;

这个变量会在你的韭葱的第一个回合被创建。但和普通变量不同,回合结束时它依然存在。

为了更直观地看清发生了什么,我们稍微提前讲一点下一章的内容。试试这段代码:

var maVariable = 0; maVariable = maVariable + 1; debug(maVariable);

下一章你就会学到,“maVariable = maVariable + 1;”这一行会把“maVariable”的值加 1。如果“maVariable”等于 1,它就会变成 2;如果它等于 2,就会变成 3,依此类推。

用这段代码,第 1 回合你会看到输出值 1,第 2 回合也是,之后每个回合都是。每个回合变量都会被重新创建,所以在输出时它的值始终是 1。

现在换成全局变量试试:

global maVariable = 0; maVariable = maVariable + 1; debug(maVariable);

第 1 回合,你应该会看到值 1,到这里还没什么特别的。而到了第 2 回合……变量的值变成了 2!之后也一样,每个回合它的值都会增加。

这一次,变量在第一个回合被创建,之后的回合不会再创建,而且它会一直存在。注意,“global maVariable = 0;”这一行只在第一个回合执行。变量一直存在,也不会被重置为零。

具体来说,全局变量可以让你在回合之间保存信息。不过也不能滥用,还要注意及时更新你存储的信息。比如,如果你保存了对手的位置,射击前记得先更新它。朝一个对手已经不在的格子开枪,那就太可惜了。

全局变量还有另一个用途,等以后讲到变量的作用域时我们再谈。

总结

现在你已经知道如何用 var 创建变量,以及如何用“=”修改变量的内容。

不过变量还有一些秘密等着你去发现。我们以后再讲,在那之前你还需要学点别的东西。