我的javascript代码中的奇怪错误

我的javascript代码中的奇怪错误,javascript,Javascript,问题图片: 我的第一个问题。我希望我能适当地解释一下,让你知道我想做什么 我正在开发一个小型javascript游戏,其中唯一的目标是赚钱。赚钱的方法之一是雇佣工人。然而,有一个问题。例如,我们有工作者A和工作者B。出于某种奇怪的原因,每当工人B开采某物时,工人A也会收到所开采的矿石(因此两者似乎总是拥有相同数量的矿石)。我似乎不明白这是为什么;他们不应该互相接待 注意:>employed[0,['coal\u ore'=>0,'diamond\u ore'=>0],'miner b'=>[0,

问题图片:

我的第一个问题。我希望我能适当地解释一下,让你知道我想做什么

我正在开发一个小型javascript游戏,其中唯一的目标是赚钱。赚钱的方法之一是雇佣工人。然而,有一个问题。例如,我们有工作者A工作者B。出于某种奇怪的原因,每当工人B开采某物时,工人A也会收到所开采的矿石(因此两者似乎总是拥有相同数量的矿石)。我似乎不明白这是为什么;他们不应该互相接待

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

有趣的部分,代码:

*此函数用于为每个可能雇用的工人填充已雇用变量的占位符*

    //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];
    }
因此,我们所使用的变量可能大致如下:

'miner a'=>[0,['coal\u ore'=>0,'diamond\u ore'=>0],'miner b'=>[0,['coal\u ore'=>0,['diamond\u 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);
}
但同样,如果矿工A开采一个煤矿,不知何故,矿工B也会得到那个煤矿

希望我已经彻底解释了我的问题。如果您似乎无法在这段代码中找到问题,那么它可能存在于以下同级函数中:


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大师可以制作一个更高效的版本

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大师可以制作一个更高效的版本

worker main我看到了一个名为update values的函数,我们也可以看到吗?您不应该在中使用
for…循环数组,而应该使用常规的
for
循环。您还忘了声明所有循环变量,使它们成为隐式全局变量。
for(ore in ores)
使它看起来像
ore
是一个属性键,
o=[]
后跟
o[ore]
使它看起来像是一个关联数组。。。假设是这样,我能回答吗?@elclanrs谢谢!将确保解决声明问题。而且不会说for…in/for更像是一种偏好吗?不<(…in…
的代码>与()的代码>不同。请仔细阅读。worker main我看到了一个名为update values的函数,我们也可以看到它吗?您不应该在中使用
for…循环数组,而应该使用常规的
for
循环。您还忘了声明所有循环变量,使它们成为隐式全局变量。
for(ore in ores)
使它看起来像
ore
是一个属性键,
o=[]
后跟
o[ore]
使它看起来像是一个关联数组。。。假设是这样,我能回答吗?@elclanrs谢谢!将确保解决声明问题。而且不会说for…in/for更像是一种偏好吗?不<(…in…
的代码>与()的代码>不同。请仔细阅读。我可能会推荐
o={}
,因为
o
看起来不像是用于数组。任何解决方案都会归结为一个
for…in
循环,但一些更高级的解决方案会将其隐藏在
$后面!这就是问题所在。我不知道JavaScript做了这件事。我感谢您的快速帮助和新知识。:)我可能会推荐
o={}
,因为
o
看起来不像是用于数组。任何解决方案都会归结为一个
for…in
循环,但一些更高级的解决方案会将其隐藏在
$后面!这就是问题所在。我不知道JavaScript做了这件事。我感谢您的快速帮助和新知识。:)