Một biến trạng thái
Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 1 trên 30.
Hiện tại, khi va chạm, cửa sổ sẽ đóng lại. Trò chơi nên dừng và hiển thị điều đã xảy ra. Chương trình cần ghi nhớ trò chơi đang ở trạng thái nào: đang chơi hay đã kết thúc.
Hãy lưu trạng thái đó trong một biến duy nhất, một trạng thái (state), chứa một chuỗi ngắn:
state = "play"
...
if state == "play":
# Di chuyển người chơi và tảng đá
if rock.colliderect(player):
state = "over"Chỉ đoạn code bên dưới if state == "play": mới di chuyển các vật thể, vì vậy khi trạng thái chuyển thành "over", mọi thứ sẽ đóng băng. Vòng lặp vẫn tiếp tục chạy: chương trình vẫn đọc sự kiện, vẽ và cập nhật đồng hồ, nên cửa sổ vẫn mở và có thể hiển thị thông báo.
Dùng chuỗi giúp code dễ đọc. Phép kiểm tra như state == "over" cho biết rõ ý nghĩa, và các bài học tiếp theo sẽ thêm trạng thái theo cách tương tự.
Thử thách
DễKhi va chạm, hãy dừng trò chơi và hiển thị Game over.
- Trước vòng lặp, thêm
state = "play". - Đặt code phím, người chơi và đá bên dưới
if state == "play":. - Khi va chạm, đặt
state = "over"thay vìrunning = False. - Sau điểm số, khi
state == "over", hiển thịGame overở chính giữa tọa độ (240, 160).
Nhấn Chơi và đứng bên dưới một tảng đá: trò chơi dừng lại và hiện Game over. 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
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
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):
running = False
screen.fill((30, 30, 46))
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))
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