Menu
CoddyTech

Uma função de reinicialização

Parte da seção Regras do jogo do Journey de Pygame da Coddy. Lição 4 de 29.

Jogue uma partida, faça alguns pontos, perca e pressione R. A nova partida começa com a pontuação antiga. Todo valor que uma partida altera precisa voltar ao valor inicial, e muitas vezes algum acaba sendo esquecido.

Coloque todos os valores iniciais em uma função e chame-a tanto antes da primeira partida quanto ao pressionar 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()

A linha global é importante. Uma variável à qual você atribui um valor dentro de uma função pertence a essa função, a menos que você especifique o contrário. Sem global, score = 0 criaria uma nova variável local score, que desapareceria quando a função terminasse, e a pontuação do jogo não mudaria.

Agora, o início de uma partida é escrito uma única vez. Quando você adicionar um valor mais tarde, como vidas, vai adicioná-lo em um só lugar, e tanto a primeira partida quanto todas as novas partidas vão recebê-lo.

challenge icon

Desafio

Médio
  1. Escreva reset() para definir player, rock e score com seus valores iniciais, tendo global player, rock, score como sua primeira linha.
  2. Chame reset() uma vez antes do loop, no lugar das três linhas que os definem.
  3. Ao pressionar R, chame reset() e defina o estado como "play".

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Regras do jogo

Pratique por conta própria: Playground de Pygame