1

泥を作ろうとしていますが、装備コマンドを作成しているときにこのエラーに遭遇しました。

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

意味をなすためにさらにコードを追加する必要があると思われる場合は、教えてください。

編集:問題がどこにあるかを見つけたと思いますが、それを修正する方法がわかりません。それはtakeコマンドにあり、インベントリに追加されていると思います。それは文字列として追加されています。方法はわかりませんこれを修正

ここにコードがあります

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

2 に答える 2

1

エラー メッセージは、それitemが unicode 文字列であり、 class のインスタンスではないことを示していますWeapon

そのため、アクセスしようとするとitem.typesエラーが発生します。

注意: 次の条件がelif item.types == "armor":(missing s) である必要もありません。

于 2016-02-24T04:48:21.810 に答える
1

OO プログラミングの「悪臭」の 1 つは、オブジェクトの型を自分でチェックすることです。型をチェックしている場合は、設計の実装方法を変更する必要がある可能性が高くなります。

この場合、 、 、 という Player メソッドを作成し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) ==は、コード全体にステートメントを散りばめずに、型情報をすばやく簡単に処理する方法です。

于 2016-02-25T01:49:12.227 に答える