如何使用pickle保存程序中的所有对象?

2024-09-30 10:41:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我到处找泡菜的信息,我以为我已经找到了,但我有一点问题让它正常工作。在

所以我使用python3.3.1。我有一个有很多房间(大约200个)的pygame游戏,每个房间都是父类的自己的子实例,很多都有自己的变量来跟踪房间里发生的各种事情。当玩家从一个房间到另一个房间时,我当然希望玩家在保存游戏时保存对每个房间所做的更改。我有一个双重问题。在

所以我的工作大致如下:

import pickle
with gzip.GzipFile("Saved Games/"+file_name, 'wb') as output:
   pickle.dump(room001, output, pickle.HIGHEST_PROTOCOL)
   ...
   pickle.dump(room200, output, pickle.HIGHEST_PROTOCOL)
   pickle.dump(player, output, pickle.HIGHEST_PROTOCOL)

所以我想这样可以节省开支。但当我稍后加载时,使用:

^{pr2}$

一开始一切似乎都很好。它看起来没有问题,但是我注意到这个游戏有点奇怪。它好像没有使用从pickle加载的数据。在

例如,一个房间里可能有一些蜜蜂在飞。我进入房间,看到的蜜蜂是正常的,但当房间的事件函数试图让蜜蜂移动时,它们没有。 它看起来像这样:

def room001_events():

   room001.bee_pos_x += room001.bee_speed
   if room001.bee_pos_x < 0 or room001.bee_pos_x > 600:
       room001.bee_speed *= -1

在装载之前,蜜蜂会高兴地来回弹跳,但在装载之后,它们根本就不动了。所以我想知道我在加载过程中出了什么问题。函数正在被访问,当我打印出这些值时,它们似乎在变化,但是屏幕上的蜜蜂没有移动。在

另外,我想知道是否有某种方法可以迭代程序中的所有房间,而不必单独列出它们。我试过按照this question使用shelve,但它只是在加载时崩溃(据我所知,它似乎与表面有问题,因为它一直给我提供支持pygame.error.错误:display Surface退出,即使我从未调用pygame.退出()完全正确)。在


Tags: 函数pos游戏output玩家dumpprotocolpygame
1条回答
网友
1楼 · 发布于 2024-09-30 10:41:50

你的问题不是泡菜。您的问题是假设从pickle恢复房间的状态就足以让它在加载pickle时正常运行。我敢打赌你没有测试来验证这个假设。在

保存(pickle)实例时,其实例变量的值将作为pickle的一部分保存。当您重新加载它们时,通常不会调用它们的__init__()方法,这大概就是启动操作的方式。所以,你确定pickle中有足够的状态信息,可以让事情恢复到原来的状态吗?在

保存所有房间而不必单独列出它们的最简单方法是有一个包含这些房间的列表。然后,您的代码将引用(比如)rooms[100],而不是room100,您只需对rooms[]列表进行pickle,用一个语句将它们全部保存起来。在

相关问题 更多 >

    热门问题