2013-11-25 3 views
0

Изображение задачи: http://puu.sh/5spfQ.pngОдд ошибка в моем коде яваскрипта

Мой первый вопрос здесь. Надеюсь, я могу объяснить это в приличной степени, чтобы дать вам представление о том, что я пытаюсь сделать.

Я работаю над маленькой javascript-игрой, где единственной целью является заработать деньги. Одним из способов заработать деньги является наем работников. Однако есть проблема. Например, у нас есть Рабочий A и Рабочий B. По какой-то нечетной причине, когда Рабочий B миновал что-то, Работник А также получает добытую руду (так что оба, похоже, всегда имеют такое же количество руды). Я не могу понять, почему это так; они не должны получать друг друга.

Примечание:> нанятые < работники хранятся в переменной «занято».

Забавная часть, код:

* Эта функция заполняет заполнителей к используемой переменной для каждого возможного работника по найму. *

//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]; 
    } 

Таким образом, наша используется переменная может выглядеть вдоль линий:

('шахтер а' => [0, [ 'coal_ore' => 0, 'diamond_ore' => 0] ], 'miner 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 А шахты угольной руды, как-то Miner B будет также получить, что угольную руду.

Надеюсь, что я подробно объяснил свою проблему. Если вы не можете найти проблему в этом коде, он может лежать в пределах этих двойников функций:

http://pastebin.com/2WgT8Acg

+0

Главный рабочий я вижу функцию, называемую значениями обновления, каким-либо образом мы могли бы это увидеть? – Trendy

+0

Вы не должны быть петлевыми массивами с 'for ... in', а регулярным циклом' for'. Также вы забыли объявить все переменные цикла, чтобы они стали неявными глобальными. – elclanrs

+0

'for (руда в рудах)' делает его похожим на 'ore' - это ключ свойства, а' o = [] ', за которым следует' o [ore] ', заставляет его выглядеть так, как вы думаете, массивы являются ассоциативными массивами ...могу ли я ответить, предполагая, что это так? – sqykly

ответ

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 гуру мог бы сделать более эффективную версию!

+0

Я бы, скорее всего, рекомендовал 'o = {}', поскольку 'o' не похоже, что он используется в массиве. Любое решение будет сводиться к циклу 'for ... in', но некоторые из более привлекательных будут скрывать это за $ .extend',' _.extend', ... –

+0

Woo-hoo! Это была проблема. Я не знал, что JavaScript сделал это. Я ценю быструю помощь и новые знания. :) – user3029571

+0

http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object – Havenard

Смежные вопросы