Lua:String.match / string.gsub - 对于真/假

时间:2015-05-09 16:14:37

标签: lua lua-patterns

我一直试图弄清楚这一点,但我担心我没有快速看到整个解决方案,现在我需要一双新的眼睛才能完成我需要的工作。

我有一个非常特别的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。
  4. 在方案一中,它必须返回true,即使我的组中有人以及组外的人也是如此。但是我的Lua知识不够广泛,我可以解决问题。非开始string.matches的原因是因为特定行可能在其之前有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中输入“look”时,我会看到类似于以下内容的内容:

    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时始终保持为真。

    现在这个更清楚了吗?如果没有,我不确定我还能添加什么。

    更新

    look的输出不是单个字符串。从本质上讲,每个行都会被单独处理,从房间中的字符开始。例如:

    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 :(得分:1)

在下面的代码中,我假设输出来自&#34; look&#34;是一个名为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

我假设名字以大写字母开头,后跟&#34;是&#34;。 排除组成员的最简单方法是创建一个集group_member。如果至少有一个非组成员,则返回true,否则返回false。