群里的 @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
这关不能像上一关一样重新定义函数了,因为明确告诉我们不能使用guineaPig
和getKeyFromStomach
变量了。由于我们是无法拿到闭包函数里面的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来说,还是非常容易的,好几关都是教学关比较轻松就能过去了。相对难一点的关卡活用大脑的话也是比较轻松过了,此外正则考的比较多,当然也算是容易的正则就是了。