2017-12-27 5 views
-1

こんにちは私はPythonでテキストの冒険に取り組んでいます。ゲームは大きなものになっていますので、pickleで保存するようにしました。場所、金、在庫を.txtファイル に保存しますが、新しい変数をロードすることはできません。ロードと保存の機能はコードの最後にあります。 ありがとうございます。Python text game save feature

def do_save(self, arg): 
    savegame = open('savegame.txt', 'w') 
    pickle.dump(inventory, savegame) 
    pickle.dump(gold, savegame) 
    pickle.dump(location, savegame) 




def do_load(self,arg): 
    loadgame = open('savegame.txt', 'r') 
    inventory = pickle.load(loadgame) 
    location = pickle.load(loadgame) 
    gold = pickle.load(loadgame) 
+0

ファイルにダンプしたのと同じ順序でデータをロードしようとしましたか? – Tekay37

+0

ロード機能を呼び出した後にエラーメッセージが表示されますか? – yarwest

答えて

1

このコードの最初の問題は、あなたがストリームが開いたままになりますので、(となります)savegame.close()

第二の問題の嘘を使用して、それを閉じることを忘れないように決して、メモリの問題につながる可能ファイルを閉じることがないということですファイルが開かれている途中で。 Pickleはバイナリで読み書きするので、バイナリモード(wrの代わりにwbrbの代わりに)を使用してファイルを読み書きする必要があります。

次のセクションでは、このセクションはより多くの提案であり、あなたが持っている問題を解決するために必要ではありません。 1つのファイルに複数のアイテムを漬けすることは可能ですが、簡単に解決策はただ1つのオブジェクトにそれらを置くかもしれないが、例えば、すべての3つの値のタプル:

def do_save(self, arg): 
    saveGame = open('savegame.txt', 'wb') 
    saveValues = (inventory, gold, location) 
    pickle.dump(saveValues, saveGame) 
    saveGame.close() 

def do_load(self, arg): 
    loadGame = open('savegame.txt', 'rb') 
    loadValues = pickle.load(loadGame) 
    inventory = loadValues[0] 
    gold = loadValues[1] 
    location = loadValues[2] 
    loadGame.close() 

は、この解決策は、それを考慮少ないリソース重いですファイルを一度読み書きすることができ、ファイルストリームを短時間オープンすることができます。

0

保存したすべてのデータを1回だけ酸洗します。

savegameDict['inventory'] = inventory 
savegameDict['gold'] = gold 
savegameDict['location'] = location 
pickle.dump(savegameDict, savegame) 

ちょうど読み込みのためにディクテーション全体をピックルします。

savegameDict = pickle.load(loadgame) 

はまた、ピクルスの書き込みなどwbrbとバイナリモードを使用してファイルを開き、バイナリではなくテキストを読み込みます。