Điểm số có số 0
Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 9 trên 30.
Trò chơi arcade hiển thị điểm số với các số 0 ở phía trước: 00042. Điểm số luôn có năm chữ số, nên nó chiếm gần như cùng một khoảng trống từ điểm đầu tiên đến điểm mười nghìn, trông giống như một bộ đếm.
F-string có thể thêm số 0 đệm vào một số. Sau giá trị, dấu hai chấm bắt đầu định dạng: 0 nghĩa là thêm số 0 đệm và 5 là độ rộng:
f"{42:05}" # "00042"
f"{7:03}" # "007"
f"{123456:05}" # "123456", không bao giờ bị cắt bớtNếu không có 0, f"{42:5}" sẽ thêm khoảng trắng đệm: " 42". Số dài hơn độ rộng sẽ không bao giờ bị cắt, nó chỉ rộng hơn.
Với năm chữ số, tấm bảng phía sau điểm số vẫn giữ kích thước gần như không đổi trong suốt trò chơi.
Thử thách
DễHiển thị điểm số bằng năm chữ số, như trong trò chơi điện tử thùng.
- Vẽ điểm số với các số 0 thêm vào đầu để đủ năm chữ số, không có nội dung nào khác trong văn bản.
- Ban đầu, điểm số là
00000và sau ba tảng đá, điểm số là00003.
Nhấn Chơi: điểm số là 00000, sau đó tăng dần. Rồi 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()
heart = pygame.image.load("assets/images/heart.png").convert_alpha()
heart_empty = pygame.image.load("assets/images/heart_empty.png").convert_alpha()
font = pygame.font.Font("assets/fonts/pixel.ttf", 24)
big_font = pygame.font.Font("assets/fonts/pixel.ttf", 48)
WHITE = (240, 240, 240)
PLATE = (60, 60, 90)
def reset():
global player, rock, score, lives
player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
lives = 3
def draw_menu():
screen.fill((30, 30, 46))
title = big_font.render("Meteor Dodge", True, WHITE)
title_rect = title.get_rect(center=(240, 140))
pygame.draw.rect(screen, PLATE, title_rect.inflate(24, 12))
screen.blit(title, title_rect)
hint = font.render("Press Enter to play", True, WHITE)
screen.blit(hint, hint.get_rect(center=(240, 200)))
def draw_game():
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, WHITE)
score_rect = score_text.get_rect(topright=(470, 10))
pygame.draw.rect(screen, PLATE, score_rect.inflate(12, 8))
screen.blit(score_text, score_rect)
for i in range(3):
if i < lives:
screen.blit(heart, (10 + i * 40, 10))
else:
screen.blit(heart_empty, (10 + i * 40, 10))
def play_frame():
global score, lives, state
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):
rock.y = -24
rock.x = random.randint(0, 456)
lives -= 1
if lives == 0:
state = "over"
draw_game()
def draw_over():
draw_game()
message = big_font.render("Game over", True, WHITE)
screen.blit(message, message.get_rect(center=(240, 160)))
hint = font.render("Press R to play again", True, WHITE)
screen.blit(hint, hint.get_rect(center=(240, 200)))
reset()
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"
elif event.key == pygame.K_r and state == "over":
reset()
state = "play"
if state == "menu":
draw_menu()
elif state == "play":
play_frame()
else:
draw_over()
pygame.display.flip()
clock.tick(60)
pygame.quit()
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 Luật chơi
Tự luyện tập: Playground Pygame