В то время как истинные циклы дают мне ошибки рекурсии - PullRequest
0 голосов
/ 28 сентября 2018

Я создаю игру с pygame для моего курса CompSci.Игра работает хорошо, но теперь я пытаюсь сделать функцию перезапуска, и я получаю много ошибок.

Основная схема того, что я пытаюсь сделать, это:

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 голосов
/ 28 сентября 2018

Есть ли у вас последовательность функций, вызывающих друг друга, создающих косвенную рекурсию .

start() считает до 1000, а затем вызывает Game(), что снова до 1000, а затемвызывает restart(), что также считается до 1000, а затем вызывает start(), закрывая цикл рекурсии.Если у вас нет условия остановки, ваша рекурсия продолжается до тех пор, пока не достигнет предела глубины стека рекурсии python, и вы получите исключение.

В качестве решения вам необходимо создать условие остановки внутри одной из этих функций.

Редактировать

Я точно не знаю Pygame, но, насколько я понимаю из дополнительного кода, к функции for in rest() (котораяпроверяет события), необходимо, чтобы функция game() возвращала, чего никогда не происходит.Вы можете проверить эту гипотезу, напечатав что-нибудь в строке перед строкой for.То же самое относится и к функции перезапуска.

...