Python 在构建游戏及其关卡时如何处理兼容性

Python 在构建游戏及其关卡时如何处理兼容性,python,pygame,pickle,compatibility,Python,Pygame,Pickle,Compatibility,我正在使用pygame制作一个关于推箱子的3d益智游戏。构建这些级别需要一些时间,我使用pickle存储它们: pickle.dump([level_name,level_size,player,camera,boxes], f, protocol=-1) 这里的“框”是级别中所有框的列表,这些框是具有多个属性和方法的对象 class Box: def __init__(self,x,y,z,pushable=True,color=(200,100,50)): self

我正在使用pygame制作一个关于推箱子的3d益智游戏。构建这些级别需要一些时间,我使用pickle存储它们:

pickle.dump([level_name,level_size,player,camera,boxes], f, protocol=-1)
这里的“框”是级别中所有框的列表,这些框是具有多个属性和方法的对象

class Box:
    def __init__(self,x,y,z,pushable=True,color=(200,100,50)):
        self.x, self.y, self.z = x, y, z
        self.pushable = pushable
        self.color=color

    def draw(self): 
       #....
当然,最好完成游戏代码,然后完成所有关卡,但我希望能够在进行时添加游戏机制

问题是,例如,当我决定框需要有额外的属性,如“可见”和“浮动”时。添加这些属性后,我的新代码可能会说:

for b in boxes:
    if b.visible: b.draw()
现在我的旧关卡不起作用了,因为pickle版本仍然有缺少“visible”属性的旧box对象

我当前的解决方案是假设所有旧长方体对象都可见,如下所示:

for b in boxes:
    if (not hasattr(b,'visible')) or b.visible: b.draw()
然而,随着代码的增长,这些快速修复感觉不可持续


有没有一种标准的方法可以在不重做所有级别的情况下处理此类兼容性问题?

我会这样做:

我会通过使用继承来扩展您的框,这样您就有了标准框和增强框。这样,您的游戏可以同时加载这两个类(因为原来的box类仍然有效)

我还将在增强的box类上编写一个方法,该方法可以获取一个旧的box对象,复制属性并返回一个增强的box实例

最后,我将编写一个脚本来加载带有旧框的pickle文件,并将它们转换为继承的类,然后重新保存

因此,当您想再次扩展您的长方体模型时,请执行相同的操作。。。继续,一个新类和一个升级脚本

当您最终准备好时,您可以重构并删除继承层