在数组中添加一个名称,检查数组以查看名称是否存在,运行代码

刚刚接触 Lua 几个小时,有些适量的 C++ 和 Java 背景,但并不惊人。

我正在尝试为一个游戏编写一个插件,它能够检测我周围的玩家,并在附近10码内向他们打招呼。

它运行得很好,但我只想让它每个玩家运行一次,因为不断向人们打招呼会导致垃圾信息和烦人。

我想到了将他们的角色名存储在数组中,但我很难理解数组的语法。

     function Wave()
        local totalObjects = GetObjectCount()
        local shouldMessage = false
        local player = GetActivePlayer()
        arrayNames = {}
        for i = 1, totalObjects do
            local object = GetObjectWithIndex(i)
            if object ~= player and UnitIsPlayer(object) == true and UnitIsDead(object) == false then
                local yards = GetDistanceBetweenObjects(player, object)
                 local name = ObjectName(object)

                  ----------------- 我的问题的开头 ----------------

                if yards < 10 and arrayNames[i] ~= name then -- 如果名称不在数组中?
                    arrayNames[i] = name -- 尝试向数组中添加名称
                    print(arrayNames[i])

                    break
                end
            end

    end
    if storeName then
    end
end
点赞
用户7396148
用户7396148

问题在于每次调用“Wave”函数后,您的表都会被清除。这是因为您在函数内部执行arrayNames = {},因此每次运行时都会将表设置为新的空表。您可以在“Wave”函数外部定义“arrayNames”,或将其更改为arrayNames = arrayNames or {}。第二个选项将在定义时将“arrayNames”设置为“arrayNames”,如果未定义,则设置为新表。

另外

您的代码仅检查特定索引处的数组中是否存在“name”,而不是检查整个数组。如果玩家的索引可能会更改,那么您可能会再次使用此方法来问候他们。

您需要遍历整个数组,以确保您已经向此人问候过。这意味着随着您向越来越多的人问好,检查时间会越来越长

我建议使用集而不是数组:

if yards < 10 and not arrayNames[name] then -- if name isnt in set already?
    arrayNames[name] = true -- trying to add the name to set
    print(name)

    break
end

仅使用“name”作为键将其添加到表中,并将值设置为true,这将为您的检查提供O(1)性能。

以下是有关集的更多信息: https://en.wikipedia.org/wiki/Set_(abstract_data_type)

在计算机科学中,集合是一种抽象数据类型,可以存储唯一的值,没有特定的顺序。它是有限集合数学概念的计算机实现。与大多数其他集合类型不同,与从集合中检索特定元素不同,人们通常在集合中测试成员身份。

2019-09-26 22:44:03