2016-02-24 2 views
0

Я пытаюсь сделать грязь, но при создании команды equip я столкнулся с этой ошибкой.Команда python mud equip

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") 

Если вы думаете, что мне нужно добавить любой больше кода для его смысла, пожалуйста, скажите мне.

EDIT: Я думаю, что нашел, где проблема, но я не знаю, как ее исправить. Я верю, что она находится в команде принятия и мотыгой, она добавляется в инвентарь, который добавляется как строка, знаю, как исправить эту

здесь код

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

Предоставленный вами код не показывает, как присвоены значения инвентарям игрока. В более общем плане: я настоятельно рекомендую вам запустить свой код из раздела [Review Review Stack Exchange] (http://codereview.stackexchange.com/). Есть некоторые довольно серьезные проблемы с вашим текущим дизайном, которые сделают дальнейшее развитие очень сложным. – duskwuff

ответ

1

сообщение об ошибке говорит, что item является юникод строки, а не экземпляр класса Weapon.

Таким образом, при попытке получить доступ к 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

um Можете ли вы показать экзамен, теперь весь мой плеер основан как словарь, мне нужно будет превратить его в класс, и где бы я вставлял этот код в команды, и мне действительно нужен пример im new с этой стороны материал – Arcxes

+0

Есть причина, почему такие вещи часто используются в книгах программирования OO. Это практически сделано для этого! Тем не менее, я попытаюсь обобщить пример и отредактировать свой ответ. –

+0

ok спасибо, что это действительно поможет id оценить это извините, если я пропустил вещи в ленивый – Arcxes

Смежные вопросы