我的javascript代码中的奇怪错误

时间:2013-11-25 00:34:29

标签: javascript

问题图片:http://puu.sh/5spfQ.png

我的第一个问题。我希望我能在一定程度上解释它,让你知道我想要做什么。

我正在开发一个小型的JavaScript游戏,唯一的目标就是赚钱。赚钱的方法之一是雇佣工人。但是,有一个问题。例如,我们有工人A 工人B 。由于一些奇怪的原因,每当工人B开采某些东西时,工人A也会收到开采的矿石(因此两者似乎总是拥有相同数量的矿石)。我似乎无法弄清楚为什么会这样;他们不应该接收彼此的矿石。

注意:>雇用<工人存储在“雇用”变量中。

有趣的部分,代码:

*此功能为每个可能的工人填写雇用变量的占位符。 *

    //add "placeholder data" to prevent future undefined/errors
    //and makes future modification easier, specially in workerMain()
    var o = [];
    for(ore in ores){o[ore] = 0;}

    for(w in workers){
        employed[w] = [0, o];
    }

因此,我们所使用的变量可能看起来像是:

'矿工a'=> [0,['coal_ore'=> 0,'diamond_ore'=> 0]] ,'矿工b'=> [0, ['coal_ore'=> 0,'diamond_ore'=> 0]])

现在一旦他们被雇用,每秒运行一次的循环将决定他们开采了多少矿石,并且它应该将任何工人开采的矿石放在他们各自的地方。

function workerMain(){
    setTimeout(function(){
        for(e in employed){
            var wObj = workers[e];
            var orePerSecond = Math.ceil(wObj.opm/60)*employed[e][0];
            var oresMined = generateOres(orePerSecond, wObj.pickaxe);

            //add newly mined ore count to worker's ore
            for(ore in oresMined){
                employed[e][1][ore] += oresMined[ore];

                //we aren't storing the ore, so let's go ahead and sell it
                money += ores[ore].worth*oresMined[ore];
            }
        }

        updateValues();
        workerMain();
    }, 1000);
}

但是,不管怎样,如果Miner A开采煤矿,不管怎样,矿工B也将获得煤矿。

希望我彻底解释了我的问题。如果您似乎无法在此代码中找到问题,那么它可能位于这些兄弟函数中:

http://pastebin.com/2WgT8Acg

1 个答案:

答案 0 :(得分:4)

Javascript中的数组和对象通过引用传递,因此在此代码中:

var o = [];
for(ore in ores){o[ore] = 0;}

for(w in workers){
    employed[w] = [0, o];
}

您正在创建一个变量o并为每个miner分配对它的引用。因此,每个矿工都在更新同一套矿石。

您需要为每个矿工创建一个新数组:

var o;

for(w in workers){
    o = [];
    for(ore in ores){o[ore] = 0;}
    employed[w] = [0, o];
}

我敢说一些Javascript专家可以提供更高效的版本!