Menu
CoddyTech

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 = turn

Mọ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ì.

challenge icon

Thử thách

Dễ

Ngăn con rắn quay ngược lại.

  1. Đặt moving = direction làm dòng đầu tiên bên trong vòng lặp trò chơi.
  2. 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

Tự luyện tập: Playground Pygame