我正在进行文字冒险并尝试让玩家从房间里拿起物品。我这样做的方法是让房间有一个items
属性,这是一个来自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 :(得分:0)
由于您已经拥有name
属性,因此最好与此onw进行比较:
if item.lower() in [i.name.lower() for i in room.items]:
说明:[i.name.lower() for i in room.items]
是一个"列表理解"并构建一个列表,其中包含name
中所有房间的room.items
属性。我添加了lower()
,因为您很可能不希望这种情况发生。
答案 1 :(得分:0)
在上一个方法中,您将项目的值设置为两次,紧接着:
item = action[5:]
item = item.title()
标题将取代“动作[5:]”的任何值。但这不是重点。你有一个(大概)对象的列表,它们实际上可能看起来像[,],你试着将这些值与“面包”进行比较,这很可能根本不会出现在那里。
对象在创建时具有散列值,以便将它们与具有相同“名称”的其他对象区分开来。
在您的项目列表中,您有2个实例,而且预先几乎没有办法告诉它们的哈希值是什么,更不用说比较它们了。