重置并重新启动pyGame程序不起作用

2022-02-22 00:00:00 python 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不创建新的Board对象。self.boards.start_position指的是同一个对象。如果您更改其中一个对象,则另一个对象似乎也会以相同的方式更改,因为只有一个对象。
您需要在启动游戏时制作棋盘对象的深度副本,或者需要在游戏重新启动时重置该对象。

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

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

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

相关文章