2016-02-24 103 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