《一意孤行》开源编程游戏汉化版

经过一段时间的工作(其实没花多少时间),我很高兴的跟大家介绍开源编程游戏 Untrusted 的汉化版:《一意孤行》正式发布了。

该游戏讲述了一个研究人工智能的教授 Dr. Eval。面对各种挑战,不断前行的故事。好玩的地方在于,每一关,都需要玩家修改不同的 JavaScript 代码来改变逻辑,让角色到达出口。通关这个游戏除了需要玩家有一定的编程知识之外,还要有丰富的想象力和创造力。同时,如果对人工智能的基本原理有所了解,也能让通关过程事半功倍。不过事实证明,代码民工干体力活也能通关的!:D

在线游戏

untrusted-1

untrusted-2

在线游戏

如果对该游戏有任何意见、建议欢迎在下面留言。如果你觉得这个游戏还不错,欢迎捐赠。

该游戏中文版托管在“七牛”上,在这里我得感谢“七牛”的朋友们!

汉化过程中的主要工作如下:

翻译并二次创作了游戏名称、内容以及背景音乐名称;

  • 为 Untrusted 增加了 mod 功能,可以在不修改原有关卡的情况下,重新开发一个新的游戏(一系列关卡);
  • 为 Untrusted 增加了一个简单的自动转换功能(i18n.js),在翻译时不用再对每个文件进行修改;
  • 发现了 Untrusted 的一些小问题;
  • 修复了 Untrusted 居中分行显示全角字符;
  • 修复了 rotjs 的一个处理全角字符的 bug。

Join the Conversation

25 Comments

  1. 你误解了我的意思。不过不用管它了,我前天遇到的问题不存在了,可能当时语法写错了吧。

  2. 你好,我的github账号已经登录,为什么做完一关以后post出去的gist还是匿名的呢?有办法找回之前关卡的答案吗?

  3. 默认设置是使用匿名的 gist 的,这个一方面是无须用 github 登录就可以创建 gist,另一方面主要是避免给大家的 gist 创建大量的垃圾信息。

    每关过了以后,会在 localStorage 里记录过关的代码。你点 menu 回到以前的关卡是能看到的。

  4. 我的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');
    }

  5. 我的level 4通关方案

    map.placeObject(map.getWidth()-5, map.getHeight()-5, ‘exit’);

  6. 我的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’);

  7. 我的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’);
    }

  8. 我的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’;
    }
    }
    });

    });

  9. 第六关
    moveToward=function(obj, type){
    if (obj.canMove(‘left’)) {
    obj.move(‘left’);
    }
    }
    直接更改函数相比创建一个假的玩家来说貌似更加简单粗暴

  10. 第九关
    player.setPhoneCallback(function(){
    raftDirection = ‘up’;
    });

  11. 第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');

  12. 第10关
    if(me.canMove(‘up’))
    me.move(‘up’);
    else
    me.move(‘right’);

  13. 11
    if(me.canMove(‘right’))
    me.move(‘right’);
    else
    me.move(‘down’);

  14. 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');
    }

  15. 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’);

  16. level 2
    map.placeObject(7, 6,’exit’); 亲测没用啊…刷新了很多次
    最后直接用
    /*
    */
    过关,不知道是不是正解……

Leave a comment

Your email address will not be published. Required fields are marked *