Menu
CoddyTech

Una variabile di stato

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

In questo momento, un urto chiude la finestra. Un gioco dovrebbe fermarsi e mostrare cosa è successo. Il programma deve ricordare in quale parte del gioco si trova: in corso oppure terminato.

Memorizza questa informazione in un'unica variabile, uno stato, contenente una stringa breve:

state = "play"
...
if state == "play":
    # muovi il giocatore e la roccia
    if rock.colliderect(player):
        state = "over"

Solo il codice sotto if state == "play": sposta gli oggetti, quindi quando lo stato diventa "over" tutto si blocca. Il ciclo continua a essere eseguito: legge comunque gli eventi, disegna e aggiorna il clock, così la finestra rimane aperta e può mostrare un messaggio.

Una stringa è facile da leggere nel codice. Un test come state == "over" esprime chiaramente il suo significato e nelle prossime lezioni si aggiungeranno altri stati allo stesso modo.

challenge icon

Sfida

Facile
  1. Prima del ciclo, aggiungi state = "play".
  2. Inserisci il codice dei tasti, del giocatore e della roccia sotto if state == "play":.
  3. Quando la roccia colpisce il giocatore, imposta state = "over" invece di running = False.
  4. Dopo aver disegnato il punteggio, quando state == "over", mostra Game over centrato in (240, 160).

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

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    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):
        running = False

    screen.fill((30, 30, 46))
    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))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tutte le lezioni di Regole di gioco

Esercitati da solo: Playground Pygame