我目前正在为RPG游戏构建MUD(多用户域)。完全用Python做这个,既可以制作我喜欢的游戏,也可以学习python。我遇到的一个问题,由于问题的极端特殊性,我一直无法找到正确的答案。
所以,这就是我需要的东西,坚果壳。我没有一个完整显示我需要的代码片段,因为我必须粘贴大约50行才能使用5行我才有意义。
targetOptions = ['Joe', 'Bob', 'zombie', 'Susan', 'kobold', 'Bill']
我们游戏中的cmd是攻击,我们输入'僵尸',然后我们继续杀死僵尸。但是,我想只输入'a z'。我们在代码中尝试了一些不同的东西,但它们都是不稳定的,而且经常是错的。我们的一次尝试返回了类似['sword','talisman']的内容,作为'获得剑'的匹配。那么,有没有办法搜索此列表并让它返回匹配值?
我还需要返回值[0],如果有话说,房间里有2个僵尸,我输入'a z'。感谢您提前帮助,我希望我能够清楚地了解我正在寻找的东西。如果需要更多信息,请告诉我。并且不要担心整个攻击的事情,我只需要发送'zo'并获得'僵尸'或类似的东西。谢谢!
答案 0 :(得分:2)
欢迎使用SO和Python!我建议您查看official Python documentation并花一些时间查看Python Standard Library中包含的内容。
difflib模块包含一个函数get_close_matches()
,可以帮助您进行近似字符串比较。这是它的样子:
来自difflib import 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!!!
答案 1 :(得分: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
过滤第一个arg接受的内容的列表(第二个arg)。 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']