Menu
CoddyTech

Nhấn R để chơi lại

Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 3 trên 30.

Khi trò chơi kết thúc, người chơi muốn chơi lại mà không cần khởi động lại chương trình. Thêm một dòng vào màn hình kết thúc trò chơi và một phím để bắt đầu trò chơi mới:

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

Đặt lại trạng thái thành "play" là chưa đủ. Tảng đá vẫn đang chạm vào người chơi, nên khung hình tiếp theo sẽ khiến trò chơi kết thúc lần nữa. Đưa các vật thể đã di chuyển về vị trí ban đầu khi bắt đầu trò chơi mới.

Đây là cùng một mẫu như ở menu: một phím, kiểm tra trạng thái hiện tại, một trạng thái mới.

challenge icon

Thử thách

Dễ

Cho người chơi bắt đầu lại sau khi trò chơi kết thúc.

  1. Bên dưới Game over, hiển thị Press R to play again ở giữa tại (240, 200).
  2. Khi nhấn R và trạng thái là "over": đưa người chơi về x 220, đưa tảng đá về y -24 với giá trị x ngẫu nhiên từ 0 đến 456, rồi đặt trạng thái thành "play".

Nhấn Chơi, để thua, rồi nhấn R: một ván mới bắt đầu. Sau đó nhấn Kiểm tra.

Tự làm thử

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

Tất cả bài học trong Luật chơi

Tự luyện tập: Playground Pygame