Không quay đầu
Bài học 22 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.
Con rắn không thể quay đầu ngược lại ngay lập tức: đầu nó sẽ đâm vào cổ. Vì vậy, thao tác rẽ theo hướng ngược lại sẽ bị bỏ qua.
Hướng ngược lại của (dx, dy) là (-dx, -dy). Khi di chuyển sang phải (1, 0), hướng ngược lại là sang trái (-1, 0).
Hãy so sánh với hướng di chuyển gần nhất của con rắn, chứ không phải phím mới nhất. Hai lần nhấn nhanh có thể rơi vào cùng một khung hình: đang di chuyển sang phải, nhấn Up rồi Left. Up được phép, và nếu so sánh Left với Up thì Left cũng được phép, khiến con rắn quay đầu đâm vào chính mình. Vì vậy, hãy ghi nhớ hướng di chuyển ở đầu mỗi khung hình:
while running:
moving = direction
for event in pygame.event.get():
# ...
turn = TURNS[event.key]
if turn != (-moving[0], -moving[1]):
direction = turnMọi hướng rẽ khác đều được phép, kể cả nhấn phím theo hướng bạn đang di chuyển, vì thao tác đó không làm thay đổi gì.
Thử thách
DễNgăn con rắn quay ngược lại.
- Đặt
moving = directionlàm dòng đầu tiên bên trong vòng lặp trò chơi. - Không làm gì khi nhấn phím chỉ hướng ngược lại với
moving. Các phím mũi tên khác vẫn đổi hướng con rắn.
Nhấn “Chơi” rồi nhấn phím mũi tên trái: con rắn vẫn tiếp tục đi sang phải. 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:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key in TURNS:
direction = TURNS[event.key]
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