我用if语句重新启动一个函数有问题

2024-06-11 07:12:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我对编程很陌生,有一段时间我一直在做一个太空入侵者游戏。但是现在我遇到了一个问题,为了使用game Over函数重新启动游戏。如果我是正确的,其中一个方法是使用一个“If”问题(在我的例子中是一个按钮),如果答案是yes,则再次调用SpaceInvader()。但结果是,它没有重新启动整个游戏,而是在第一个SpaceInvader()上面运行函数。你知道吗

我不知道你是否能理解这些变量,因为它是用西班牙语写的,但下面是按钮的代码:

def boton(mensaje,posx,posy,ancho,alto,ColorA,ColorDis,accion=None):
mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()

if posx+ancho > mouse[0] > posx and posy+alto > mouse[1] > posy:
     pygame.draw.rect(ventana,ColorA,(posx,posy,ancho,alto))
     if click[0] == 1 and accion != None:
        accion()

else:
    pygame.draw.rect(ventana,ColorDis,(posx,posy,ancho,alto))

miniTexto = pygame.font.Font("prisma/Prisma.ttf",20)
textSurf, textRect = textos(mensaje, miniTexto)
textRect.center = ( (posx+(ancho/2)), (posy+(alto/2)) )
ventana.blit(textSurf, textRect)

这是游戏结束功能:

def gameOver():
if Perdiste==True:
    for evento in pygame.event.get():
        if evento.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.set_caption("Space Invader")
    ventana.blit(ImagenFondo,(0,0))
    miFuente2 = pygame.font.Font("prisma/Prisma.ttf",70)
    Texto2 = miFuente2.render("Game Over",0,(green))
    ventana.blit(Texto2,(240,170))

    boton("Inicio",275,320,150,50,bright_green,green,SpaceInvader)
    boton("Cerrar",500,320,150,50,bright_red,red,quit)


    pygame.display.update()

这是主代码:

def SpaceInvader():
global pausa
pausa

global puntos
puntos = 0

pygame.mixer.init()
pygame.display.set_caption("Space Invader")

pygame.mixer.music.load("Musica/Tha Aphex Twin.mp3") #Musica
pygame.mixer.music.play(3)

miFuenteSistema = pygame.font.Font("prisma/Prisma.ttf",40)
Texto = miFuenteSistema.render("Fin del juego",0,(green))

jugador = Nave.nave_espacial(ancho,alto)
cargarEnemigos()


enJuego = True #Sirve para determinar si el jugador esta vivo, en este caso el juego sigue en progreso

reloj =pygame.time.Clock()

while True:

    reloj.tick(60)


    tiempo = pygame.time.get_ticks()/1000
    for evento in pygame.event.get():
        if evento.type == QUIT:
            pygame.quit()
            sys.exit()
        if enJuego==True:

            if evento.type==pygame.KEYDOWN:
                keys = pygame.key.get_pressed()
                if keys[K_LEFT]:
                    jugador.movimientoIzquierda()

                if keys[K_RIGHT]:
                    jugador.movimientoDerecha()

                if evento.key ==pygame.K_p:
                    pausa = True
                    pausa1()

                elif evento.key ==K_SPACE:
                    x,y = jugador.rect.center
                    jugador.disparar(x,y)

    ventana.blit(ImagenFondo,(0,0))
    score(puntos)

    jugador.dibujar(ventana) #Aca imprime por pantalla los objetos

    if len(jugador.lista_disparos)>0:
        for x in jugador.lista_disparos:
            x.dibujar(ventana)
            x.Trayectoria()
            if x.rect.top<-10:
                jugador.lista_disparos.remove(x)
            else:
                for enemigo in listaEnemigo:
                     if x.rect.colliderect(enemigo.rect):
                        listaEnemigo.remove(enemigo)
                        jugador.lista_disparos.remove(x)
                        global puntos
                        puntos = puntos+100

    if len(listaEnemigo)>0:
        for enemigo in listaEnemigo:
            enemigo.comportamiento(tiempo)
            enemigo.dibujar(ventana)

            if enemigo.rect.colliderect(jugador.rect):
                jugador.destruccion()
                enJuego = False
                detenerTodo()

            if len(enemigo.lista_disparos)>0:
                for x in enemigo.lista_disparos:
                    x.dibujar(ventana)
                    x.Trayectoria()
                    if x.rect.colliderect(jugador.rect):
                        jugador.destruccion()
                        enJuego = False
                        detenerTodo()

                    if x.rect.top>900:
                        enemigo.lista_disparos.remove(x)
                    else:
                        for disparo in jugador.lista_disparos:
                            if x.rect.colliderect(disparo.rect):
                                jugador.lista_disparos.remove(disparo)
                                enemigo.lista_disparos.remove(x)

    if enJuego==False:
        pygame.mixer.music.fadeout(3000) #La musica se atenue por 3 segundos y luego se detenga
        ventana.blit(Texto,(290,170))
        global Perdiste
        Perdiste = True
        gameOver()

    pygame.display.update()

简介() 太空入侵者()


Tags: inrectforifpygamelistaaltoposx
1条回答
网友
1楼 · 发布于 2024-06-11 07:12:08

我没试过。但似乎你仍然在你的while True:循环中。可能需要在if enJuego==False函数的末尾添加break语句。你知道吗

当你退出游戏循环,你可以添加任何你想要的。 或者将while循环更改为while enJuego==True:或(while enJuego:

相关问题 更多 >