Menu
CoddyTech

Ă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).

challenge icon

Thử thách

Trung bình

Cho rắn ăn và lớn lên.

  1. Trước vòng lặp, tạo font = pygame.font.Font(None, 32) và score = 0.
  2. 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.
  3. 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