Ăn và lớn lên
Thuộc phần Dự án trong hành trình Pygame của Coddy. Bài học 7 trên 33.
Khi phần đầu mới chạm vào thức ăn, con rắn sẽ ăn nó. Bạn đã có sẵn thao tác làm rắn dài ra, chỉ cần bỏ đi một dòng: ở bước ăn thức ăn, đừng xóa phần tử ở đuôi, thế là đuôi được giữ lại.
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ử, vì vậy (x, y) == food là true khi cả cột và hàng đều khớp.
Hiển thị điểm như bạn đã làm trước đây: tạo phông chữ trước vòng lặp, rồi hiển thị f"Score: {score}" trong 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 thêm đầu mới: nếu đầu rắn ở vị trí thức ăn, cộng 1 vào điểm và đặt thức ăn mới; nếu không, xóa phần đuôi.
- Hiển thị
f"Score: {score}"bằng(240, 240, 240)và vẽ nó tại(8, 6).
Nhấn Chơi và điều khiển rắn lao vào thức ăn: rắn sẽ lớn lên và điểm số tăng. 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 Dự án
Tự luyện tập: Playground Pygame