2015-05-09 78 views
2

我一直試圖弄清楚這一點,但我擔心我沒有看到整個解決方案很快,現在我需要一個新的眼睛來完成我所需要的。Lua:String.match/string.gsub - 真/假的殼體

我有一個非常特別的MUD劇本,可以幫助我在房間中區分MOB和玩家。該腳本本身有效,但現在我想添加一個新元素來檢查我的團隊成員是否在同一個房間中。這是我到目前爲止:

function strends(s) 
    if s:match("%u%w+ is here%.") or s:match("%u%w+ is fighting .-%.") or s:match("%u%w+ is sleeping here%.") then 
    return true 
    else 
    return false 
    end 
end 

這很好用 - 它檢查大寫字母名稱是否在房間裏,並根據要求返回信息。

我有一個我的組隊友表,雖然我可能會發現它更容易做到一個字符串,並做string.find。我遇到的問題是針對每種情況進行套用:

  1. 如果房間外有我的小組以外的玩家,則返回true。
  2. 如果只有我的小組以外的玩家返回true。
  3. 如果房間裏除了我自己以外沒有人,請返回false。

在場景一中,即使在我的組中有人員以及我的組以外的人員,它也必須返回true。但是我的Lua知識不夠廣泛,我無法解決這個問題。非開始字符串匹配的原因是因爲特定行有可能在其之前有xx個字符。我應該如何處理這個問題,或者我應該怎麼做才能實現我的目標?

編輯:修復了場景2,因爲出現了錯誤。這裏是典型的期待在一個房間裏來了:

方案1:

(R) NonGroupMate is sleeping here. 
(W)(R)(T) Groupmate is here. 

預期的結果?

return true -- the function checks if there are people outside my group in the room. 

方案2:

(D)(W) NonGroupMate is fighting a mob! 
(T)(W) NonGroupMateTwo is here. 

預期的結果?

return true 

方案3:

(T) GroupMate is here. 
(W) GroupMateTwo is sleeping here. 
GroupMateThree is fighting a mob! 

預期的結果?

return false 

我希望這有助於澄清一些事情。如果您需要更多,請告訴我。

更澄清

我不是故意的任何誤解。我認爲以上所有都是需要的,但我會嘗試將其分解。

當我鍵入MUD「看」,我看到類似以下內容:

Room name 
    Room Desc 
    [ Exits: <exits> ] 
    NameOne is here. 
    (G) NameTwo is here. 
    (R)(W) NameThree is sleeping here. 
    (W) NameFour is fighting a mob. 

我已經有觸發器[退出:]後直接匹配項目,並引發火災沒有問題。它按照它應該做的那樣評估每一行,並通過strends()函數運行它。

我試圖解決的問題是創建一個函數,在該函數中評估該行並確定該玩家的姓名是否在我的組中。如果他們在我的組中,strends()應返回false(因爲strends()返回是否有我應該避免在房間裏的球員)。如果他們不在我的組中,那麼它需要返回true

這就是我很難理解;我如何創建該功能?我真正喜歡的功能是,一旦它確定一個不在該組中的球員進入房間,是否讓它休息並忽略所有其他結果。我認爲,爲了實現這個目標,我不得不將它們輸入到一個表格中並迭代,這樣我就可以在任何給定的點上打破。我/可能會做的是設置一個條件變量,它在開始時設置爲false,當設置爲true時始終保持爲真。

現在更清楚了嗎?如果不是,我不知道我還能添加什麼。

更新

從外觀的輸出是不是一個單一的字符串。從本質上講,每一行都會被單獨處理,從房間裏的角色開始。例如:

NameOne is here. -- This is processed by itself, gets passed through strends. 
NameTwo is sleeping here. -- This is also processed through strends, by itself. 
NameThree is here. -- Yet again it's processed individually through strends. 

我可以嘗試將它全部放入表中,但觸發的代碼最終會變得雜亂無章。

+1

如果您的問題是關於模式匹配,請提供使用代碼**輸入預期結果**的示例。目前還不清楚你的意思是,如果在我的小組以外的球員有房間。或其他情況。 –

+0

我想你的問題是*開始string.matches的原因是因爲特定的行有可能在它之前有xx個字符。*但是我也不理解它。 –

+1

準確地說。背景故事很有趣也很有用,但是有一個明確的例子,你現在已經得到了10個回覆。 – Blindy

回答

1

在下面的代碼中,我假設「look」的輸出是一個名爲look_out的字符串。

look_out = [[ 
Room name 
    Room Desc 
    [ Exits: <exits> ] 
    NameOne is here. 
    (G) NameTwo is here. 
    (R)(W) NameThree is sleeping here. 
    (W) NameFour is fighting a mob. 
]] 

group_member = {NameOne=true, NameTwo=true} 

function has_non_group(look_out, group_member) 
    for name in look_out:gmatch("(%u%w+) is ") do 
    if not group_member[name] then 
     return true 
    end 
    end 
    return false 
end 

print(has_non_group(look_out, group_member)) -- true 

group_member.NameFour = true 
group_member.NameThree = true 
print(has_non_group(look_out, group_member)) -- false 

我假設名字以大寫開頭,後面跟着「is」。 排除組成員的最簡單方法是創建一個集合group_member。如果至少有一個非組成員,則它將返回true和false。

+0

外觀不作爲完整的字符串處理。我更新了該帖子以表明這一點。 – Josh