2015-01-08 8 views
2

Я пытаюсь создать скрипт для MUD, в который я играю, что создаст таблицу для отслеживания среднего xp для каждой мобы. У меня возникают проблемы с синтаксисом проверки того, существует ли элемент в таблице и если он не создается. Я пытался что-то вроде этого, но получаю: attempt to index field '?' (a nil value)Построение таблицы ключей/значений в Lua

mobz_buried = { 
{mob = "troll", quantity = 2} 
{mob = "warrior", quantity = 1} 
{mob = "wizard", quantity = 1}} -- sample data 

number_of_mobz_buried = 4 

xp_from_bury = 2000 -- another script generates these values, these are all just examples 

xp_per_corpse = xp_from_bury/number_of_mobz_buried 

for _, v in ipairs(mobz_buried) do 
    if type(mobz[v].kc) == "variable" then -- kc for 'kill count', number of times killed 
      mobz[v].kc = mobz[v].kc + 1 -- if it exists increment kc 
    else 
     mobz[v].kc = 1 -- if it doesn't exist create a key value that matches the mobs name and make the kc 1 
    end 
    if type(mobz[v].xp) == "variable" then -- xp for average experience points 
     mobz[v].xp = (((mobz[v].kc - 1) * mobz[v].xp + xp_per_corpse)/mobz[v].kc) -- just my formula to find the average xp over a range of differant buries 
    else 
      mobz[v].xp = xp_per_corpse -- if it doesn't exist create the table just like before 
    end 
end 

Я пытаюсь закончить с mobz.troll = {kc, xp}, mobz.warrior = {kc, xp}, mobz.wizard = {kc, xp} и возможностью добавлять несколько ключевых значений, основанных от имен mobz_buried дает мне.

+0

Приведите простой пример таблицы 'mobz_buried' и' mobz'. –

+1

См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Ваш текущий пример не завершен. –

+0

Ваша таблица 'mobz_buried' имеет значение, которое не имеет соответствующего элемента в' mobz', поэтому, когда вы пытаетесь использовать 'mobz [v]', а затем индексируете это значение, нет значения, и вы получаете эту ошибку , См. Https://eval.in/private/88f083da483307 –

ответ

0

На основании дополнительной информации из ваших комментариев, похоже, что вы не создали таблицу для mobz. Попробуйте следующее:

local mobz = {} 
for _, v in ipairs(mobz_buried) do 
    mobz[v.mob] = mobz[v.mob] or {} 
    mobz[v.mob].kc = (mobz[v.mob].kc or 0) + 1 

    -- etc... 
end 
+0

Я пытаюсь понять это. Строка 3 говорит: «если этот элемент существует, чем оставить его как есть, если не создать его как пустой элемент?» –

+0

@EliBell Я не вижу этого комментария в вашем размещенном коде где угодно. Это больше похоже на то, что нужно увеличивать элемент на единицу, или если он не существует, создайте и инициализируйте его одним. – greatwolf

+0

Спасибо за ваше терпение, потребовалось некоторое время, чтобы понять. Но теперь я вижу, что использование «или» при присвоении табличных значений было тем, что я отсутствовал –

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

  • Нет связанных вопросов^_^