2009-09-08 6 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") 

을, 당신이 잘 인수로서 하나의 테이블을 것 GetRandomElementGetRandomArgument를 대체 제공 될 것이며, 테이블에서 임의의 항목을 리턴하십시오.

편집 :Olle's answerGetRandomElement과 같은 것을 구현할 수 있습니다. 그러나 루아 5.1에서 더 이상 사용되지 않는 모든 호출에 table.getn을 사용했으며 그 대체 (table.maxn)는 테이블의 요소 수에 비례하는 런타임 비용을 가지고 있습니다.

함수 table.maxn은 사용중인 테이블의 배열 부분에 요소가 누락 된 경우에만 필요합니다. 그러나이 중에서 선택할 항목 목록의 경우 목록에 구멍을 허용 할 필요가 없습니다. 런타임에 목록을 편집해야하는 경우 table.remove을 사용하여 항목을 제거 할 수 있으므로 간격을 줄일 수 있습니다. 이 같은 메시지를 보낼 수 있도록

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

: 텍스트의 배열 간격이 없도록 보장으로

, 당신은이 같은 GetRandomElement을 구현할 수

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

최고를 - 그냥 뭐 나는 끝났어. 큰 감사를 드린다. 조 – Joe

관련 문제