Menu
CoddyTech

Una funzione di reset

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

Gioca una partita, fai qualche punto, perdi, premi R. La nuova partita inizia con il punteggio precedente. Ogni valore modificato durante una partita deve tornare al valore iniziale, e spesso se ne dimentica uno.

Inserisci tutti i valori iniziali in una funzione e chiamala sia prima della prima partita sia quando premi 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 riga global è importante. Una variabile a cui assegni un valore all'interno di una funzione appartiene a quella funzione, a meno che tu non specifichi diversamente. Senza global, score = 0 creerebbe una nuova variabile locale score, che scompare al termine della funzione, e il punteggio della partita non cambierebbe.

Ora l'avvio di una partita è scritto una sola volta. Quando in seguito aggiungi un valore, come le vite, lo aggiungi in un unico punto e sarà disponibile sia nella prima partita sia in ogni nuova partita.

challenge icon

Sfida

Medio
  1. Scrivi reset() che imposta player, rock e score ai rispettivi valori iniziali, con global player, rock, score come prima riga.
  2. Chiama reset() una volta prima del ciclo, al posto delle tre righe che li impostano.
  3. Premendo R, chiama reset() 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 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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Regole di gioco

Esercitati da solo: Playground Pygame