如何在Python中正确实现游戏管理器

如何在Python中正确实现游戏管理器,python,pygame,coding-style,Python,Pygame,Coding Style,我对如何用程序的变量和常量正确实现游戏管理器类型的类(控制程序的大部分方面,如主循环)感到困惑。据我所知,变量和常量应该在主函数中定义,然后以某种方式传递给游戏管理器。然而,这带来了一些障碍。到目前为止,我提出了3种选择: 在主函数中定义变量并将其传递给类(大多数标准) 在类本身中定义变量 class Game: def __init__(self): self.screen_size = 10 self.game_speed = 30 def mai

我对如何用程序的变量和常量正确实现游戏管理器类型的类(控制程序的大部分方面,如主循环)感到困惑。据我所知,变量和常量应该在主函数中定义,然后以某种方式传递给游戏管理器。然而,这带来了一些障碍。到目前为止,我提出了3种选择:

  • 在主函数中定义变量并将其传递给类(大多数标准)

  • 在类本身中定义变量

    class Game:
        def __init__(self):
            self.screen_size = 10
            self.game_speed = 30
    
    def main():
        game = Game()
        game.mainloop()
    
    if __name__ == "__main__":
      main()
    
  • 使变量全球化

    SCREEN_SIZE = 10
    GAME_SPEED = 30
    
    class Game:
        def __init__(self):
            pass
    
    def main():
        game = Game()
        game.mainloop()     
    
    if __name__ == "__main__":
      main()
    
  • (可能选项)根本没有游戏管理器类

  • 第一个问题是,较大的程序有更多的变量,因此有更多的信息要传递给类。第2条与类的观点背道而驰。第三个似乎是坏习惯。有没有我遗漏的替代方案?

    以下是我将如何做到这一点:

    class Game(object):
        def __new__(cls):  
            if not hasattr(cls, 'instance'):
                cls.instance = super(Game, cls).__new__(cls)
            return cls.instance
    
        screen_size = 10
        game_speed = 30
    

    然后你可以在你的
    main()

    中举例说明这可能是我帮助某人提出的问题的重复,这些问题与他刚才正在编写的类似于单身汉的代码有关。他的问题(以及他引用的工作代码)就在这里,可以证明对您的原因很有用:在这种情况下,他有两个控制游戏的主要类(导演类和场景类)。我的目标是只拥有一个,因为这似乎比拥有两个可以组合的独立类更有效、更符合逻辑。使用全局常量(不可变)是完全可以接受的。当您开始使用全局变量(可变)时,您会遇到麻烦。
    class Game(object):
        def __new__(cls):  
            if not hasattr(cls, 'instance'):
                cls.instance = super(Game, cls).__new__(cls)
            return cls.instance
    
        screen_size = 10
        game_speed = 30