0

我正在自学如何用 python 编写一个基本的游戏(基于文本 - 不使用 pygame)。(注意:我实际上并没有真正进入“游戏”部分,因为我想确保我首先弄清楚了基本的核心结构。)

我正试图弄清楚如何实现保存/加载场景,以便游戏会话可以在程序的信号运行之后持续存在。我做了一些搜索,一切似乎都指向酸洗或搁置是最好的解决方案。

我的测试场景是保存和加载一个类的单个实例。具体来说,我有一个名为 Characters() 的类,并且(为了测试)将该类的一个实例分配给一个名为 pc 的变量。Character 类的实例有一个名为 name 的属性,该属性最初设置为“DEFAULT”,但会在新游戏初始设置时根据用户输入进行更新。例如:

class Characters(object):
    def __init__(self):
        self.name = "DEFAULT"

pc = Characters()
pc.name = "Bob"

我还拥有(或将拥有)大量函数,这些函数使用分配给它们的变量来引用各种实例。例如,一个简单的例子可能是:

def print_name(character):
    print character.name

def run():
    print_name(pc)

run()

我计划有一个保存功能,它将用他们当前的信息(例如:更新的名称)打包 pc 实例(以及其他信息)。我还将有一个加载功能,允许用户玩一个保存的游戏而不是开始一个新游戏。根据我的阅读,负载可以像这样工作:

*assuming info was saved to a file called "save1"
*assuming the pc instance was shelved with "pc" as the key

import shelve

mysave = shelve.open("save1")
pc = mysave["pc"]

我的问题是,有没有办法让搁置加载“记住”与实例关联的变量名,并自动执行 << pc = mysave["pc"] >> 步骤?或者让我将该变量名称存储为字符串(例如作为键)并以某种方式使用该字符串创建具有正确名称(pc)的变量?

我将需要“保存”很多实例,并且可以通过循环自动执行该过程,但我不知道如何自动卸载到特定的变量名。我真的必须单独明确地重新分配每个人吗?我需要将实例分配回适当的变量名,因为我有一堆核心函数,它们使用变量名引用特定实例(如我上面给出的示例)。

想法?这是可能的,还是我没有看到完全不同的解决方案?

谢谢!

~肋骨

4

1 回答 1

0

当然,可以做类似的事情。由于架子本身就像一本字典,只需将所有字符实例保存在其中的真实字典实例中,使用它们的变量名称作为键。例如:

class Character(object):
    def __init__(self, name="DEFAULT"):
        self.name = name

pc = Character("Bob")

def print_name(character):
    print character.name

def run():
    print_name(pc)

run()

import shelve
mysave = shelve.open("save1")
# save all Character instances without the default name
mysave["all characters"] = {varname:value for varname,value in
                                globals().iteritems() if
                                    isinstance(value, Character) and
                                    value.name != "DEFAULT"}
mysave.close()

del pc

mysave = shelve.open("save1")
globals().update(mysave["all characters"])
mysave.close()

run()
于 2013-05-31T00:23:04.703 回答