群里的 @krew 今天问了个问题,源自JSRobot上的一关。看了下JSRobot,跟Untrusted差不多,也是一个代码通关游戏,觉得挺有趣,遂玩了一遍。现放上我的通关攻略。

首先放上游戏地址: http://JSRobot.tk

Level 0

这关是教学关,按照文字描述直接输入R.right()即可通关。

Level 1

方向移动函数教学关,代码:

R.right() && R.down()

Level 2

move函数教学关,重新定义var direction = 'right'; 即可。

Level 3

这关我也没想那么多,直接一步一步自己移上去了,欢迎更简单的方法。代码:

function go(direction, times) {
    times = times || 1;
    for(var i=0;i<times;i++) R.move(direction);
}
go('left', 1);
go('up', 2);
go('right', 5);
go('down', 2);
go('right', 3);
go('up', 2);

懒人进阶版:

['left','right','up','down'].forEach(function(d){
  window[d] = function(times) {
    times = times || 1;
    for(var i=0;i<times;i++) R.move(d);
  }
});

left()||up(2)||right(5)||down(2)||right(3)||up(2);

Level 4

这关告诉我们如果下一步移动撞墙的话函数就会返回false,这个给了我一个好点子。话不多说放代码:

var d = ['up', 'right', 'down', 'right', 'up', 'left'];
if(!R.move(d[temp])) temp++;

Level 5

正则和destroy教学贴,正则很简单,匹配的是非a-z0-9的字符,随便来一个即可。代码:

(key = '$') && R.right();

Level 6

standingOn函数教学帖,代码:

if(R.standingOn('^')) R.up();

Level 7

standingOn函数小进阶,代码:

var d = ['up', 'down', 'left', 'right'];
if(R.standingOn('-')) temp = 3;
else if(R.standingOn('+')) temp = 2;
else if(R.standingOn('2')) temp = 1;
else if(R.standingOn('>')) temp = 0;
R.move(d[temp]);

Level 8

这题就是简单的考正则了,同标签包裹内容为key即可。示例代码:

var key = "<div>key</div>";

Level 9

这关的话希望大家不要被上面的各种符号迷惑,总的来说从Robot位置到达f的路线是先往右直走,然后再向下直走,或者是先向下直走然后往右直走。这里的小技巧就是使用return把下面不相关的代码全部屏蔽掉。代码:

if(!R.right()) R.down();
return true;

Leve 10

这关的难点在于如何让steps = 4,因为按照正常思路的话当到达1位置的时候steps == 2的。这里的解决方法是先右移一次,然后左移一次,再右移。这样就增加了steps移动的次数了。另外一个需要注意的是正则那部分,不要被\\1给骗了,这个不是后项引用,就是正常的字符串。代码:

if(!R.right()) R.left();
key = "<k>\\1<e>\\2<y>\\3";

Level 11

教学帖,直接重新定义函数使其返回true即可。代码:

guineaPig = {
    getKeyFromStomach: function() {return true}
};
R.right();

Level 12

这关不能像上一关一样重新定义函数了,因为明确告诉我们不能使用guineaPiggetKeyFromStomach变量了。由于我们是无法拿到闭包函数里面的key变量的,所以无法对其值进行更改。但是我们可以另辟蹊径,自己写代码去销毁而不是用它的代码,由于不能明目张胆的使用destroy函数,所以我们需要对其进行一些处理才行。代码:

R["d e s t r o y".split(" ").join("")]("right");
R.right();

Level 13

这一关的目的是要创造一个函数,使得其既返回true又返回false。当然,我们要是被这个表象迷惑的话也会困扰一番的。本关的key在于函数运行了两次。代码:

var a = -1, key = function() {return a++}
R.right();

总结

相对于Untrusted来说,还是非常容易的,好几关都是教学关比较轻松就能过去了。相对难一点的关卡活用大脑的话也是比较轻松过了,此外正则考的比较多,当然也算是容易的正则就是了。

03-05 22:38