function - cPickle 的问题

标签 function pickle missing-data saving-data state-saving

全部。

我目前正在尝试使用 cPickle 为我的 Roguelike 创建“save_game”函数。

save_game() 正确地 pickle 了游戏状态,但是如果我退出游戏,当我尝试重新打开已保存的游戏时,load_game() 函数断然拒绝承认 pickle 文件存在(它只是告诉我没有保存的数据加载)。

这是 save_game():

def save_game():
#Write the game data to a cPickled file
f = open('savegame', 'wb')
cPickle.dump('map',f, protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump('objects',f, protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump('player_index',f, protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump('stairs_index', f, protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump('inventory',f, protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump('game_msgs',f, protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump('game_state',f, protocol=cPickle.HIGHEST_PROTOCOL)
cPickle.dump('dungeon_level',f, protocol=cPickle.HIGHEST_PROTOCOL)
f.close()

这是 load_game():

f = open('savegame', 'rb')
cPickle.load(f)

f.close()

我这样做是否正确,还是都是低音问题? 哈哈

最佳答案

您缺少的最重要的事情是 pickle.load() 需要将加载的内容分配给某些内容。我的建议是将您想要保存的所有内容放入一本字典中, pickle 该字典,然后取消 pickle 它:

saveData = {'map': mapData,
            'objects': objectData}
pickle.dump(saveData, f, -1)

然后在load_game()中:

f = open...
saveData = pickle.load(f)
f.close()
mapData = saveData['map']
objectData = saveData['objects']

顺便说一句 - 我建议不要直接调用 cPickle,尤其是在调试时 - 更容易看到 pickle 的任何错误,然后仅在一切正常时才切换到 cPickle。你也可以这样做:

try:
   import cPickle as pickleMod
except ImportError:
   import pickle as pickleMod

那么无论你使用什么风格的 python,你的程序都会工作(尽管速度更慢),并且当你完成编程时,它可以更轻松地从 pickle 切换到 cPickle 或返回。祝游戏顺利!

关于function - cPickle 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13796487/

相关文章:

pandas - 如何按 'pandas' 中的列获取缺失/NaN 数据的汇总计数?

r - 计算行意味着仅针对在 R 中具有多个数据点的行

javascript - 为什么这个动画功能不起作用?

python - 我可以从 print 语句调用 Python 中的函数吗?

设置默认函数变量值的 JavaScript 方法

python - 如何更改和重新选择 python 中的值

python - 为什么不用 pickle 而不是 struct?

python - 具有潜在缺失值的多重不等式 (a < b < c...)

javascript - 如何调用 javascript 函数并从 XAML/Silverlight 传递值?

python - Pickle 和 pypyodbc 光标