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

问题描述 投票:1回答:1

几个小时前刚接触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)

                  ----------------- The beginning of my issue ----------------

                if yards < 10 and arrayNames[i] ~= name then -- if name isnt in array already?
                    arrayNames[i] = name -- trying to add the name to array
                    print(arrayNames[i])

                    break
                end
            end         


    end
    if storeName then   
    end
end
lua
1个回答
1
投票

问题是,每次调用Wave后,您的表都会被清除。这是因为您正在函数内部执行arrayNames = {},因此每次运行该表时都会将其设置为一个新的空表。您可以在arrayNames函数之外定义Wave或将其更改为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)

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

© www.soinside.com 2019 - 2024. All rights reserved.