【问题标题】:Lua - How to check if list contains elementLua - 如何检查列表是否包含元素
【发布时间】:2014-04-30 05:30:11
【问题描述】:

我需要一些关于我的游戏 lua 脚本的帮助。我需要检查我在游戏中的库存是否包含列表中的任何 ID。

这是我的一份清单:

local Game_Items = {
    {id = 7436, name = "angelic axe", value = 5000},
    {id = 3567, name = "blue robe", value = 10000},
    {id = 3418, name = "bonelord shield", value = 1200},
    {id = 3079, name = "boots of haste", value = 30000},
    {id = 7412, name = "butcher's axe", value = 18000},
    {id = 3381, name = "crown armor", value = 12000}
}

下面的代码可能看起来有点奇怪,因为你不知道它的用途,但基本上是这样的:上面的列表是我的游戏中的物品列表,游戏内部有一个可以存放物品的物品栏和东西。现在我想检查我的库存是否包含这些 ID。

我尝试手动添加 2 个 id 并且它有效,但我的项目列表总共包含 500 多个项目,我不想把它们都写出来。有没有办法把整个列表放在里面并检查它是否在里面?

if not table.contains({ 3035, 3043, Game_Items[id] }, tempItemCounter.id) then

这是我到目前为止所尝试的。这两个第一个 id 的工作是 3035 和 3043,然后我尝试了我所有的整个列表,只检查了 Id。但我不知道该怎么做。该代码不起作用。谁能帮我在 table.contains 中包含整个 id 列表?

基本上想在该行中包含我的整个列表,而无需手动输入所有 ID。 Game_Items[id] 不应该工作吗?这不是意味着“Game_Items”中的所有“id”吗?

谢谢!

【问题讨论】:

  • 你能展示一下你的库存是什么样子的,还是和Game_Items一样的结构?另外,您能否将两者的结构更改为映射而不是数组,例如Game_Items = { [7346] = {name="...", value=5000}, [3567] = {name = ....}, ...}?因为如果你不能,你将不得不为每个游戏项目循环遍历每个库存项目。最后,您是否想知道库存是否包含所有物品,所以即使缺少一件物品,测试也应该是错误的?

标签: arrays list lua element


【解决方案1】:

不,不是那个意思。如果 foo 是一个表,那么 foo[id] 会在 foo 中查找一个被称为任何 id 所指的字段,例如一个字符串(所以如果 id 是 1 你会得到 foo[1],如果 id 是 "bar" 你会得到 foo.bar 等)。

您不能在一行中完成,但您可以创建一个函数来编写您的 if 条件。我不确定tempItemCounter 是什么,但假设您的库存是表单条目的键映射

inventory = {
    [1234] = {....}, 
    [1235] = {....},
    ...
}

每个整数键都是唯一的,并且假设只有当所有物品都在库存中时才需要 true,那么您可以这样做:

function isAllInInventory(items, inventory)
    for i,item in ipairs(items) do
         if inventory[item.id] == nil
              return false
         end
    end
    return true
end

if isAllInInventory(Game_Items, inventory) then
    ...
end 

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 2016-05-12
    • 2014-07-31
    • 2022-09-23
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多