Ăn và lớn lên
Bài học 25 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.
Khi phần đầu mới chạm vào thức ăn, con rắn sẽ ăn. Cách làm cho rắn dài ra là giữ nguyên bước di chuyển bạn đã có, chỉ bỏ một dòng: khi di chuyển và ăn, hãy bỏ qua thao tác xóa phần tử cuối, để đuôi giữ nguyên vị trí.
body.insert(0, (x, y))
if (x, y) == food:
score += 1
food = new_food(body)
else:
body.pop()Các tuple được so sánh từng phần tử, nên (x, y) == food là true khi cả cột lẫn hàng đều trùng khớp.
Hiển thị điểm số như bạn đã làm trước đây: tạo phông chữ trước vòng lặp, rồi vẽ f"Score: {score}" mỗi khung hình tại (8, 6).
Thử thách
Trung bìnhCho rắn ăn và lớn lên.
- Trước vòng lặp, tạo
font = pygame.font.Font(None, 32)vàscore = 0. - Sau khi chèn đầu mới: nếu đầu rắn nằm trên thức ăn, tăng điểm lên 1 và đặt thức ăn mới; nếu không, loại bỏ đuôi.
- Hiển thị
f"Score: {score}"bằng(240, 240, 240)rồi blit tại(8, 6).
Nhấn Chơi rồi điều khiển rắn đi vào thức ăn: rắn sẽ dài ra và điểm số tăng lên. Sau đó nhấn Kiểm tra.
Tự làm thử
import random
import pygame
CELL = 20
COLS, ROWS = 24, 18
TURNS = {
pygame.K_LEFT: (-1, 0),
pygame.K_RIGHT: (1, 0),
pygame.K_UP: (0, -1),
pygame.K_DOWN: (0, 1),
}
pygame.init()
screen = pygame.display.set_mode((COLS * CELL, ROWS * CELL))
pygame.display.set_caption("Snake")
clock = pygame.time.Clock()
def draw_cell(cell, color):
col, row = cell
pygame.draw.rect(screen, color, (col * CELL + 1, row * CELL + 1, CELL - 2, CELL - 2))
def new_food(body):
while True:
cell = (random.randrange(COLS), random.randrange(ROWS))
if cell not in body:
return cell
body = [(5, 9), (4, 9), (3, 9)]
direction = (1, 0)
food = new_food(body)
running = True
while running:
moving = direction
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key in TURNS:
turn = TURNS[event.key]
if turn != (-moving[0], -moving[1]):
direction = turn
x = body[0][0] + direction[0]
y = body[0][1] + direction[1]
body.insert(0, (x, y))
body.pop()
screen.fill((30, 30, 46))
draw_cell(food, (235, 80, 80))
for cell in body[1:]:
draw_cell(cell, (120, 220, 120))
draw_cell(body[0], (180, 255, 160))
pygame.display.flip()
clock.tick(10)
pygame.quit()
Tất cả bài học trong Tạo trò chơi với Pygame
3Lưới và danh sách
Lưới ôTừng bước mộtTự luyện tập: Playground Pygame