Menu
CoddyTech

Una función de reinicio

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

Juega una partida, consigue algunos puntos, pierde y pulsa R. La nueva partida comienza con la puntuación anterior. Todos los valores que cambien durante una partida deben volver a su valor inicial, y a menudo se olvida alguno.

Coloca todos los valores iniciales en una función y llámala tanto antes de la primera partida como al pulsar R:

def reset():
    global player, rock, score
    player = pygame.Rect(220, 300, 40, 40)
    rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
    score = 0


reset()

La línea global es importante. Una variable que asignas dentro de una función pertenece a esa función, a menos que indiques lo contrario. Sin global, score = 0 crearía una nueva variable local score que desaparecería cuando terminara la función, y la puntuación del juego no cambiaría.

Ahora, el inicio de una partida se escribe una sola vez. Cuando más adelante agregues un valor, como las vidas, lo agregas en un solo lugar y lo obtienen tanto la primera partida como cada partida nueva.

challenge icon

Desafío

Intermedio
  1. Escribe reset() para establecer los valores iniciales de player, rock y score, con global player, rock, score como su primera línea.
  2. Llama a reset() una vez antes del bucle, en lugar de las tres líneas que les asignan valores.
  3. Al pulsar R, llama a reset() 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 event.key == pygame.K_r and state == "over":
                player.x = 220
                rock.y = -24
                rock.x = random.randint(0, 456)
                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)))
            hint = font.render("Press R to play again", True, (240, 240, 240))
            screen.blit(hint, hint.get_rect(center=(240, 200)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Reglas del juego

Practica por tu cuenta: Playground de Pygame