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() がロードされたものを何かに割り当てる必要があるということです。私のアドバイスは、保存したいものすべてを 1 つの辞書に入れ、その辞書をピクルしてからアンピクルすることです。

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 に答える