Menu
CoddyTech

Tường

Bài học 26 trên 41 trong khóa học Tạo trò chơi với Pygame của Coddy.

Trò chơi kết thúc khi đầu rắn sắp rời khỏi lưới. Một ô nằm trên 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 lấy ra, như trước

Lưu ý x >= COLS, không phải x > COLS: các cột được đánh số từ 0, vì vậy 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ờ đi ra ngoài lưới, và khi alive là false, con rắn sẽ nằm yên tại chỗ. Hiển thị Game over ở giữa tại (240, 180) khi giá trị này 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, rồi đặt bước di chuyển bên trong if alive:.
  2. Nếu ô mới (x, y) nằm ngoài lưới, đặt alive = False; nếu không, hãy chèn, ăn hoặc xóa phần tử cuối như trước.
  3. Khi alive là false, hiển thị Game over ở giữa tại (240, 180).

Nhấn Chơi rồi đâm vào tường: dòng chữ Game over sẽ hiện ra và rắn sẽ 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 Tạo trò chơi với Pygame

Tự luyện tập: Playground Pygame