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ướcLư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.
Thử thách
Trung bìnhKết thúc trò chơi khi rắn đâm vào tường.
- Đặt
alive = Truetrước vòng lặp và đặt thao tác di chuyển bên dướiif alive:. - Nếu ô mới
(x, y)nằm ngoài lưới, đặtalive = False; nếu không, chèn, ăn hoặc xóa phần tử như trước. - Khi
alivelà false, hiển thịGame overcă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