Menu
CoddyTech

Danh sách thân mình

Bài học 23 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.

Con rắn là một danh sách ô, với đầu nằm ở vị trí đầu tiên:

body = [(5, 9), (4, 9), (3, 9)]

Để di chuyển, thêm đầu mới vào vị trí đầu tiên rồi xóa ô cuối cùng. Các ô ở giữa giữ nguyên vị trí, nên thân rắn đi theo đầu:

x = body[0][0] + direction[0]
y = body[0][1] + direction[1]
body.insert(0, (x, y))
body.pop()

body.insert(0, item) đặt phần tử tại chỉ số 0. body.pop() xóa phần tử cuối cùng. body[0] là đầu và body[1:] là phần còn lại.

Vẽ phần còn lại bằng màu xanh lá đậm hơn, rồi vẽ đầu sau cùng để đầu nằm trên cùng.

challenge icon

Thử thách

Dễ

Tạo thân cho rắn để thân đi theo đầu.

  1. Thay head = (5, 9) bằng body = [(5, 9), (4, 9), (3, 9)].
  2. Ở mỗi khung hình, tính đầu mới (x, y) từ body[0], chèn đầu mới vào đầu danh sách rồi loại bỏ phần đuôi.
  3. Vẽ từng ô trong body[1:] bằng màu (120, 220, 120), rồi vẽ body[0] bằng màu (180, 255, 160).

Nhấn Chơi: con rắn dài ba ô trượt ngang qua. Sau đó nhấn Kiểm tra.

Tự làm thử

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


head = (5, 9)
direction = (1, 0)

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

    head = (head[0] + direction[0], head[1] + direction[1])

    screen.fill((30, 30, 46))
    draw_cell(head, (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

Tự luyện tập: Playground Pygame