重置并重新启动pygame程序无效

问题描述

当要求用户重新启动时,我在pygame中重置游戏时遇到问题。该程序的构造如下:

import board as b

class Gui():
    def __init__(self):
        pygame.init()

        self.gamestate = b.GameState()

    def run(self):
        running = True
        while running:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_r:
                        running = False
                        pygame.quit()
                        Gui().run

if __name__ == '__main__':
    Gui().run()

用户尝试重新启动时,发生的情况是Gui关闭并且while循环按原样退出。然后,它将打开一个新窗口,但尚未清除游戏状态,因此我之前运行的游戏状态仍然存在。我以为self.gamestate = b.GameState()行会为我创建一个新的游戏状态,但事实并非如此。这是电路板文件中的一小段代码

class GameState:

    def __init__(self):
        self.board = s.start_position

调用它时,我认为它将板设置为开始位置,并将其所有参数设置为初始值,但是有些不正确,并且我已经有3天没有解决了。希望您能帮助我清除游戏状态并重新开始。

解决方法

您使系统过于复杂。您实际上正在做的是递归地实例化一个新的Gui对象和新的应用程序循环到一个现有的Gui对象和应用程序循环中。 如果GameState的实现正确,则足以创建一个新的GameState对象并继续现有的应用程序循环,而不必递归地创建一个新的Gui实例:

import board as b

class Gui():
    def __init__(self):
        pygame.init()

        self.gamestate = b.GameState()

    def run(self):

        running = True
        while running:

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                    pygame.quit()

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_r:
                        self.gamestate = b.GameState()

            # [...]

if __name__ == '__main__':
    Gui().run()

指令self.board = s.start_position不会创建新的板对象。 self.boards.start_position引用相同的对象。如果更改一个对象,则另一个对象似乎也以相同的方式更改,因为只有一个对象。
启动游戏时,您需要制作桌面对象的深层副本,或者在游戏重新启动时,需要重置对象。

一个解决方案可能是使用Python copy模块。 deepcopy可以创建对象的深层副本:

import copy
self.board = copy.deepcopy(s.start_position)`

注意,并非所有对象都可以复制。例如,pygame.Surface不能 deep 复制。