2015-05-09 69 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