Python泥装备命令
Python mud equip command
我正在尝试制作泥浆,但是在制作装备命令时我 运行 遇到了这个错误。
if item.types == "weapon":
AttributeError: 'unicode' object has no attribute 'types'
我想修复我的代码,以便它允许用户输入装备剑,它会在 his/her 库存中搜索该项目并应用统计信息。
这是我的商品代码
#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")
错误消息表明 item
是一个 unicode 字符串,而不是 class Weapon
.
的实例
因此,当您尝试访问 item.types
时出现错误。
N.B。也不是下一个条件应该是elif item.types == "armor":
(缺少s
)。
OO 编程中的一个 "bad smells" 是自己检查对象的类型。如果您正在检查类型,您很有可能应该更改实现设计的方式。
在这种情况下,我建议您创建名为 equip(self, obj)
、set_weapon(self, obj)
、set_armor(self, obj)
的 Player 方法,并创建名为 equip_on(self, Player)
的各种对象方法和 unequip_on(self, Player)
。
那你就可以根据class和类型划分权限和责任,哪些对象知道哪些事情:
Player.equip
可以处理重量限制并从包含它的 room
中取出一个对象。
Weapon.equip_on
会知道它是武器,并在 Player
上调用适当的方法。
Player.set_weapon
会知道它必须首先取消装备现有武器。
Weapon.unequip_on
被诅咒可以拒绝脱装备
如果你正确地实施你的方法,每一种方法看起来都简单明了,但每次都会为图片添加更多信息。这种 double dispatch 是一种快速、简单的处理类型信息的方法,而无需在代码中散布 if type(obj) ==
语句。
我正在尝试制作泥浆,但是在制作装备命令时我 运行 遇到了这个错误。
if item.types == "weapon":
AttributeError: 'unicode' object has no attribute 'types'
我想修复我的代码,以便它允许用户输入装备剑,它会在 his/her 库存中搜索该项目并应用统计信息。
这是我的商品代码
#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")
错误消息表明 item
是一个 unicode 字符串,而不是 class Weapon
.
因此,当您尝试访问 item.types
时出现错误。
N.B。也不是下一个条件应该是elif item.types == "armor":
(缺少s
)。
OO 编程中的一个 "bad smells" 是自己检查对象的类型。如果您正在检查类型,您很有可能应该更改实现设计的方式。
在这种情况下,我建议您创建名为 equip(self, obj)
、set_weapon(self, obj)
、set_armor(self, obj)
的 Player 方法,并创建名为 equip_on(self, Player)
的各种对象方法和 unequip_on(self, Player)
。
那你就可以根据class和类型划分权限和责任,哪些对象知道哪些事情:
Player.equip
可以处理重量限制并从包含它的room
中取出一个对象。Weapon.equip_on
会知道它是武器,并在Player
上调用适当的方法。Player.set_weapon
会知道它必须首先取消装备现有武器。Weapon.unequip_on
被诅咒可以拒绝脱装备
如果你正确地实施你的方法,每一种方法看起来都简单明了,但每次都会为图片添加更多信息。这种 double dispatch 是一种快速、简单的处理类型信息的方法,而无需在代码中散布 if type(obj) ==
语句。