想知道是否有办法转到 def 函数之后的 def 函数

Wondering if there is a way to go to a def function that comes after a def function

所以我是 python 的新手,但我想知道是否有办法退出已定义的函数和 return 我试图退出的函数之后的已定义函数的

我尝试学习一些执行此操作的函数,但还没有找到

当我按下 C 键时,我正在尝试使一个选项功能 returns 到

之后的游戏循环

这是我的代码我有问题-

def options():
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_b:
                    paused = False
                    playing = True
                    return
                if event.key == pygame.K_c:
                    playing = True
                    print("Continue")
                    game()
                if event.key == pygame.K_ESCAPE:
                    return
                
                    

                elif event.key == pygame.K_q:
                    print("Quitting game...")
                    time.sleep(3)
                    pygame.quit()
                    quit()
                elif event.key == pygame.K_f:
                    choices()

             

            screen.fill(white)
            pygame.mixer.music.pause()
            totalText = set_text("Options", 400, 250, 60)
            
            pausecon = controls2("Press C to continue", black)
            b = controlsr("Press B to go back to previous screen",black)
            newpa = controls3("Press F to go back to choices or Press Q to quit",black)
            screen.blit(totalText[0], totalText[1])
            pygame.display.update()
        


        pygame.display.update()

当用户点击“def option():”之后的 C 键时,我试图进入游戏循环:

def game():
    while not paused:
        
        clock = pygame.time.Clock()
        #circles = pygame.sprite.Group(Circle((600, 0), screen))

        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    quit()
                if event.type == pygame.VIDEORESIZE:
                    print("Resized window")
                    screen = pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE)


                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_p:
                        paused == True
                        playing == False
                        print("Paused")
                        pygame.mixer.music.play(1)

                        pause()
                    if event.key == pygame.K_ESCAPE:
                        paused == True
                        playing == False
                        print("Paused")
                        pause()
                    if event.key == pygame.K_SPACE:
                       print("shot")
                       attacking.play()
                       screen.blit(attack, (x,y) )

                    if event.key == pygame.K_LEFT:
                        x_change = -1
                        y_change = 0
                    if event.key == pygame.K_RIGHT:
                        x_change = 1
                        y_change = 0
                    if event.key == pygame.K_UP:
                        x_change = 0
                        y_change = -1
                    if event.key == pygame.K_DOWN:
                        x_change = 0
                        y_change = 1
                    if event.key == pygame.K_a:
                        x_change = -1
                        y_change = 0
                    if event.key == pygame.K_d:
                        x_change = 1
                        y_change = 0 
                    if event.key == pygame.K_w:
                        x_change = 0
                        y_change = -1
                    if event.key == pygame.K_s:
                        x_change = 0
                        y_change = 1
                elif event.type == pygame.KEYUP:
                    if event.key == pygame.K_LEFT:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_RIGHT:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_UP:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_DOWN:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_a:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_d:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_w:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_s:
                        x_change = 0
                        y_change = 0
                if x_change >= 800:
                    x_change < 800


        if x >= width or x < 0 or y >= height or y < 0:
            print("Barrier")
            message("Barrier",red)
            pygame.display.update()
        
        x += x_change
        y += y_change


        #makes var music be repeated thru game
        #pygame.mixer.music.play(-1)
        screen.fill((135, 206, 235))

            

        
        
        #pygame.draw.circle(screen, (0, 0, 150), (x, y), r)

        #SPRITES AND CONTROL TEXT IN GAME
        controls("P/Esc = pause",green)
        
        attacksprite = screen.blit(attack, (randx, randy))
        sprite = screen.blit(image, (x, y))
        topRight("Dodged: ", black)


        pygame.display.flip()
        clock.tick(60)
        pygame.display.update()

我收到错误信息 -

游戏()

NameError: 名称 'game' 未定义。您的意思是:'pygame'?

感谢您的宝贵时间

函数定义的顺序在 python 中无关紧要。您的错误与此无关。这个简单的测试证明了这一点。

def test1():
    return test2()
def test2():
    return 1
test1()

您要找的是state machines。在你的情况下,你可以这样做:

currentState = OPTIONS
OPTIONS, PLAYING, PAUSE = range(3)

def options(events):
    for event in events:
        if event.key == pygame.K_c:
            playing = True
            currentState = PLAYING

def game(events):
        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_p:
                    playing = not playing
                #maybe add on options to set the state to OPTIONS

        currentState = PLAYING if playing else PAUSE
            
        #logic and stuff
        #clear display
        #drawing code
        #update display



while True:
    events = pygame.event.get()
     if currentState == OPTIONS:
         options(events)
     if currentState == PLAYING:
         game(events)
     if currentState == PAUSED:
         #and so on
     

         

另外,像上面的代码一样只调用一次pygame.event.get()。在整个应用程序中只调用一次 pygame.display.update()pygame.display.flip()