2

全部。

我目前正在尝试使用 cPickle 为我的 Roguelike 创建一个“save_game”功能。

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

这是 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()

我这样做是否正确,或者这一切都是低音?哈哈

4

1 回答 1

2

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

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 或返回。祝你游戏好运!

于 2012-12-10T16:58:51.893 回答