2017-01-30 95 views
0

我正在进行文本冒险并尝试让玩家从房间中拾取物品。我通过让房间有一个items属性这是一个项目模块中的对象列表。我试图检查用户的输入是否在列表中,但即使它们是相同的,它说它不在其中。检查用户输入是否在对象列表中

world.py:

class ItemTile(MapTile): 
    def __init__(self, x, y): 
     self.items = [items.Bread(), items.Herbs()] 
     super().__init__(x, y) 

items.py:

class Bread(Consumeable): 
    def __init__(self): 
     self.name = "Bread" 
     self.healing_value = 15 
     self.value = 20 

game.py:

elif hasattr(room, "items") and 'take' in action: 
    player.pick_up(action) 

player.py:

def pick_up(self, action): 
     room = world.tile_at(self.x, self.y) 
     item = action[5:] 
     item = item.title() 
     print(item, room.items[0]) 
     if item in room.items: 
      self.inventory.append(item) 
      room.items.remove(item) 
      print('You pick up the {}'.format(item)) 
     else: 
      print("You see no such thing.") 

例如,如果我输入'take bread'(只是打印,以显示它们是相同的):

Bread Bread 
You see no such thing. 

而且我的IDE说,耗材类下self.name没有得到解决。

+0

字符串“Bread”与列表中的“Bread”实例不同**,即使它们具有相同的表示形式。考虑将字符串名称映射到实际对象的字典。此外,它看起来像面包应该是'Consumeable'的*实例*,而不是*子类*。 – jonrsharpe

+0

@jonrsharpe:你可以在上面的编辑中查看我的字典代码吗?我认为我还没有真正理解不同元素的表示。对不起:/关于子类,我正在关注一个教程 - 我并不知道更好的XD –

+0

我建议你用你的新尝试的适当[mcve]写一个新问题,建立在下面答案的教导你的基础上。如果你改变了这个问题,你会使答案失效。 – jonrsharpe

回答

0

既然你已经有一个name属性你最好比较反对这种ONW:

if item.lower() in [i.name.lower() for i in room.items]: 

说明:[i.name.lower() for i in room.items]是“列表理解”并建立在room.items的所有客房name属性的列表constisting。我加了lower(),因为你很可能不想让这种情况发生。

+0

考虑到OPs明显的体验水平,您至少应该包含短语*“列表理解”*,以便他们可以搜索它。 – jonrsharpe

+0

@jonrsharpe:你说得对,我已经添加了 – hansaplast

+0

@hansaplast感谢您的帮助。对不起,这是我做的第一个程序,它也在跟着一个教程。当我从room.items中删除项目时,如何引用用户输入的列表项目?据我所知,字符串显然与实例不一样。 –

0

在你最后的方法,可以设置项的值的两倍,之后对方:

item = action[5:] 
    item = item.title() 

标题将取代一切价值“的行动[5:]”是。但是,这并不重要。你有一个可能实际上看起来像这样的(可能是)对象的列表,并且你试图将这些值与“面包”进行比较,这很可能根本就不存在。

对象在创建时具有哈希值,以便将它们与具有相同“名称”的其他对象区分开来。

在你的项目列表中,你有2个实例,前面几乎没有办法告诉他们哈希值是什么,更不用说你比较它们了。

+0

是啊,这是有道理的啊哈。谢谢!我只是不知道该怎么做。 –

+0

差不多有!在创建这个字典时,你可以用项目的实例来填充它。所以当你运行这个字典时的结果就像{'bread':}(等等)。这意味着现在当你想搜索字典时,你可以调用密钥。但是,密钥区分大小写(查找哈希值)。在后台Python中使用了一个公式来将“面包”散列成一个唯一的密钥。这意味着你需要找到确切的匹配。即“面包”而不是“面包”。用键“面包”调用字典应该让你的面包对象。 – Ludo21South

+0

也可以建议使用PDB(Python调试器)。这允许您在运行时检查代码。只需将“导入pdb”放在您想要截取的行上并在pdb.set_trace()上。我知道,当我想知道究竟发生了什么时,这帮助了我很多(并且仍然如此)。 – Ludo21South

相关问题