【问题标题】:Pickle user inputs - Python 3 [closed]Pickle 用户输入 - Python 3 [关闭]
【发布时间】:2015-05-30 19:46:56
【问题描述】:

我很绝望,因为我已经尝试了很长时间。

我正在制作一个文本冒险,其中一些用户输入选择玩家的 hp、dmg,你可以命名它。

我想做一个保存功能,但是每次加载,播放器都有默认参数。

例子:

class player:
    def __init__(self, hp, dmg):
        self.hp = hp
        self.dmg = dmg

def save(obj):
    save_file = open('C:\\Users\\XXXXX XXXX\\Desktop\\Game\\save.dat', 'wb')
    pickle.dump(obj, save_file)
    save_file.close()

def load():
    load_file = open('C:\\Users\\XXXXX XXXX\\Desktop\\Game\\save.dat', 'rb')
    loaded_game_data = pickle.load(load_file)
    return loaded_game_data

def start():
    player.hp = input('Player Hp')
    player.dmg = input('Player Dmg')

player = player(0, 0)

start()

请不要只告诉我我做错了什么,还要告诉我如何做对。我真的很需要这个 - 谢谢!

我使用以下内容加载播放器:

>>>print(player.hp)   # To make sure the HP is 0
0
>>>player.hp = 100    # I now change the HP to 100
>>>save(player)       # Saving the player with 800 HP and 0 DMG
                      # Restarting Python
>>>load()             # Loading the player
>>>print(player.hp)   # Check if the HP is 100 as I saved it.
0                     # The HP is 0...
                      # I expected 100 as I saved it.

【问题讨论】:

  • 您的预期行为是什么?您想在什么时候腌制值以及何时检索它们?
  • 只是给你一个小费。我看到您使用路径打开文件。如果您使用 r 选项,您可以确保将字符串作为原始输入。然后你不必转义反斜杠等。例如:open(r'C:\Program\File1.txt')
  • 你是如何重启这个脚本的?展示如何创建实例,如何使用saveload,以及如何运行脚本……然后停止它,我假设……然后重新启动它。您如何使用上述代码将对您需要做的事情产生影响,以使其做您想做的事——这从您的问题中不清楚。你越清楚你想做什么,你就会得到更好的答案。
  • 您在文件中使用player = player(0,0) 吗?如果是这样,您将用一个实例player 替换类player,因为它的属性值每次都为零。如果是这样,您应该将实例的名称更改为类名以外的名称。这很重要,因为pickle 通过引用导入类,因此每次都必须从类中导入和重新创建实例——而不仅仅是在不读取文件的情况下“重构”它。

标签: python pickle python-3.4


【解决方案1】:

以下运行良好。使用大写首字母重命名 Player 类以避免名称冲突。我在最后添加了一些测试调用,并且播放器加载了预期的(非默认)统计信息。

import pickle

class Player:
    def __init__(self, hp, dmg):
        self.hp = hp
        self.dmg = dmg

def save(obj):
    save_file = open('save.dat', 'wb')
    pickle.dump(obj, save_file)
    save_file.close()

def load():
    load_file = open('save.dat', 'rb')
    loaded_game_data = pickle.load(load_file)
    return loaded_game_data

def start():
    player.hp = input('Player Hp: ')
    player.dmg = input('Player Dmg: ')

player = Player(0, 0)

start()
save(player)
loaded_player = load()
print loaded_player.hp, loaded_player.dmg

【讨论】:

  • 非常感谢!我已经为此工作了好几天了,多亏了你,它终于可以工作了! :-)
  • 很高兴我能帮上忙!请问mark the answer as accepted好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2014-11-08
相关资源
最近更新 更多