我正在尝试在文本冒险中创建一个保存功能。 该函数必须为播放器保存一些变量和参数。
我曾试图谷歌并在论坛上提问,但我无法让它发挥作用。
整个代码在这里:http://pastebin.com/8Y3PNnRx
保存功能应将player = player('Niels', 'Knight, 0, 0, 0, 0, 0, 0, 1)
(第417行)和player.gold
和player.potion
等变量(第420行)保存在'C:\\Users\\XXXXX\\Desktop\\SmallDungeons\\save.dat'
感谢您的时间!
答案 0 :(得分:0)
您可以使用以下方式保存:
pickle.dump((player, player.gold, player.potion), 'C:\\Users\\XXXXX\\Desktop\\SmallDungeons\\save.dat')
并加载
input2 = open('C:\\Users\\XXXXX\\Desktop\\SmallDungeons\\save.dat','r')
data = pickle.load(input2)
player = data[0]
player.gold = data[1]
player.potion = data[2]
答案 1 :(得分:0)
对于最小的示例,我们在foo.py
中构建了一个类(这类似于您的类player
)。
# foo.py
class Foo(object):
def __init__(self, x):
self.x = x
def bar(self):
return self.x**2
现在我们导入它,并添加一些属性(这类似于你添加player.gold
),然后挑选类实例。当我们完成后,我们终止python解释器会话。
Python 2.7.9 (default, Dec 11 2014, 01:21:43)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from foo import Foo
>>> f = Foo(3)
>>> f.y = 10
>>>
>>> import pickle
>>> with open('foobar.pkl', 'w') as pik:
... pickle.dump(f, pik)
...
>>>
然后,我们重启会话,并加载pickle。
Python 2.7.9 (default, Dec 11 2014, 01:21:43)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> with open('foobar.pkl', 'r') as pik:
... f = pickle.load(pik)
...
>>> f.x
3
>>> f.bar()
9
>>> f.y
10
>>>
您将看到只保存类实例,即使添加的属性(如f.y)也会被保留。这是因为pickle
保留了对您的文件的引用(从哪里导入)以及任何添加的属性。你可以在pickle字符串中看到这个。
Python 2.7.9 (default, Dec 11 2014, 01:21:43)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from foo import Foo
>>> f = Foo(3)
>>>
>>> import pickle
>>> pickle.dumps(f)
"ccopy_reg\n_reconstructor\np0\n(cfoo\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'x'\np6\nI3\nsb."
>>>
>>> f.y = 10
>>> pickle.dumps(f)
"ccopy_reg\n_reconstructor\np0\n(cfoo\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'y'\np6\nI10\nsS'x'\np7\nI3\nsb."
我的建议是使用pickle
协议-1
,因为它会使咸菜更小。您可以将此标记添加到您使用的任何地点dump
或dumps
。
>>> pickle.dumps(f, protocol=-1)
'\x80\x02cfoo\nFoo\nq\x00)\x81q\x01}q\x02U\x01xq\x03K\x03sb.'