Menu
CoddyTech

Hàng và cột

Thuộc phần Thế giới trò chơi trong hành trình Pygame của Coddy. Bài học 2 trên 36.

Một vòng lặp đi dọc theo một hàng. Vòng lặp thứ hai bao quanh nó đi xuống các hàng, nên khi kết hợp, chúng sẽ duyệt qua mọi ô của bản đồ. Vòng lặp ngoài lấy từng chuỗi trong LEVEL làm line, cùng với số hàng tương ứng; vòng lặp trong duyệt các ký tự của dòng đó.

walls = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        if char == "#":
            walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))

Tạo các bức tường một lần trước vòng lặp trò chơi, dưới dạng một danh sách các Rect. Bản đồ không thay đổi trong lúc bạn chơi, và sau này bạn sẽ dùng Rect để kiểm tra va chạm. Trong vòng lặp trò chơi, hãy vẽ từng bức tường:

for wall in walls:
    pygame.draw.rect(screen, WALL, wall)

row đến từ vòng lặp ngoài, nên nó xác định tọa độ y của ô; col từ vòng lặp trong xác định tọa độ x. Nếu nhầm lẫn chúng, màn chơi sẽ bị xoay ngang.

challenge icon

Thử thách

Trung bình

Tạo mọi bức tường trên bản đồ, không chỉ hàng dưới cùng.

  1. Trước vòng lặp trò chơi, tạo một danh sách tên là walls.
  2. Dùng hai vòng lặp enumerate, thêm pygame.Rect(col * TILE, row * TILE, TILE, TILE) vào walls cho mỗi # trong LEVEL.
  3. Vẽ mọi Rect trong walls bằng màu nâu WALL thay vì chỉ vẽ hàng dưới cùng.

Nhấn nút "Chơi": toàn bộ bản đồ sẽ hiện ra. Sau đó nhấn "Kiểm tra".

Tự làm thử

import pygame

TILE = 36
WALL = (120, 90, 60)
PLAYER = (80, 200, 120)

LEVEL = [
    "################",
    "#..............#",
    "#....####......#",
    "#..............#",
    "#.........##...#",
    "#..##.....##...#",
    "#..##..........#",
    "#.........###..#",
    "#..............#",
    "####..####..####",
]

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Map from Text")
clock = pygame.time.Clock()

player = pygame.Rect(40, 40, 28, 28)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 4
    if keys[pygame.K_RIGHT]:
        player.x += 4
    if keys[pygame.K_UP]:
        player.y -= 4
    if keys[pygame.K_DOWN]:
        player.y += 4

    screen.fill((30, 30, 46))
    for col, char in enumerate(LEVEL[9]):
        if char == "#":
            pygame.draw.rect(screen, WALL, (col * TILE, 9 * TILE, TILE, TILE))
    pygame.draw.rect(screen, PLAYER, player)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Thế giới trò chơi

Tự luyện tập: Playground Pygame