为了熟悉Python数据结构和流行模块,我正在设计一个RPG(是的,当时我认为这是一个新颖的想法)。我的'hero'类有两个属性,特别是在通过Pickle保存和加载我的游戏文件之前和之后表现不一致。我已经在我的代码中针对几个示例仔细验证了正确的语法,现在我确信在工作中必须存在一些我不理解的基本行为。 我的'hero'类的第一个属性是inventory,它初始化为一个空列表。第二个属性是设备,它是表格
的字典{'Mainhand': '', 'Offhand': '', ... etc.}
我可以通过将对象指定为此字典中设备插槽的值来装备和取消我的Gear类的实例,并且一切都很好用,直到我从加载的保存文件中尝试这些内容。如果我试着解开一些东西,代码行
hero.equipment[k] = ''
完全被忽略,没有错误消息或崩溃。我可以换档,但不能简单地取消任何插槽,就像我在保存/加载之前一样。
我不理解Pickle如何解压缩保存的对象词典?是什么让我的价值感觉如此......粘性?
EDIT :: 这些是根据启动时给出的英雄名称保存和加载我的文件的功能。
def save_game():
filename = str(hero.name) + ".pkl"
with open(filename, 'wb') as outfile:
pickle.dump(hero, outfile)
print("Progress saved.")
outfile.close()
def load_game():
global hero
filename = input("What did they call you?\n")
filename = str(filename) + ".pkl"
if os.path.exists(filename):
with open(filename, 'rb') as infile:
hero = pickle.load(infile)
print("Previous progress loaded.")
infile.close()
else:
print("You have no saved progress.")
这是取消我的项目的功能(适用于新文件,而不是加载文件)
def unequip(self, equipping_str, unequipping_obj):
if unequipping_obj not in hero.inventory:
hero.inventory.append(unequipping_obj)
ohAtkPenalty = 1
if equipping_str == 'Offhand':
ohAtkPenalty = 0.70
hero.melee_boost -= unequipping_obj.melee_atk * ohAtkPenalty
hero.magic_boost -= unequipping_obj.magic_atk * ohAtkPenalty
hero.health_regen -= unequipping_obj.health_regen
hero.mana_regen -= unequipping_obj.mana_regen
hero.equipment[equipping_str] = ''
print("You unequip your ", unequipping_obj.item_name, '.', sep='')
unequipping_obj.quantity += 1
答案 0 :(得分:0)
因为unequip()是一个英雄类的方法,所以对英雄属性的所有引用都应该写成'self。 ......',而不是'英雄。 ......” 解决方案比我预期的要少得多,但我非常感谢额外的目光。