【问题标题】:Lua: String.match/string.gsub - Casing for true/falseLua: String.match/string.gsub - true/false 的大小写
【发布时间】:2015-07-20 10:58:44
【问题描述】:

我一直在尝试解决这个问题,但我担心我不会很快看到整个解决方案,现在我需要一个全新的视角来完成我需要的事情。

我有一个非常特殊的 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 知识还不够广泛,无法解决问题。非开头 string.matches 的原因是因为特定行之前可能有 xx 个字符。我应该如何处理这个问题,或者我应该怎么做才能实现我的目标?

编辑:修复了场景 2,因为出现了错误。以下是查看房间通常会得出的结果:

场景一:

(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.

场景二:

(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.

我已经有触发器可以在 [ Exits: ] 之后直接匹配项目,并且触发器会毫无问题地触发。它按照应有的方式评估每一行,并通过strends() 函数运行它。

我要解决的问题是创建一个函数,在该函数中评估线路并确定玩家的姓名是否在我的组中。如果他们在我的组中,strends() 应该返回false(因为strends() 返回房间里是否有我应该避免的玩家)。如果他们不在我的组中,则需要返回true

那是我很难理解的;我该如何为此创建函数?我真正想要的功能是,一旦它确定一个不在小组中的玩家在房间里,让它休息并忽略所有其他结果。不过,我认为,要做到这一点,我必须将它们输入到一个表中并进行迭代,这样我就可以在任何给定点中断。我/可能/最终要做的是设置一个条件变量,该变量在开始时设置为 false,当设置为 true 时始终保持为 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.

我可以尝试将其全部放入一个表格中,但触发的代码最终会变得混乱。

【问题讨论】:

  • 如果您的问题是关于模式匹配的,请提供输入预期结果的示例带代码。不清楚你说的房间里是否有我组以外的玩家。或其他情况。
  • 我猜你的问题是 非开头 string.matches 的原因是因为特定行之前可能有 xx 个字符。 但我不知道也不明白。
  • 没错。背景故事很有趣并且可能有用,但如果有一个明确的例子,你现在应该已经收到了 10 条回复。
  • (R) NonGroupMate is sleeping here.(W)(R)(T) Groupmate is here.是存储在两个字符串还是一个字符串中?
  • 顺便说一句,我们真正期待的是a Minimal, Complete, and Verifiable example

标签: lua lua-patterns


【解决方案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。如果至少有 1 个非组成员,则返回 true,否则返回 false。

【讨论】:

  • look 未作为完整字符串处理。我更新了帖子以表明这一点。尽管如此,这还是非常有用的,如果这是我必须采取的路线,将被视为替代方案。谢谢!
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 2011-11-05
  • 2013-06-04
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2015-05-18
相关资源
最近更新 更多