2016-02-24 187 views
0

我想製造泥漿,但是當做一個裝備命令時,我遇到了這個錯誤。蟒蛇泥裝備命令

if item.types == "weapon": 
AttributeError: 'unicode' object has no attribute 'types' 

我想解決我的代碼,以便它允許用戶鍵入裝備的劍,它會搜索他/她的庫存該項目並應用統計。

這裏是我的項目代碼

#weapons 

class Weapon(): 
    def __init__(self, name, ATK, gold, types): 
     self.name = name 
     self.ATK = ATK 
     self.gold = gold 
     self.types = types 


club = Weapon("club", 1, 3, "weapon") 
sword = Weapon("sword", 3, 10,"weapon") 
axe = Weapon("axe", 4, 15,"weapon") 
bow = Weapon("Hailey's bow", 10, 40,"weapon") 
swordX = Weapon("Gods Sword", 8000, 8000,"weapon") 

,這裏是我的播放器代碼

players[id] = { 
      "name": None, 
      "room": "Tavern", 
      "ATK": 5, 
      "hp": 20, 
      "inventory": {}, 
      "armorName": None, 
      "armorPT": None, 
      "weaponName": None, 
      "weaponPT": None, 
     } 

和最後我的裝備命令代碼

elif command == "equip": 
      x = params.lower() 
      rm = rooms[players[id]["room"]] 
      if x in players[id]["inventory"]: 
       item = players[id]["inventory"][x] 
       weapon = players[id]["weaponName"] 
       wStat = players[id]["weaponPT"] 
       armor = players[id]["armorName"] 
       aStat = players[id]["armorPT"] 
       hp = players[id]["hp"] 
       ATK = players[id]["ATK"] 
       if item.types == "weapon": 
        weapon = item.name 
        wStat = item.ATK 
        ATK += wStat 
        mud.send_message(id,"you equip %s" % weapon) 
        mud.send_message(id,"NEW ATK: %d" % ATK) 
       elif item.type == "armor": 
        armor = item.name 
        aStat = item.DEF 
        hp += aStat 
        mud.send_message(id,"you equip %s" % armor) 
        mud.send_message(id,"NEW DEF: %d" % hp) 

       else: 
        mud.send_message(id,"not a vaid item type") 

      else: 
       mud.send_message(id,"you dont have this item") 

如果你認爲我需要添加任何更多的代碼是有意義的,請告訴我。

編輯:我想我發現問題在哪裏,但我不知道如何解決它我相信這是在接管命令和鋤頭它被添加到庫存它被添加爲一個字符串我不'知道如何解決這個問題

以下是錯誤消息告訴item是Unicode字符串,而不是類Weapon的實例代碼

elif command == "take": 
      x = params.lower() 
      rm = rooms[players[id]["room"]] 

      if rm["item"] == "yes": 
       if x in rm["itemName"]: 
        players[id]["inventory"][x] = x 
        del rm["itemName"][x] 
        mud.send_message(id, "you picked up %s" % x) 
        print players[id]["inventory"][x] 

       else: 
        mud.send_message(id,"You dont see that item") 
      else: 
       mud.send_message(id,"there is no item here") 
+0

請檢查玩家的物品是如何附加東西的 - 可以是字符串而不是物體? –

+0

使用「print」語句來查看'players [id] [「inventory」]中的內容,看起來這不是您期望的對象。 – salparadise

+0

您提供的代碼未顯示如何將值分配給玩家的廣告資源。更一般地說:我強烈建議你通過[Code Review Stack Exchange](http://codereview.stackexchange.com/)運行你的代碼。你目前的設計存在一些相當嚴重的問題,這會使進一步的開發變得非常困難。 – duskwuff

回答

1

因此,當您嘗試訪問item.types時出現錯誤。

N.B.而且下一個條件應該是elif item.types == "armor":(缺少s)。

1

面向對象編程中的「難聞的氣味」之一是自己檢查對象的類型。如果您正在檢查類型,那麼您很有可能改變實現設計的方式。

在這種情況下,我想建議你創建播放機的方法稱爲equip(self, obj)set_weapon(self, obj)set_armor(self, obj),並創建各種對象的方法稱爲equip_on(self, Player)unequip_on(self, Player)

然後你就可以瓜分權力和責任,根據等級和類型和對象知道哪些事情:

  • Player.equip可以處理重量限制,並從包含它的room考慮的對象。
  • Weapon.equip_on會知道它是一種武器,並在Player上調用適當的方法。
  • Player.set_weapon會知道它必須先卸載現有的武器。
  • Weapon.unequip_on如果被詛咒可能會拒絕未裝備。

如果您正確實施您的方法,它們中的每一個都將顯得簡單明瞭,但它們每次都會爲圖片添加更多信息。這雙重調度是一種快速,簡單的方式來處理類型信息,而不必在整個代碼中散佈if type(obj) ==聲明。

+0

恩你可以展示一個exampleright現在我的整個球員是基於一個字典,我需要把它變成一個類,我會在哪裏插入這個代碼到命令,我真的需要一個新的示例im到這邊東西 – Arcxes

+0

這種事情在OO編程書籍中經常被使用是有原因的。它實際上是爲它而做的!也就是說,我會嘗試創建一個示例並編輯我的答案。 –

+0

好的,謝謝它會真的幫助身份證欣賞它對不起,如果我拼寫錯誤的東西懶惰 – Arcxes