Menu
CoddyTech

Une fonction de réinitialisation

Fait partie de la section Règles du jeu du Journey Pygame de Coddy. Leçon 4 sur 29.

Jouez à une partie, marquez quelques points, perdez, puis appuyez sur R. La nouvelle partie commence avec l’ancien score. Chaque valeur modifiée par une partie doit retrouver sa valeur initiale, et on en oublie souvent une.

Placez toutes les valeurs initiales dans une seule fonction et appelez-la avant la première partie et lorsque vous appuyez sur 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 ligne global est importante. Une variable à laquelle vous affectez une valeur dans une fonction appartient à cette fonction, sauf indication contraire. Sans global, score = 0 créerait une nouvelle variable locale score qui disparaîtrait à la fin de la fonction, et le score du jeu ne changerait pas.

Désormais, le démarrage d’une partie n’est écrit qu’une seule fois. Lorsque vous ajouterez une valeur plus tard, comme le nombre de vies, vous l’ajouterez à un seul endroit, et la première partie comme chaque nouvelle partie la prendront en compte.

challenge icon

Défi

Moyen
  1. Écris reset() pour définir les valeurs initiales de player, rock et score, avec global player, rock, score comme première ligne.
  2. Appelle reset() une fois avant la boucle, à la place des trois lignes qui les définissent.
  3. Sur R, appelle reset() et définis l’état sur "play".

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Règles du jeu

Entraînez-vous par vous-même : Playground Pygame