Không quay đầu
Thuộc phần Dự án trong hành trình Pygame của Coddy. Bài học 4 trên 33.
Rắn không thể quay ngoặt thẳng về phía sau, vì đầu sẽ đâm vào cổ của nó. Vì vậy, lượt quay 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 rắn di chuyển lần cuối, 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, rồi nhấn lên và trái. Hướng lên được phép, và nếu kiểm tra hướng trái so với hướng lên thì hướng trái cũng được phép, khiến rắn quay lại đâm vào chính mình. Vì vậy, hãy ghi nhớ hướng di chuyển vào đầ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 lượt quay khác đều được phép, kể cả nhấn 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 chính nó.
- Ở dòng đầu tiên bên trong vòng lặp trò chơi, đặt
moving = direction. - 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 còn lại vẫn khiến con rắn đổi hướng.
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 Dự án
Tự luyện tập: Playground Pygame