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.
Desafío
Intermedio- Escribe
reset()para establecer los valores iniciales deplayer,rockyscore, conglobal player, rock, scorecomo su primera línea. - Llama a
reset()una vez antes del bucle, en lugar de las tres líneas que les asignan valores. - 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()
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Reglas del juego
1Estados del juego
Una variable de estadoUna pantalla de menúPulsa R para volver a jugarUna función de reinicioUna función por estadoPractica por tu cuenta: Playground de Pygame