我正在尝试创建自己的文本游戏,正如学习Python艰难之路的Ex 45中的指示,但我有点卡住了。我有自己的库存系统设置,我需要弄清楚如何在用户输入“库存”时显示库存清单(我也想为“帮助”做类似的事情)...我知道我可以在每个raw_input之后为它添加一个if语句,但是我想看看是否有一些全局函数或代码可以用来让我更轻松。
我进行了搜索和搜索,但我不知道如何说出问题或我可以做些什么来解决这个问题。这是我的库存设置,我用它来调用它:
class Item(object):
def __init__(self, name, quantity=1):
self.name = name
self.raw = name.strip().lower()
self.quantity = quantity
def recalc(self):
self.netValue = self.quantity * self.value
class Container(object):
def __init__(self, name):
self.name = name
self.inside = {}
def __iter__(self):
return iter(self.inside.items())
def __len__(self):
return len(self.inside)
def __contains__(self, item):
return item.raw in self.inside
def __getitem__(self, item):
return self.inside[item.raw]
def __setitem__(self, item, value):
self.inside[item.raw] = value
return self[item]
def add(self, item, quantity=1):
if quantity < 0:
print "ERROR."
if item in self:
self[item].quantity += quantity
self[item].recalc()
else:
self[item] = item
inventory = Container("Inventory")
这就是我在输入广告资源时使用的名称:
print "Inventory: [" + ",".join((item[1].name for item in inventory)) + "]"
答案 0 :(得分:0)
你可以使用与lambdas结合的字典,这将是紧凑而快速的
from __future__ import print_function
#store commands
inputLookup = {"Inventory" : lambda: print ("Inventory: [" + ",".join((item[1].name for item in inventory)) + "]"), "other text" : lambda: 3} #and so on
text = input() #replace with hover you get input
inputLookup[text]() # call the function from dictionary at that command
导入会将所有打印语句更改为print()。 对于lambdas,你也可以这样做。
def f():
print "Inventory: [" + ",".join((item[1].name for item in inventory)) + "]"
inputLookup = {"Inventory": lambda: f()}
text = input()
try:
inputLookup[text]
except:
print "that is not a valid input" #or something
这将允许您使用旧的打印声明
是的,你不应该以这种方式对同一个函数使用递归,你将生成一个大堆栈。此外,那些印刷声明在一个奇怪的地方。
def func1():
print "Uh oh."
print "You're outside the house and it's quiet."
print "You EXAMINE and find a ROCK."
While True:
userinput1 = raw_input(">>> ")
if userinput1 == "inventory":
print "Inventory: [" + ",".join((item[1].name for item in inventory)) + "]"
elif userinput1 == "pick up":
if rock not in inventory: # so they can't pick up infinite rocks
inventory.add(rock)
print "You picked up a ROCK."
else:
print "you've already picked up the rock"
elif userinput1 == "examine":
print "Man's best friend."
else:
print "Let's go on about our way then."
break
我没有看到你刚开始。我暂时远离lambda's,因为他们有点先进,对于混乱感到抱歉。以前,如果你看一下你的if / elif / else树,就没有办法调用else语句,所以我编辑了一下,希望它能按照你的意图运行。还有库存和摇滚全球?如果不是,你需要在函数中声明或引用它们。 (虽然作为未来的注释,从全局变量中保持一种方式通常是好的)
Items = {'rock': Rock(), 'item2': Item2(), 'item3' : item3()} #where Item() is creating the object
Inventory.add(Items[itemname]) # adds the item
您可以将项目设为全局项目,以便随时随地访问它。现在这是好的,但是正如你所知,你应该远离全局。
答案 1 :(得分:0)
您可以为每个有效的用户输入创建一个功能,例如广告资源
然后,你可以这样做:
input = raw_input('...')
self.method = getattr(<your class>, input)
self.method()
将调用
def inventory(self, ...):
pass