Menu
CoddyTech

Tường

Thuộc phần Dự án trong hành trình Pygame của Coddy. Bài học 8 trên 33.

Trò chơi kết thúc khi đầu rắn sắp ra khỏi lưới. Một ô nằm trong lưới khi cột của nó nằm trong khoảng từ 0 đến COLS - 1 và hàng của nó nằm trong khoảng từ 0 đến ROWS - 1.

if alive:
    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    if x < 0 or x >= COLS or y < 0 or y >= ROWS:
        alive = False
    else:
        # Chèn, ăn hoặc xóa phần tử cuối, như trước

Lưu ý x >= COLS, không phải x > COLS: các cột được đánh số từ 0, nên cột COLS đã nằm ngoài mép lưới.

Kiểm tra trước khi di chuyển. Đầu rắn không bao giờ ra khỏi lưới, và khi alive là false, con rắn sẽ ở nguyên vị trí cũ. Hiển thị Game over ở chính giữa tọa độ (240, 180) khi alive là false.

challenge icon

Thử thách

Trung bình

Kết thúc trò chơi khi rắn đâm vào tường.

  1. Đặt alive = True trước vòng lặp và đặt thao tác di chuyển bên dưới if alive:.
  2. Nếu ô mới (x, y) nằm ngoài lưới, đặt alive = False; nếu không, chèn, ăn hoặc xóa phần tử như trước.
  3. Khi alive là false, hiển thị Game over căn giữa tại (240, 180).

Nhấn Chơi rồi đâm vào tường: Game over sẽ hiển thị và rắn dừng lại. Sau đó nhấn Kiểm tra.

Tự làm thử

import random
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()
font = pygame.font.Font(None, 32)


def draw_cell(cell, color):
    col, row = cell
    pygame.draw.rect(screen, color, (col * CELL + 1, row * CELL + 1, CELL - 2, CELL - 2))


def new_food(body):
    while True:
        cell = (random.randrange(COLS), random.randrange(ROWS))
        if cell not in body:
            return cell


body = [(5, 9), (4, 9), (3, 9)]
direction = (1, 0)
food = new_food(body)
score = 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

    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    body.insert(0, (x, y))
    if (x, y) == food:
        score += 1
        food = new_food(body)
    else:
        body.pop()

    screen.fill((30, 30, 46))
    draw_cell(food, (235, 80, 80))
    for cell in body[1:]:
        draw_cell(cell, (120, 220, 120))
    draw_cell(body[0], (180, 255, 160))
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (8, 6))
    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