Menu
CoddyTech

Premi R per giocare ancora

Fa parte della sezione Regole di gioco del percorso Pygame di Coddy. Lezione 3 di 29.

Quando la partita finisce, il giocatore vuole riprovarci senza riavviare il programma. Aggiungi una riga alla schermata di fine partita e un tasto che avvii una nuova partita:

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

Impostare di nuovo lo stato su "play" non basta. La roccia sta ancora toccando il giocatore, quindi il fotogramma successivo farebbe finire di nuovo la partita. Rimetti gli elementi che si sono mossi nelle posizioni iniziali di una nuova partita.

È lo stesso schema del menu: un tasto, un controllo dello stato corrente, un nuovo stato.

challenge icon

Sfida

Facile
  1. Nella schermata di fine partita, sotto Game over, mostra Press R to play again centrato in (240, 200).
  2. Quando premi R e lo stato è "over": rimetti il giocatore in x 220, la roccia in y -24 con un valore x casuale da 0 a 456 e imposta lo stato su "play".

Provalo tu

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()

Tutte le lezioni di Regole di gioco

Esercitati da solo: Playground Pygame