Табличные значения с Valor Lua - PullRequest
0 голосов
/ 11 декабря 2011

Итак, я делаю скрипт и у меня есть функция:

loot()

, что возвращает:

{"3 gold coins"}
{"3 gold coins"}
{"nothing"}
{"6 gold coins", "a hand axe"}
{"12 gold coins", "a hand axe"}

Я хочу, чтобы эта функция была включена в таблицу, и таблица должна читать «a», «an», «без числа перед словом» = 1

поэтому таблица читает и выполняет пример подсчета:

table = {"gold coins"=24,"nothing"=1,"hand axe"=2}

Это тот тип таблицы, который я ищу, но в данный момент мне это не удалось. Как я уже говорил до того, как моя функция loot() возвращает эти сообщения, это не единственные сообщения, которые лут читают, но я хочу сохранить их число или "a", "an" в качестве числовых значений для 1, так что если это "6 Золотые монеты »делит эти 6 и увеличивает их в таблице, когда относится к сообщению« Золотые монеты ». Я надеюсь, вы понимаете мою точку зрения здесь.

Цель этого - показать значения таблицы, чтобы я мог сделать:

table["gold coin"] = 24

или

 table = {["item"]="count",}

чтобы я мог запросить ключ. Я действительно хочу таблицу, которая увеличивает ключ, а не обычную таблицу, но я просто не могу понять, как это сделать ...

заранее спасибо

и если вы сможете объяснить мне каждую его часть, я буду очень благодарен:)

некоторые другие сообщения:

{"11 gold coins", "a leather helmet", "meat", "a spear", "a gold coin"}
{"a gold coin"}

Кстати, эта программа, которую я использую для этой цели, очень ограничена. Все, что я могу использовать для этого, это по ссылке lua manual 5.1: http://www.lua.org/manual/5.1/manual.html

метатаблицы не являются опцией: /

1 Ответ

2 голосов
/ 11 декабря 2011

Первое, что вам нужно, это функция, которая извлекает числа и имена элементов из строк.Следующий будет читать такие вещи, как «копье» или «11 копий» и возвращать 1, «копье» и 11, «копье».

function parseAmountAndItem(str)
  assert(type(str)=="string", "Expected a string. Got a " .. type(str))
  -- handle "nothing"
  if str == "nothing" then return nil end
  local item, amount

  -- return 1 when it begins with a/an + space
  _,_,item = str:find("^an? (.+)$")
  if item then
    amount = 1
  else -- it should begin with a number + space + singular + s
    _,_,amount,item = str:find("^(%d%d?%d?%d?%d?) (.+)s$")
    assert(amount and item, "Could not parse the string: " .. str)
    amount = tonumber(amount)
  end
  return amount, item
end

Затем вам нужно накопить эти значения.Это должно работать:

function accumulatedLoot()
  local result = {}
  local amount, item
  for _,row in ipairs(loot())
    for _,str in ipairs(row)
      local amount, item = parseAmountAndItem(str)
      if item then
        result[item] = (result[item] or 0) + amount
      end         
    end
  end

  return result
end

Пара предупреждений:

  • Я написал все это от руки, не проверяя.Скорее всего, у него будут некоторые синтаксические ошибки и / или ошибки.
  • Я предположил, что множественные формы всех ваших элементов - это единственная форма + "s". Реальный английский намного сложнее .Возможно, вам придется хранить таблицу неправильных множественных чисел и сравнивать ее с str, а не просто удалять s, как я делаю в коде.
...