2017-01-30 55 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

相關問題