File size: 1,499 Bytes
53b9b08
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import numpy as np
from chess import Board


def board_to_matrix(board: Board):
    """
    Chuyển một Board -> mảng 13x8x8
    - 0..5: các loại quân của trắng
    - 6..11: các loại quân của đen
    - 12: các ô mà một nước hợp lệ có thể đi tới
    """
    arr = np.zeros((13, 8, 8), dtype=np.float32)
    pieces = board.piece_map()
    for sq, pc in pieces.items():
        r, c = divmod(sq, 8)
        # index kênh: offset màu + loại (loại bắt đầu từ 0)
        color_offset = 0 if pc.color else 6
        type_idx = pc.piece_type - 1
        channel = color_offset + type_idx
        arr[channel, r, c] = 1.0

    # đánh dấu ô đích của tất cả nước hợp lệ ở kênh cuối cùng
    for mv in board.legal_moves:
        tr = mv.to_square
        r_to, c_to = divmod(tr, 8)
        arr[12, r_to, c_to] = 1.0

    return arr

def create_input_for_nn(games): # hàm tạo dữ liệu đầu vào cho nn từ danh sách ván cờ
    X = []
    y = []
    # Duyệt qua từng ván cờ
    for game in games:
        board = game.board() 
        for move in game.mainline_moves(): 
            X.append(board_to_matrix(board))
            y.append(move.uci())
            board.push(move)
    return np.array(X, dtype=np.float32), np.array(y)


def encode_moves(moves):
    move_to_int = {move: idx for idx, move in enumerate(set(moves))}
    return np.array([move_to_int[move] for move in moves], dtype=np.float32), move_to_int