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.
Thử thách
DễTạo thân cho rắn để thân đi theo đầu.
- Thay
head = (5, 9)bằngbody = [(5, 9), (4, 9), (3, 9)]. - Ở 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. - 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
3Lưới và danh sách
Lưới ôTừng bước mộtTự luyện tập: Playground Pygame