Spaces:
Sleeping
Sleeping
| import pygame | |
| import chess | |
| from . import config | |
| def load_piece_images(): | |
| """ | |
| Tải 12 hình ảnh quân cờ từ thư mục assets. | |
| Trả về một dict: {'wP': img, 'wR': img, ..., 'bK': img} | |
| """ | |
| images = {} | |
| pieces = ['P', 'N', 'B', 'R', 'Q', 'K'] | |
| colors = ['w', 'b'] | |
| for color in colors: | |
| for piece in pieces: | |
| key = f"{color}{piece}" | |
| filename = f"{key}.png" | |
| try: | |
| image = pygame.image.load(f"{config.ASSET_PATH}{filename}") | |
| image = pygame.transform.scale(image, (config.SQUARE_SIZE, config.SQUARE_SIZE)) | |
| images[key] = image | |
| except FileNotFoundError: | |
| print(f"Lỗi: Không tìm thấy file {config.ASSET_PATH}{filename}") | |
| # Tạo ảnh rỗng thay thế | |
| images[key] = pygame.Surface((config.SQUARE_SIZE, config.SQUARE_SIZE), pygame.SRCALPHA) | |
| return images | |
| def draw_board(screen): | |
| """Vẽ bàn cờ (các ô vuông)""" | |
| for r in range(8): | |
| for c in range(8): | |
| color = config.COLORS["white"] if (r + c) % 2 == 0 else config.COLORS["black"] | |
| pygame.draw.rect(screen, color, | |
| (c * config.SQUARE_SIZE, | |
| r * config.SQUARE_SIZE, | |
| config.SQUARE_SIZE, | |
| config.SQUARE_SIZE)) | |
| def draw_pieces(screen, board, images): | |
| """ | |
| Vẽ các quân cờ lên bàn cờ, dựa trên trạng thái `board` của python-chess. | |
| """ | |
| for i in range(64): | |
| square = chess.SQUARES[i] # 0 (A1) -> 63 (H8) | |
| piece = board.piece_at(square) | |
| if piece is not None: | |
| # Lấy key (ví dụ: 'wP', 'bN') | |
| color = 'w' if piece.color == chess.WHITE else 'b' | |
| piece_type = piece.symbol().upper() | |
| image_key = f"{color}{piece_type}" | |
| # Chuyển đổi chess.Square (0-63) sang tọa độ (x, y) của Pygame | |
| file = chess.square_file(square) # Cột 0 (A) -> 7 (H) | |
| rank = chess.square_rank(square) # Hàng 0 (1) -> 7 (8) | |
| # Pygame vẽ từ trên xuống, Chess đếm từ dưới lên | |
| x = file * config.SQUARE_SIZE | |
| y = (7 - rank) * config.SQUARE_SIZE | |
| screen.blit(images[image_key], (x, y)) | |
| def draw_highlight(screen, square): | |
| """Tô sáng ô được chọn""" | |
| if square is not None: | |
| file = chess.square_file(square) | |
| rank = chess.square_rank(square) | |
| x = file * config.SQUARE_SIZE | |
| y = (7 - rank) * config.SQUARE_SIZE | |
| # Tạo một bề mặt trong suốt để tô sáng | |
| highlight_surface = pygame.Surface((config.SQUARE_SIZE, config.SQUARE_SIZE), pygame.SRCALPHA) | |
| highlight_surface.fill(config.COLORS["highlight"]) | |
| screen.blit(highlight_surface, (x, y)) |