向数组中添加名称,检查数组中是否存在名称,运行代码 新的Lua,几个小时前,我有一些中等背景的C++和java,但没什么了不起的。
我正在尝试为一款游戏开发一个插件,用于检查我周围的玩家,如果是的话(在10码以内)会向他们致意 它工作的很好,除了我只希望它运行一次,每个球员,因为它将是垃圾邮件和恼人的不断问候的人 我认为最好的方法是将它们的字符名存储在数组中,但我很难理解数组的语法向数组中添加名称,检查数组中是否存在名称,运行代码 新的Lua,几个小时前,我有一些中等背景的C++和java,但没什么了不起的。,lua,Lua,我正在尝试为一款游戏开发一个插件,用于检查我周围的玩家,如果是的话(在10码以内)会向他们致意 它工作的很好,除了我只希望它运行一次,每个球员,因为它将是垃圾邮件和恼人的不断问候的人 我认为最好的方法是将它们的字符名存储在数组中,但我很难理解数组的语法 function Wave() local totalObjects = GetObjectCount() local shouldMessage = false local player
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
函数波()
本地totalObjects=GetObjectCount()
本地shouldMessage=false
本地播放器=GetActivePlayer()
arrayNames={}
对于i=1,totalObjects会
本地对象=GetObjectWithIndex(i)
如果object~=player和UnitIsPlayer(object)=true,UnitIsDead(object)=false,则
本地码=获取对象(玩家、对象)之间的距离
本地名称=对象名称(对象)
-----------------我的问题的开始----------------
如果码数<10且arrayNames[i]~=name,那么——如果name不在数组中?
arrayNames[i]=名称--尝试将名称添加到数组中
打印(arrayNames[i])
打破
结束
结束
结束
如果是storeName,那么
结束
结束
问题在于,每次调用Wave后,您的表都会被清除。这是因为您正在函数中执行arrayNames={}
,因此每次运行该函数时,表都被设置为一个新的空表。您可以在Wave
函数之外定义arrayNames
或将其更改为arrayNames=arrayNames或{}
第二个选项将在定义时将arrayNames
设置为等于arrayNames
,如果未定义,则将其设置为新表
另外 代码只检查数组中特定索引处是否存在
名称
,而不检查整个数组。如果玩家的索引可以改变,那么你很可能会用这种方法再次问候他们
你还需要检查整个阵列,确保你还没有向此人打招呼。这意味着当你问候越来越多的人时,支票会越来越长
我建议使用集合,而不是使用数组:
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
如果码数<10,而不是arrayNames[name],那么——如果name不在集合中?
arrayNames[name]=true--尝试将名称添加到集合
印刷品(名称)
打破
结束
只需将名称
作为键添加到表中,并将值设置为true
,这将为您的检查提供O(1)性能
以下是有关集合的更多信息:
在计算机科学中,集合是一种抽象的数据类型,可以存储唯一的值,而不需要任何特定的顺序。它是有限集数学概念的计算机实现。与大多数其他集合类型不同,通常测试集合中的成员资格值,而不是从集合中检索特定元素
谢谢你的回复!这是有道理的,但仍然在重复运行,我应该提到,这个函数在游戏中的每一帧更新都会被重新调用,这是否意味着它每次都会重置局部变量?(因此不能正常工作)啊,那么问题是你的桌子在每一帧之后都会被清空。它需要在每帧运行的循环之外定义。。。更清楚地说,因为您在函数内部执行
arrayNames={}
,所以每次都会重置表。您可以将其更改为arrayNames=arrayNames或{}
Ah,这就是问题所在!!我甚至没有注意到这一点,但现在它变得非常合理。非常感谢你!它工作得很好。