1

我目前正在为 rpg 游戏构建 MUD(多用户域)。完全用 Python 做这件事,既可以制作我喜欢的游戏,又可以学习 Python。我遇到的一个问题,由于问题的极端特殊性,我一直无法找到正确的答案。

所以,简而言之,这就是我需要的。我没有一个很好的代码片段来完全显示我需要什么,因为我必须粘贴大约 50 行才能使我使用的 5 行有意义。

targetOptions = ['Joe', 'Bob', 'zombie', 'Susan', 'kobold', 'Bill']

我们游戏中的命令是攻击,我们输入“僵尸”,然后我们继续杀死僵尸。但是,我只想输入“a z”。我们在代码中尝试了一些不同的东西,但它们都不稳定并且经常出错。我们的一项尝试返回了类似 ['sword', 'talisman'] 的内容作为 'get Sword' 的匹配项。那么,有没有办法搜索这个列表并让它返回一个匹配的值?

如果房间里有 2 个僵尸,我还需要返回 value[0],然后我输入“a z”。感谢您提前提供的所有帮助,我希望我对我正在寻找的内容足够清楚。如果需要更多信息,请告诉我。不要担心整个攻击的事情,我只需要发送'zo'并获得'zombie'或类似的东西。谢谢!

4

2 回答 2

2

欢迎使用 SO 和 Python!我建议您查看官方 Python 文档并花一些时间查看Python 标准库中包含的内容。

difflib模块包含一个可以帮助您进行近似字符串比较的函数。get_close_matches()这是它的样子:

从 difflib 导入 get_close_matches

def get_target_match(target, targets):
    '''
    Approximates a match for a target from a sequence of targets,
    if a match exists.
    '''
    source, targets = targets, map(str.lower, targets)
    target = target.lower()

    matches = get_close_matches(target, targets, n=1, cutoff=0.25)

    if matches:
        match = matches[0]
        return source[targets.index(match)]
    else:
        return None

target = 'Z'
targets = ['Joe', 'Bob', 'zombie', 'Susan', 'kobold', 'Bill']
match = get_target_match(target, targets)
print "Going nom on %s" % match # IT'S A ZOMBIE!!!
于 2012-07-04T23:36:59.087 回答
0
>>> filter(lambda x: x.startswith("z"), ['Joe', 'Bob', 'zombie', 'Susan', 'kobold', 'Bill'])
['zombie']
>>> cmd = "a zom"
>>> cmd.split()
['a', 'zom']
>>> cmd.split()[1]
'zom'
>>> filter(lambda x: x.startswith(cmd.split()[1]), ['Joe', 'Bob', 'zombie', 'Susan', 'kobold', 'Bill'])
['zombie']

这有帮助吗?

filter为第一个参数接受的内容过滤列表(第二个参数)。 cmd是您的命令,并cmd.split()[1]获得空格之后的部分。 lambda x: x.startswith(cmd.split()[1])是一个函数(一个 lambda 表达式),它询问“是否x以空格后的命令开头?”

对于另一个测试,如果cmd是“a B”,那么有两个匹配项:

>>> cmd = "a B"
>>> filter(lambda x: x.startswith(cmd.split()[1]), ['Joe', 'Bob', 'zombie', 'Susan', 'kobold', 'Bill'])
['Bob', 'Bill']
于 2012-07-04T23:10:21.597 回答