Menu
CoddyTech

Săn tìm ngọc

Thuộc phần Vòng lặp trò chơi trong hành trình Pygame của Coddy. Bài học 20 trên 35.

Một lượt Gem Hunt kéo dài 30 giây. Hãy đếm thời gian bằng khung hình: với tốc độ 60 khung hình mỗi giây, 10 giây tương ứng với 600 khung hình.

time_left = 600

while running:
    # sự kiện
    if time_left > 0:
        time_left -= 1

Khi time_left về 0, trò chơi ngừng nhận thao tác nhấp và kéo, đồng thời hàng điểm số hiển thị kết quả: thêm and time_left > 0 vào điều kiện kiểm tra sự kiện.

Một thanh ở phía trên hiển thị thời gian còn lại. Độ rộng của thanh biểu thị phần thời gian còn lại của lượt chơi: với thanh rộng tối đa 200 pixel trong một lượt chơi kéo dài 600 khung hình, 200 * time_left // 600 có giá trị 200 lúc bắt đầu, 100 khi đi được nửa lượt và 0 khi kết thúc.

challenge icon

Thử thách

Trung bình

Cho mỗi lượt 30 giây.

  1. Trước vòng lặp, đặt time_left = 1800. Sau các sự kiện, giảm giá trị này đi 1 khi nó lớn hơn 0.
  2. Thêm and time_left > 0 vào các điều kiện kiểm tra MOUSEBUTTONDOWN và MOUSEMOTION.
  3. Sau hàng điểm, vẽ một hình chữ nhật màu xanh lá (120, 200, 120) tại (0, 0, 480 * time_left // 1800, 6).

Nhấn Chơi: thanh màu xanh lá sẽ thu nhỏ lại, và sau 30 giây, các lần nhấp sẽ không có tác dụng. 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("Gem Hunt")
clock = pygame.time.Clock()

gem = pygame.Rect(225, 165, 30, 30)
crate = pygame.Rect(40, 230, 60, 60)
crate.center = gem.center
dragging = False
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if crate.collidepoint(event.pos):
                dragging = True
            elif gem.collidepoint(event.pos):
                score += 1
                gem.x = random.randint(15, 435)
                gem.y = random.randint(55, 315)
                crate.center = gem.center
        elif event.type == pygame.MOUSEBUTTONUP:
            dragging = False
        elif event.type == pygame.MOUSEMOTION and dragging:
            crate.move_ip(event.rel)

    screen.fill((30, 30, 46))
    gem_points = [gem.midtop, gem.midright, gem.midbottom, gem.midleft]
    pygame.draw.polygon(screen, (80, 220, 255), gem_points)
    if gem.collidepoint(pygame.mouse.get_pos()):
        pygame.draw.rect(screen, (255, 196, 0), gem.inflate(10, 10), 2)
    pygame.draw.rect(screen, (150, 100, 50), crate)
    pygame.draw.rect(screen, (110, 70, 35), crate, 3)
    for i in range(score):
        pygame.draw.rect(screen, (240, 110, 180), (10 + 10 * i, 14, 8, 8))
    mouse_x, mouse_y = pygame.mouse.get_pos()
    pygame.draw.circle(screen, (240, 240, 240), (mouse_x, mouse_y), 10, 2)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Vòng lặp trò chơi

Tự luyện tập: Playground Pygame