全部。
我目前正在尝试使用 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/