Đánh giá một thế cờ (Hàm EVAL)

Một phần của tài liệu Robot chơi cờ tướng (Trang 109)

c) Xác định vị trí các quân cờ

7.4.3Đánh giá một thế cờ (Hàm EVAL)

Đánh giá một thế cờ là một trong những nhiệm vụ quyết định chƣơng trình chơi cờ của bạn có là hay hay không. Căn cứ vào một thế cờ máy sẽ gán cho nó một điểm số (lƣợng giá tĩnh) để đánh giá độ tốt - xấu. Nhờ điểm này máy mới có thể so sánh các thế cờ với nhau và biết chọn nƣớc đi tốt nhất. Điểm của một thế cờ dựa trên rất nhiều yếu tố mà khó có thể số hoá hết đƣợc nhƣ phụ thuộc vào số lƣợng và giá trị các quân cờ hiện tại, phụ thuộc vào tính hãm, tính biến, thế công, thế thủ của từng quân cờ cũng nhƣ cả cục diện trận đấu. Ví dụ, một cặp Mã giao chân, có thể sát cánh tiến quân và tựa lƣng phòng thủ thƣờng có giá hơn hai Mã đứng rời.

Trong giới hạn của luân văn, ta áp dụng phƣơng pháp đơn giản nhƣng cơ bản nhất: lƣợng giá dựa trên cơ sở giá trị của từng quân cờ. Cách tính này sẽ lấy tổng giá trị các quân cờ hiện có của bên mình trừ đi tổng giá trị các quân cờ hiện có của đối phƣơng.

Điểm các quân cờ đƣợc đánh giá theo kinh nghiệm và cho biết sự tƣơng quan giữa các quân cờ. Sau đây là điểm trung bình từng quân với tỉ lệ mà mọi ngƣời thƣờng chấp nhận:

Tốt Sĩ

10 (20 nếu đã qua sông) 20

Tƣợng 20

Mã 40

Pháo 45

Xe 90

Ngoài ra các điểm số này đƣợc cụ thể hóa bằng các mảng 90 vị trí trên bàn cờ. Ứng với mỗi vị trí sẽ có số điểm tƣơng ứng. Ví dụ ta có bảng điểm của quân tốt nhƣ sau:

static Byte[, ,] pointtable =

{{ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 12, 0, 15, 0, 12, 0, 10, 10, 0, 13, 0, 10, 0, 13, 0, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 22, 22, 22, 21, 21, 20, 20, 21, 21, 23, 23, 23, 21, 21, 20, 20, 21, 21, 23, 22, 23, 21, 21, 20, 11, 12, 13, 14, 14, 14, 13, 12, 11}, Hàm tính điểm của bàn cờ nhƣ sau:

public static int Eval() {

int i, s = 0;

for (i = 0; i < BOARD_SIZE; i++)

{ if (color[i] == DARK) s += pointtable[piece[i], DARK, i];

else if (color[i] == LIGHT) s -= pointtable[piece[i], LIGHT, i];

}

if (side == LIGHT) s = -s;

}

Trong đó bonus() là hàm tính các giá trị điểm thƣởng cho thế cờ.

Một phần của tài liệu Robot chơi cờ tướng (Trang 109)