Menu
CoddyTech

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ự.

challenge icon

Thử thách

Dễ

Khi va chạm, hãy dừng trò chơi và hiển thị Game over.

  1. Trước vòng lặp, thêm state = "play".
  2. Đặt code phím, người chơi và đá bên dưới if state == "play":.
  3. Khi va chạm, đặt state = "over" thay vì running = False.
  4. 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

Tự luyện tập: Playground Pygame