2009-09-08 91 views
3

我一直在与通过使用下面一行随机短语.lua文件玩耍:从列表中选择随机短语

SendChatMessage(GetRandomArgument("text1", "text2", "text3", "text4"), "RAID") 

我的问题是,我有很多的短语和一代码行的确很长。

有没有办法在代码(或外部)的列表其他地方举行

text1 
text2 
text3 
text3 

和调用,在主代码的随机值。将使维护文本选项列表更容易。

回答

2

你想要一个表包含像你的短语

phrases = { "tex1", "text2", "text3" } 
table.insert(phrases ,"text4") -- alternative syntax 
SendChatMessage(phrases[math.random(table.getn(phrases))], "RAID") 

注:getn得到表的大小; math.random得到一个随机数(最大长度为短语表的大小),phrases[]语法返回[]内部索引处的表元素。

3

对于名单多达几百个元素,那么下面的工作:

 
messages = { 
    "text1", 
    "text2", 
    "text3", 
    "text4", 
    -- ... 
} 
SendChatMessage(GetRandomArgument(unpack(messages)), "RAID") 

对于较长的列表,你会得到更好的服务,以取代GetRandomArgumentGetRandomElement这将需要一个表作为它的参数和从表中返回一个随机条目。

编辑:Olle's answer显示了一种方式,像GetRandomElement可能实现。但它在每次调用时都使用table.getn,在Lua 5.1中不推荐使用它,其替换(table.maxn)的运行时成本与表中元素数成比例。

函数table.maxn只有在正在使用的表可能在其数组部分中缺少元素时才需要。但是,在这种可供选择的项目列表中,可能没有理由需要在列表中允许出现漏洞。如果您需要在运行时编辑列表,则始终可以使用table.remove删除项目,因为它也会缩小差距。

随着文字的阵列中的无间隙的保证,那么你就可以实现GetRandomElement这样的:

 
function GetRandomElement(a) 
    return a[math.random(#a)] 
end 

所以您发送类似这样的消息:

 
SendChatMessage(GetRandomElement(messages), "RAID") 
+0

真棒 - 正是我在之后。十分感谢。乔 – Joe