2012-12-10 3 views
2

모두.cPickle 관련 문제

저는 현재 Roguelike의 'save_game'기능을 만들기 위해 cPickle을 사용하려고합니다.

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

내가 제대로이 일을하고 있는가, 아니면 모든베이스 ackwards입니까? lol

답변

2

가장 중요한 것은 pickle.load()가로드 된 것을 할당해야한다는 것입니다. load_game에서 다음

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

() : 내 조언은 unpickle 다음 사전을 하나의 사전, 피클에 저장하려는 모든 것을 넣어하는 것입니다 BTW

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

- 난 안 좋을 것 특히 디버깅 할 때 cPickle을 직접 호출하면 피클 오류를보고 모든 것이 작동 할 때만 cPickle로 전환하는 것이 훨씬 쉽습니다. 에 상관없이 작업중인 파이썬 어떤 맛

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

다음 프로그램이 (더 느리게 불구하고) 작동합니다, 그것은 다시의 cPickle하거나 피클 전환하기가 쉬워집니다 : 당신이 뭔가를 할 수 없었다 프로그래밍이 끝나면 게임에 행운을 빌어 요!

+0

우우, 고마워! 내가 약간의 변경을하면 파일을 저장해야하지만, 이제 'mapData'에 대한 전역이 정의되지 않았다고 알려줍니다. save_game과 load_game 모두에서 글로벌화를 시도했지만 어느 것도 작동하지 않는 것 같습니다. –

+0

mapData는지도 데이터가 저장된 개체에 대한 홀더 변수였습니다. '지도'입니까? 그렇다면, { 'map': map}을 dict에 넣으십시오. 피클에 쓰는 것은 변수 이름이 아닌 실제 객체입니다. –

+0

작동 했습니까? 이 대답이 받아 들여질만한 가치가 있다고 생각한다면 궁금합니다. –