> LeekScript 教程
你大概听过这个比喻:编程里的变量就像盒子,变量名就写在盒子的标签上;使用变量时,你只是看看盒子里装了什么。
同样,我们也可以把数组比作一个五斗柜。 五斗柜是一件有好几个抽屉的家具……而数组就是一个装着好几个变量的实体。简单来说,就是这么回事。
数组用方括号表示。下面的例子创建了一个空数组:
var toto = [];
这里的关键字 var 你已经认识了,声明变量时用的就是它。所以 toto 是一个数组类型的变量。
var fruits = ["poire", "banane", "pomme"];
这里我们用 3 个值初始化了数组。 简单来说,我们把字符串 "poire" 放进了第一个抽屉,"banane" 放进第二个,"pomme" 放进第三个。 如果把前两种水果的顺序对调,得到的就是另一个数组了。
东西放进去是挺好,可怎么拿出来用呢…… 很简单,只要你会从 0 开始数数(因为在编程里,大家就是喜欢从零开始数!)
第一个抽屉的编号是 0,第二个是 1,第三个是 2。如果一个数组有 100 个格子,那么最后一个格子的编号就是 99。 好的,然后呢? 很简单,要使用某个格子,只需要把它的编号写在方括号里:
debug( fruits[1] );
这个例子会输出名为 fruits 的数组中编号为 1 的格子(也就是第二个格子)。所以这里会输出字符串 "banane"。
那要是想修改值呢? 再简单不过了,和变量的用法一样,只是要写明修改哪个格子:
fruits[1] = "cerise"; debug( fruits ); // 会输出 ["poire", "cerise", "pomme"]
很简单,对吧?
要是我访问一个不存在的格子呢?比如在上面的例子里访问 fruits[3]?
问得好!第三个格子的编号是 2,所以编号为 3 的格子并不存在!这种情况下,返回的值是 ''null''。
喂,我用下面的代码试了你说的东西,结果输出了一堆奇怪的东西,我好像把什么都弄坏了!
var fruits = ["poire", "banane", "pomme"]; debug( fruits ); // 会输出 ["poire", "banane", "pomme"] fruits[3] = "ananas"; debug( fruits ); // 会输出 ["poire", "banane", "pomme", "ananas"] fruits[50] = "cerise"; debug( fruits ); // 会输出 [0:"poire", 1:"banane", 2:"pomme", 3:"ananas, 50:"cerise"]
别担心,年轻的学徒,你什么都没弄坏!因为数组最后一个元素(编号 3)和你想添加的元素(编号 50)之间的格子都不存在,LeekScript 就把你的数组变成了关联数组。这个我会在本教程的最后解释。现在,你就把它当成一个普通数组,只是格子的编号中间空了一段。
Leek Wars 的某些函数会直接返回一个数组,比如 getAliveEnemies 函数。
这些都很好。现在我会创建数组了,可是比如说,我要怎么输出所有对手的名字呢?我不知道一共有几个对手,总不能全都手写吧!
没错。第一个想到的办法可能是这样:
var enemies = getAliveEnemies(); debug( getName(enemies[0]) ); debug( getName(enemies[1]) ); debug( getName(enemies[2]) ); debug( getName(enemies[3]) ); debug( getName(enemies[4]) );
可是如果敌人超过 5 个,就会漏掉一些;如果少于 5 个,又会多出几行! 要知道一个数组有多少个格子,可以用 count 函数。
var nbEnemies = count(enemies); debug("还有 " + nbEnemies + " 个敌人活着。");
那么,怎样才能轻松地遍历数组呢?比如,你想知道地图上的障碍物在哪里,getObstacles 正好能帮上忙…… 可是这个数组大约有上百个格子……一个一个处理可不现实! 这时候,循环就能大显身手了!
var obstacles = getObstacles(); var nbObstacles = count(obstacles);
for (var k=0; k
普通数组 关联数组
声明空数组
var casesAccessibles = []; var casesAccessibles = [:];
直接写出数组内容
var casesAccessibles = [252, 253, 254, 255, 270, 271, 272, 287, 288, 289, 290, 305, 306, 307, 322, 323, 324, 325, 340, 341, 342, 357, 358, 359, 360];
var casesAccessibles = [252 : 3, 253 : 3, 254 : 3, 255 : 3, 270 : 2, 271 : 2, 272 : 2, 287 : 3, 288 : 1, 289 : 1, 290 : 3, 305 : 2, 306 : 0, 307 : 2, 322 : 3, 323 : 1, 324 : 1, 325 : 3, 340 : 2, 341 : 2, 342 : 2, 357 : 3, 358 : 3, 359 : 3, 360 : 3];
添加值添加到数组末尾
push(casesAccessibles, uneCase); 添加到数组开头
unshift(casesAccessibles, uneCase);
添加到指定位置
insert(casesAccessibles, uneCase, position);
caseAccessibles[uneCase] = valeur;
遍历数组不需要索引的遍历
for(var cell in caseAccessibles) { .... }
从数组开头按索引循环
for(var i=0; i=0; i--) { var cell = caseAccessibles[i]; .... } 同时获取索引和格子的遍历
for(var i:var cell in caseAccessibles) { .... } for(var cell:var distance in caseAccessibles) { .... } 修改元素无法直接修改,必须先删除旧值,再插入新值caseAccessibles[uneCase] = nouvelleValeur; 删除元素必须知道要删除的元素所在的位置
remove(caseAccessibles, position); 根据键删除
removeKey(caseAccessibles, caseASupprimer);
删除在数组中找到的第一个该值(所以要删除这个值的所有出现,就得多次调用)
removeElement(caseAccessibles, distance);
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.