经过一段时间的工作(其实没花多少时间),我很高兴的跟大家介绍开源编程游戏 Untrusted 的汉化版:《一意孤行》正式发布了。
该游戏讲述了一个研究人工智能的教授 Dr. Eval。面对各种挑战,不断前行的故事。好玩的地方在于,每一关,都需要玩家修改不同的 JavaScript 代码来改变逻辑,让角色到达出口。通关这个游戏除了需要玩家有一定的编程知识之外,还要有丰富的想象力和创造力。同时,如果对人工智能的基本原理有所了解,也能让通关过程事半功倍。不过事实证明,代码民工干体力活也能通关的!:D
如果对该游戏有任何意见、建议欢迎在下面留言。如果你觉得这个游戏还不错,欢迎捐赠。
该游戏中文版托管在“七牛”上,在这里我得感谢“七牛”的朋友们!
汉化过程中的主要工作如下:
翻译并二次创作了游戏名称、内容以及背景音乐名称;
- 为 Untrusted 增加了 mod 功能,可以在不修改原有关卡的情况下,重新开发一个新的游戏(一系列关卡);
- 为 Untrusted 增加了一个简单的自动转换功能(i18n.js),在翻译时不用再对每个文件进行修改;
- 发现了 Untrusted 的一些小问题;
- 修复了 Untrusted 居中分行显示全角字符;
- 修复了 rotjs 的一个处理全角字符的 bug。
第七关我比较颜色怎么一直不对啊。
你要把自己变成跟锁一样的颜色,才可以通过。
你误解了我的意思。不过不用管它了,我前天遇到的问题不存在了,可能当时语法写错了吧。
你好,我的github账号已经登录,为什么做完一关以后post出去的gist还是匿名的呢?有办法找回之前关卡的答案吗?
默认设置是使用匿名的 gist 的,这个一方面是无须用 github 登录就可以创建 gist,另一方面主要是避免给大家的 gist 创建大量的垃圾信息。
每关过了以后,会在 localStorage 里记录过关的代码。你点 menu 回到以前的关卡是能看到的。
我的level 2通关方案
map.placeObject(7, 7,’exit’);
我的level 3通关方案
for (y = 10; y <= map.getHeight() – 3; y++) {
map.placeObject(5, y, 'block');
map.placeObject(map.getWidth() – 5, y, 'block');
}
for (x = 5; x <= map.getWidth() – 5; x++) {
//map.placeObject(x, 10, 'block');
map.placeObject(x, map.getHeight() – 3, 'block');
}
for(x=6;x<map.getWidth()-5;x++){
map.placeObject(x, map.getHeight() – 4, 'block');
}
我的level 4通关方案
map.placeObject(map.getWidth()-5, map.getHeight()-5, ‘exit’);
我的level 5通关方案
map.setSquareColor(x,y,’#0ff’);
我的level 6通关方案
map.defineObject(‘fakeplayer’, {
‘type’: ‘dynamic’,
‘symbol’: ‘f’,
‘color’: ‘blue’,
‘onCollision’: function (drone) {
drone.killedBy(‘fakeplayer’);
},
‘behavior’: function (me) {
moveToward(me, ‘dynamic’);
}
});
map.placeObject(map.getWidth()-4, 12, ‘fakeplayer’);
我的level 7通关方案
var player = map.getPlayer();
if(player.getColor()==’#0f0′){
player.setColor(‘#f00′);
}else if(player.getColor()==’#f00’){
player.setColor(‘#ff0′);
}else if(player.getColor()==’#ff0’){
player.setColor(‘#0f0’);
}
我的level 8通关方案
“generateForest”
我的level 9通关方案
player.setPhoneCallback(function(){
var player = map.getPlayer();
var x = player.getX();
var y=player.getY();
var objs = map.getDynamicObjects();
$.each(objs,function(index,obj){
var type = obj.getType();
if(type==’raft’){
if((x==obj.getX())&&(y==obj.getY())){
raftDirection = ‘up’;
}
}
});
});
第六关
moveToward=function(obj, type){
if (obj.canMove(‘left’)) {
obj.move(‘left’);
}
}
直接更改函数相比创建一个假的玩家来说貌似更加简单粗暴
第九关
player.setPhoneCallback(function(){
raftDirection = ‘up’;
});
第9关
map.defineObject(‘raft2’, {
‘type’: ‘dynamic’,
‘symbol’: ‘▓’,
‘color’: ‘#420’,
‘transport’: true, // (防止玩家掉进水里)
‘behavior’: function (me) {
}
});
for(var i = 0; i < 50;i ++)
map.placeObject(20, i, 'raft2');
第10关
if(me.canMove(‘up’))
me.move(‘up’);
else
me.move(‘right’);
11
if(me.canMove(‘right’))
me.move(‘right’);
else
me.move(‘down’);
12
if(me.getX() < 30){
if(!me.canMove('down'))
me.move('right');
else
me.move('down');
}
else if(me.getX() < 40){
if(me.canMove('up'))
me.move('up');
else
me.move('right');
}
else {
if(me.canMove('right'))
me.move('right');
else
me.move('down');
}
13
map.setSquareColor(14, 15, ‘f00’);
map.setSquareColor(16, 15, ‘f00’);
map.setSquareColor(15, 14, ‘f00’);
map.setSquareColor(15, 16, ‘f00’);
if(player.atLocation(14, 15))
me.move(‘left’);
if(player.atLocation(16, 15))
me.move(‘right’);
if(player.atLocation(15, 14))
me.move(‘up’);
if(player.atLocation(15, 16))
me.move(‘down’);
14
theAlgorithm
玩到18关出错了,页面编成空白的,再也打不开了
level 2
map.placeObject(7, 6,’exit’); 亲测没用啊…刷新了很多次
最后直接用
/*
*/
过关,不知道是不是正解……
不好意思…map.placeObject(7, 7, ‘exit’);正解,有效。输入法问题:P
第15关
player()