Menu
CoddyTech

Pulsa R para volver a jugar

Parte de la sección Reglas del juego del Journey de Pygame de Coddy. Lección 3 de 29.

Cuando termina la partida, el jugador quiere volver a jugar sin reiniciar el programa. Añade una línea a la pantalla de fin de partida y una tecla que inicie una nueva partida:

if event.key == pygame.K_r and state == "over":
    player.x = 220
    rock.y = -24
    rock.x = random.randint(0, 456)
    state = "play"

Volver a establecer el estado en "play" no es suficiente. La roca todavía está tocando al jugador, así que el siguiente fotograma terminaría la partida de nuevo. Coloca los elementos que se movieron de vuelta en las posiciones iniciales de una nueva partida.

Este es el mismo patrón que el del menú: una tecla, una comprobación del estado actual y un nuevo estado.

challenge icon

Desafío

Fácil
  1. En la pantalla de fin de partida, debajo de Game over, muestra Press R to play again centrado en (240, 200).
  2. Cuando se pulse R y el estado sea "over": devuelve al jugador a x 220, la roca a y -24 con una x aleatoria de 0 a 456, y establece el estado en "play".

Pruébalo tú mismo

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
state = "menu"

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN and state == "menu":
                state = "play"

    if state == "play":
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.x -= 6
        if keys[pygame.K_RIGHT]:
            player.x += 6
        player.clamp_ip(screen.get_rect())

        rock.y += 4
        if rock.top > 360:
            rock.y = -24
            rock.x = random.randint(0, 456)
            score += 1
        if rock.colliderect(player):
            state = "over"

    screen.fill((30, 30, 46))
    if state == "menu":
        title = font.render("Meteor Dodge", True, (240, 240, 240))
        screen.blit(title, title.get_rect(center=(240, 140)))
        hint = font.render("Press Enter to play", True, (240, 240, 240))
        screen.blit(hint, hint.get_rect(center=(240, 200)))
    else:
        pygame.draw.rect(screen, (255, 196, 0), player)
        pygame.draw.rect(screen, (235, 80, 80), rock)
        score_text = font.render(f"Score: {score}", True, (240, 240, 240))
        screen.blit(score_text, (10, 10))
        if state == "over":
            message = font.render("Game over", True, (240, 240, 240))
            screen.blit(message, message.get_rect(center=(240, 160)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Todas las lecciones de Reglas del juego

Practica por tu cuenta: Playground de Pygame