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.
Thử thách
DễCho người chơi bắt đầu lại sau khi trò chơi kết thúc.
- Bên dưới
Game over, hiển thịPress R to play againở giữa tại (240, 200). - 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
1Trạng thái trò chơi
Một biến trạng tháiMàn hình menuNhấn R để chơi lạiMột hàm đặt lạiMỗi trạng thái một hàmTự luyện tập: Playground Pygame