Python 在dict库存中搜索项目时出现关键错误
在过去的几个月里,我一直在尝试创建一个基于文本的Zork风格的游戏,作为一个自学Python的项目 感谢stackoverflow这里的优秀员工和大量youtube视频,我取得了不错的进步。我目前处理的问题是代码的底部,在Bag类中。 正如你们将在我的bag类中看到的,我有一个名为Take的方法。此方法最初不在bag类中,而是在底部读取用户命令的部分中Python 在dict库存中搜索项目时出现关键错误,python,class,dictionary,Python,Class,Dictionary,在过去的几个月里,我一直在尝试创建一个基于文本的Zork风格的游戏,作为一个自学Python的项目 感谢stackoverflow这里的优秀员工和大量youtube视频,我取得了不错的进步。我目前处理的问题是代码的底部,在Bag类中。 正如你们将在我的bag类中看到的,我有一个名为Take的方法。此方法最初不在bag类中,而是在底部读取用户命令的部分中 class Bag: def __init__(self, inventory): self.inventory =
class Bag:
def __init__(self, inventory):
self.inventory = inventory
def addToInventory(self, item):
for key in list(Location.room.roominv.keys()):
self.inventory.append(Location.room.roominv[key])
del Location.room.roominv[key]
def SearchRoom(self):
if Location.room.roominv:
for item in list(Location.room.roominv.keys()):
print("you find a", item)
else:
print("You don't find anything")
def NoneHere(self, command):
print("You can't find a", command)
def Take(self, command):
for key in list(Location.room.roominv.keys()):
if Location.room.roominv[key].name == command.split()[1]:
bag.addToInventory(key)
print('you take the', key)
def CheckTake(self):
if Location.room.roominv and command.split()[1] in Location.room.roominv:
self.Take(command)
else:
self.NoneHere(command.split()[1])
def CheckInv(self):
for item in list(bag.inventory):
print("Your bag contains:", item.name)
player = Player("Jeff", 100)
bag = Bag([])
Location = Location('introd')
command = ' '
while command != "":
command = input('>>> ')
if command in Location.room.exits:
Location.travel(command)
elif command == 'look':
Location.RoomDesc()
elif command == '':
print('You have to say what it is you want to do!')
command = '#'
elif command == 'search':
bag.SearchRoom()
elif command.split()[0] == 'Take':
bag.CheckTake()
elif command == 'Inventory':
bag.CheckInv()
else:
print('Invalid command')
我被建议将用户命令的逻辑与游戏的其他部分分开,因此我将其移动到指定的类中
然而,在我这么做之前,游戏只从房间清单中挑选特定的物品是没有问题的。现在它把所有的东西都捡起来了
(定义每个房间的代码将张贴在底部,我一直在从一个单独的.py文件导入它)
目前,只有一个房间包含多个项目。“小屋内部”房间,里面有“华丽的钥匙”和“刀”
奇怪的是。如果我试着拿那把华丽的钥匙,它会很好地把它捡起来(不过也会把刀捡起来)
然而,如果我试图拿刀,我会收到一个错误的回溯
Traceback (most recent call last):
File "C:/Users/Daniel/Python 3.6/Scripts/PythonPR/Flubbo'sModuleTest.py", line 156, in <module>
bag.CheckTake()
File "C:/Users/Daniel/Python 3.6/Scripts/PythonPR/Flubbo'sModuleTest.py", line 130, in CheckTake
self.Take(command)
File "C:/Users/Daniel/Python 3.6/Scripts/PythonPR/Flubbo'sModuleTest.py", line 122, in Take
if Location.room.roominv[key].name == command.split()[1]:
KeyError: 'Ornate_Key'
您为什么在
包中有Take
方法?这似乎是完全多余的,考虑到所有你想做的就是添加该项目,如果它存在于字典中。试试这个:
def CheckTake(self):
key = command.split()[1]
if Location.room.roominv and key in Location.room.roominv:
bag.addToInventory(key)
print('you take the', key)
else:
self.NoneHere(key)
而且,您的代码不一致。在某些地方,您可以直接访问全局变量,而在其他地方,您可以冗余地将全局变量传递给函数。我强烈建议你把这件事带到办公室,一旦你把它做好,你就要行动起来 对不起,这太长了。你能把它归结为一个简单的例子来说明这个问题吗?例如,这是一个基于Zork的游戏,这一事实与python类的功能无关。此外,如果您正在尝试python中的新构造,那么在应用于您的问题之前,将更容易对基本功能进行原型化。如果你的方法存在根本性的缺陷,但在你意识到它不起作用之前,它贯穿了你的整个项目,那么需要修复/撤销的东西太多了。我现在将尝试对它进行长时间的编辑。至于基本功能的原型设计,正如我所说,这在我的代码的早期版本中是可行的。我不知道为什么这个功能现在已经改变了,因为它包含在一个类中。实际上,我在CodeReview中发布了这段代码的早期版本,并被建议进一步拆分我的函数,我可能有点过火了。还有,谢谢!我知道它是多余的,但不知道如何摆脱它。key=command.split()[1]是答案。你能举一个例子,我有时直接访问全局变量,而其他人则将其传递给函数吗?“我真的是在白手起家地自学,而这类事情正是我被绊倒的地方。”薛定谔说,“是的。”。你肯定有代码的味道。没有什么不可出售的,但您的代码可能会使用一些TLC。。。那是肯定的。不管怎样,你可以试试这个。如果有效,请随意^vote/mark accepted。@Schrodinger的stat例如CheckTake
将command
视为全局命令,但Take
将其作为参数接收。解决了问题!从我的addToInventory函数中删除了“输入列表(Location.room.roominv.keys()):”。现在开始代码审查,以澄清类似的进一步问题。@Schrodinger的陈述,一切顺利。
def CheckTake(self):
key = command.split()[1]
if Location.room.roominv and key in Location.room.roominv:
bag.addToInventory(key)
print('you take the', key)
else:
self.NoneHere(key)