虽然true循环给我递归错误

时间:2018-09-28 00:58:25

标签: python-3.x recursion crash pygame runtime-error

我正在为我的CompSci课程使用pygame创建游戏。游戏运行良好,但是现在我尝试执行重新启动功能,并且遇到很多错误。

我正在尝试做的基本概述是:

first = True

def check(count):
    if count == 1000:
        return True
    else:
        return False

def start():
    # MAIN MENU
    print ("start")
    count = 0
    while True:
        count += 1
        if check(count) == True:
            Game()

def Game():
    count = 0
    print("Game")
    while True:
       # GAMELOOP
       count += 1
       if check(count) == True:
           restart()

def restart():
    count = 0
    print ("Restart")
    while True:
       # RESTART
       count += 1
       if check(count) == True:
           start()

if first == True:
    first = False
    start()

但是,每当我运行此命令时,python最终都会崩溃:

RecursionError: maximum recursion depth exceeded while calling a Python object

我不确定该如何解决。我希望有人可以建议另一种方法来做同样的事情或我做错了的事情。

实际的重启和菜单功能:

def rest(): #Main Menu
 while True:
    pygame.display.update()
    menu.draw()
    if pygame.mouse.get_pressed()[0]:
            x, y = pygame.mouse.get_pos()
            if x >= 255 and x <= 355 and y >= 400 and y <= 450:
                game()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit() 

def game(): #Gameloop
    while True:
        if bottom.time == 0 or bottom.time < 0 :
            game_screen.fill((0, 0, 0))
            restart()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

def restart():
 while True:
    pygame.display.update()
    menu.restart()
    if pygame.mouse.get_pressed()[0]:
            x, y = pygame.mouse.get_pos()
            if x >= 255 and x <= 355 and y >= 400 and y <= 450:
                game_screen.fill((0, 0, 0))
                rest()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

1 个答案:

答案 0 :(得分:0)

您是否有一系列调用彼此的函数来创建indirect recursion

start()计数到1000,然后调用Game(),计数再次计数到1000,然后调用restart(),计数也等于1000,然后调用start(),关闭递归循环。一旦没有停止条件,您的递归就会一直进行到达到python递归堆栈的深度限制为止,然后您就会得到异常。

作为解决方案,您需要在其中一个函数中创建一个停止条件。

修改

我不完全了解pygame,但据我从附加代码中了解到,for函数中的rest()(用于检查事件)必须执行{ {1}}函数返回,这永远不会发生。您可以在game()行之前的行中测试此hyphotesis打印内容。重启功能也是如此。