Tải bản đầy đủ (.pdf) (26 trang)

XÂY DỰNG CHƯƠNG TRÌNH CHƠI CỜ VÂY ĐƠN GIẢN SỬ DỤNG CÔNG NGHỆ TRI THỨC

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (689.7 KB, 26 trang )

BÁO CÁO ĐỒ ÁN.
Môn: CÔNG NGHỆ TRI THỨC VÀ ỨNG DỤNG
XÂY DỰNG CHƯƠNG TRÌNH
CHƠI CỜ VÂY ĐƠN GIẢN
SỬ DỤNG CÔNG NGHỆ TRI THỨC
Học viên: PHẠM NGUYỄN TRƯỜNG AN
Giảng viên hướng dẫn: GS. TSKH. Hoàng Văn Kiếm
2 Công nghệ tri thức và ứng dụng
Mục lục
Phần 1.Giới thiệu yêu cầu: 3
1)Giới thiệu cờ vây: 3
2)Tản mạn computer go 3
3)Yêu cầu đề ra: 4
Phần 2.Cơ sở lý thuyết 4
1)Đặc điểm của cờ vây 4
Cờ Vây có 9 điều luật cơ bản: 4
Lợi thế của người so với máy 14
2)Một số đặc điểm chung của các chương trình chơi cờ vây 14
Phần 3.Phân tích thiết kế 15
1)Thiết kế tổng quát của chương trình 15
2)Cách biểu diễn bàn cờ 16
3)Engine chơicờ 16
Phần 4.Kết quả và hướng phát triển 25
Tài liệu tham khảo: 26
3 Công nghệ tri thức và ứng dụng
Phần 1.Giới thiệu yêu cầu:
1) Giới thiệu cờ vây:
Cờ vây, tiếng Trung Quốc là 围棋 (wei chi) bắt nguồn từ vùng Bắc Á khoảng 500
năm trước công nguyên. Không có sử liệu nào ghi nhận một cách cụ thể về nguồn gốc cờ
vây, nhưng từ thời Tam Quốc, cờ vây đã trở nên rất phổ biến ở Trung Quốc với hình ảnh
Quan Công thản nhiên đánh cờ trong khi đang được Hoa Đà phẫu thuật viết thương. Trải


qua hàng nghìn năm thăng trầm, hiện nay cờ vây vẫn còn rất thịnh hành và đã phát triển ra
toàn thế giới.
Điểm đặc biệt của cờ vây chính là sự đơn giản đến kỳ lạ trong luật chơi, chỉ có một
loại quân cờ đồng nhất, và những quân này cũng không thể di chuyển. Trong khi các loại cờ
khác bắt đầu với một bàn cờ đầy quân và kết thúc bằng sự tiêu diệt toàn bộ hay một quân
đặc biệt nào đó của đối phương, cờ vây bắt đầu với một bàn cờ trống rỗng và kết thúc bằng
việc vây chiếm càng nhiều không gian trên bàn cờ càn tốt. Những ván cờ vây chuyên nghiệp
có thể kết thúc mà không cần phải tiêu diệt một quân nào.
Tuy nhiên để chơi giỏi cờ vây hoàn toàn không đơn giản. Mặc dù những nước đi chỉ
thuần túy là đặt quân lên bàn cờ, những quân này sau đó lại liên kết với những quân khác
tạo thành một thế trận phức tạp, và có chiêu sâu chiến lược rất cao. Việc nhận biết được thế
trận và đưa ra nước đi đúng là không hề đơn giản. Khoảng cách về kỹ năng giữa những kỳ
thủ chuyên nghiệp và người mớp tập chơi là vô cùng khủng khiếp. Những thống kê cho thấy
các kỳ thủ chuyên nghiệp còn có thể nhớ tất cả các nước đi của ván cờ và đưa ra lý giải cho
từng nước.
2) Tản mạn computer go
Các nghiên cứu về việc lập trình cho máy tính chơi cờ vây được manh nha từ thập kỷ
60 của thế kỷ XX tại phương Tây
(1)
, sau khi môn cờ này bắt đầu gây được sự chú ý nhất
định. Những chương trình đánh cờ vây đầu tiên được hiện thực vào cuối thập niên 70. Rất
nhiều dự án phần mềm và các hệ thống chơi cờ vây đã ra đời và liên tục được phát triển.
Tuy nhiên trong khi các hệ thống chơi những loại cờ khác đã phát triển đến ngang hàng với
những đại kiện tướng cờ của thế giới (như việc Deep Blue đánh bại nhà vô địch cờ vua thế
giới Kasparov vào năm 1997) thì cho đến tận ngày nay vẫn chưa có hệ thống chơi cờ vây
nào vượt qua được đẳng cấp của người chơi bán chuyên nghiệp.
Những ván đấu giữa các kỳ thủ chuyên nghiệp và máy luôn kết thúc với phần thắng
4 Công nghệ tri thức và ứng dụng
thuộc về con người. Ngay cả khi máy được chấp đi trước đến hơn 9 nước, vẫn rất hiếm khi
máy có thể giành được phần thắng. Nhiều giả thuyết đã được đặt ra để lý giải vấn đề này,

ngoài những nguyên nhân như sức mạn hiện tại của các hệ thống máy tính hay đặc tính
phức tạp của riêng ván cờ vây. Có giả thuyết cho rằng chính sự đơn giản nhưng sâu sắc của
cờ vây đã đánh vào điểm khác biệt giữa tư duy của người và máy và tạo cho người lợi thế
lớn so với máy.
(2)
3) Yêu cầu đề ra:
Đồ án này sẽ nghiên cứu, tìm hiểu về những đặc trưng của bộ môn cờ vây và các
phương thức cơ bản của những hệ thống chơi cờ hiện tại. Từ đó xây dựng một chương trình
máy tính đơn giản có thể chơi cờ vây với người, hỗ trợ giao diện đồ hoạ và giao tiếp bằng
chuột máy tính.
Phần 2.Cơ sở lý thuyết
1) Đặc điểm của cờ vây
Cờ Vây có 9 điều luật cơ bản:
Điều 1 : Cờ Vây là trò chơi giữa hai đối thủ.
Điều 2 : Một đấu thủ cầm quân Trắng còn đấu thủ kia cầm quân Đen. Bên Đen đi
trước (trừ trường hợp chấp quân thì bên Trắng đi trước).
Điều 3 : Quân cờ được đặt vào giao điểm của các đường kẻ.
Điều 4 : Mỗi một quân cờ khi đã đặt vào vị trí thì không được phép di chuyển nữa
(trừ trường hợp bị bắt làm tù binh, bị nhấc ra ngoài, sẽ nói ở điều 6).
Điều 5 : Đấu thủ nào chiếm được nhiều đất hơn, thì thắng ván cờ.
Điều 6 : Các quân cờ bị đối phương làm cho hết “khí” thì gọi là “tù binh” và bị nhấc
ra khỏi bàn cờ.
Điều 7 : Không được đặt quân vào vị trí không còn “khí”(trừ trường hợp ăn quân, sẽ
nói sau).
Điều 8 : Có những quy ước đặt biệt cho trường hợp “tranh chấp” lẫn nhau, được gọi
là “ko”(sẽ giải thích sau).
Điều 9 : Sẽ có những điều luật riêng cho việc đánh có chấp.
5 Công nghệ tri thức và ứng dụng
Từ điều 1 đến điều 4 thì không giải thích gì thêm, nhưng từ điều thứ 5 đến thứ 9 sẽ có
giải thích và minh họa đầy đủ.

1 – VÙNG ĐẤT (còn gọi là lãnh thổ hay territory):
Là các giao điểm trống (không có quân) được các quân của một bên vây kín xung
quanh. Xem hình vẽ (trong đó có đất ở góc (16 điểm) và đất ở giữa bàn cờ (8 điểm) được
bên Đen vây kín, tổng cộng Đen có 24 điểm).
Mục đích của mỗi bên là tìm cách vây kín được càng nhiều đất càng tốt, để khi kết
thúc ván cờ, đếm đất ai nhiều hơn thì người đó thắng. Trong khi tranh giành đất đồng thời
tìm cách vây bắt quân đối phương, loại trừ quân đối phương ra khỏi bàn cờ (bắt tù binh) mà
thực chất cũng là chiếm đất vì mỗi tù binh bị bắt sẽ cho một điểm trống.
Kích thước của vùng đất được đếm bởi số giao điểm chứa trong nó. Vùng đất ở góc
chỉ cần ít quân mà chiếm được nhiều do các góc và cạnh đã thay thế cho quân. Vùng đất ở
giữa, ngược lại, dùng nhiều quân mà chiếm được ít. Các đấu thủ phải nhớ điều này trong khi
chơi.
2 – ĐÁM QUÂN VÀ KHÍ CỦA ĐÁM QUÂN:
Đám quân gồm một hay nhiều quân của một bên nằm liền nhau theo hàng dọc hay
hàng ngang. Khí của đám quân là những giao điểm trống nằm sát bên đám quân đó theo
hàng dọc và ngang (xem hình, khí là những điểm được bôi xám)
3 – ĂN QUÂN HAY BẮT QUÂN (CAPTURE):
Khi một bên đi quân chẹn nốt khí cuối cùng của đám quân đối phương, khiến cho
đám quân của đối phương hết khí, thì tất cả các quân của đám quân này coi như “chết hẳn”
và bị nhấc ra khỏi bàn cờ (thuật ngữ gọi đám quân này là “tù binh”). Mỗi bên sẽ để riêng tù
binh của mình để dùng tính điểm vào cuối ván cờ.
6 Công nghệ tri thức và ứng dụng
Trong trường hợp dưới đây thì quân Trắng ở góc, cạnh và giữa bàn cờ đều hết khí và
thành tù binh đưa ra khỏi bàn cờ.
4 - CHẸT QUÂN (ATARI):
Là nước đi khiến đám quân của đối phương chỉ còn lại một khí duy nhất. Quân hay
đám quân đó gọi là “quân bị chẹt”. Thông thường có 2 vị trí để chẹt quân, việc chọn vị trí
nào để chẹt quân là tùy thuộc vào việc chạy của đám quân đang bị chẹt (hình vẽ).
7 Công nghệ tri thức và ứng dụng
5 - CHẠY QUÂN:

Khi một đám quân có nguy cơ bị bắt hay đang bị chẹt thì nó phải tìm đường tháo
chạy bằng cách nối dài đám quân của mình ra để có thêm khí. Việc nối dài này được gọi là
chạy quân (xem hình, quân Đen đang bị chẹt, Đen đặt quân có hình ngôi sao nối vào để
chạy quân)
6 - NỐI ĐÁM QUÂN:
Là nước đi làm cho hai đam quân riêng lẻ trở thành một đám quân mới duy nhất, với
mục đích là phá vây, tăng thêm khí cho đám quân mới này.
Đen có hai đám quân riêng biệt. Sau đó đặt thêm 1 quân (có hình sao) vào để nối hai
đám quân với nhau.
7 - ĐIỂM HẾT KHÍ:
Là giao điểm bị một bên vây kín (hình vẽ).
8 Công nghệ tri thức và ứng dụng
Không được đặt quân vào “điểm hết khí” (trừ trường hợp bên đặt vào là bên vây
điểm hết khí hoặc đặt vào là bắt được ngay quân đối phương hay trường hợp “ko” mà chúng
ta sẽ tìm hiểu sau). Vậy có 2 loại nước cấm:
1) Cấm đi vào giao điểm đã bị đối phương chặn hết khí (vây chặt).
2) Cấm đi vào giao điểm còn lại cuối cùng của đám quân đã bị đối phương vây chặt
(xem hình trên)
Tuy nhiên phải lưu ý có những nước tuy bị đối phương vây mà không cấm. Như hình
dưới, bên Đen vẫn có thể đi vào những giao điểm trống(điểm a), vì khi đi vào đó Đen sẽ ăn
ngay các quân Trắng (vì làm cho đám quân Trắng hết khí).
8 – VÂY CHIẾM ĐẤT:
Mỗi bên có thể chiếm đất bằng hai cách:
- Nối liền các quân của mình cùng với các góc các cạnh của bàn cờ thành một vùng
9 Công nghệ tri thức và ứng dụng
khép kín. Diện tích bên trong vùng khép kín chính là đất chiếm được của bên đó.
- Nối liền các quân với nhau thành một vòng khép kín.
Bạn có thể ghi nhớ rằng vùng đất sẽ không được hoàn chỉnh nếu để cho đối phương
xâm nhập vào.
a) Xâm nhập từ bên ngoài: Mỗi bên phải chuẩn bị đề phòng sự xâm nhập của đối

phương khi xuất hiện một số khu vực trong vành đai quân của mình bị đứt quãng.
Xem hình: Vùng đất của Đen trong trường hợp này không hoàn chỉnh, nó bị đứt
quãng tại điểm “a”.
Nếu Trắng đi vào điểm “a” thì vành đai của Đen bị cắt đứt và hai đám quân Đen bị
tách rời sẽ bị nguy hiểm. Còn nếu Đen đi vào điểm “a” thì có được 1 vùng đất hoàn chỉnh
12 điểm.
Xâm nhập bằng quân đơn: Đây không phải xâm nhập bằng cách nối quân từ ngoài
vào mà bằng cách nhảy dù ngay vào bên trong lãnh thổ đối phương bằng những quân lẻ.
Rõ ràng lãnh thổ của Đen là 36 điểm hoàn chỉnh. Nhưng Trắng đặt vào bên trong
lãnh thổ đó một quân Trắng nhằm tạo mắt bên trong. (xem hình dưới, bên trái).
Trắng nhảy dù và tạo được một đám quân ngay trong lãnh thổ của Đen, dù Đen đã cố
gắng vây lại nhưng Trắng đã tạo được hai mắt có 2 điểm hết khí nên Đen không thể bắt đám
quân này làm tù binh. Do nhảy dù mà đất của Đen từ 36 bị giảm còn 18. Trắng thêm được 2
điểm trống, cuối ván điền quân vào, Đen mất tổng số tới 20 điểm. (xem hình trên, bên phải).
10 Công nghệ tri thức và ứng dụng
9 – KHÁI NIỆM VỀ “SỐNG” VÀ “CHẾT” CỦA ĐÁM QUÂN:
Khi một quân được đặt vào bàn cờ, bao giờ nó cũng có khí xung quanh. Nhưng trong
quá trình diễn biến ván cờ, cả hai đấu thủ đều tìm cách cuớp khí của đám quân đối phương.
Khi hoàn toàn hết khí thì đám quân đó trở thành tù binh, bị nhấc ra khỏi bàn cờ, lúc đó
người ta nói rằng đám quân đó “chết hẳn” (như đã giải thích ở phần ăn quân.
Có những đám quân tuy còn khí nhưng thật ra là chết vì trước hay sau cũng không có
đường thoát (gọi là chết kỹ thuật) (xem hình dưới, đám Đen bị bắt).
Định nghĩa “quân chết kỹ thuật”: Là một hay nhiều quân tuy còn khí nhưng đã
nằm hoàn toàn trong vòng vây của đối phương, không có đường thoát, không có mắt, không
sống chung(sẽ giải thích sau). Tuy nhiên có trường hợp bị nằm trong vòng vây nhưng không
chết vì có một lãnh thổ nhỏ để dư sức làm mắt.(xem hình dưới, Đen vẫn sống) Nhưng nếu
biết cách hay, Trắng có thể bắt chết Đen, còn nếu Trắng không thích mạo hiểm thì Đen sống.
Mỗi bên đều cố gắng bằng mọi cách cho quân mình tránh bị bắt làm tù binh mà còn
tạo ra cho đám quân mình cuộc sống “vĩnh viễn”, tức là làm cho đối phương không còn khả
năng tiêu diệt hết khí của đám quân mình. Muốn tạo cho đám quân mình cuộc sống “vĩnh

11 Công nghệ tri thức và ứng dụng
viễn” thì người chơi có 2 phương pháp hiệu nghiệm:
a) Sống chung (seki): Nhìn vào hình vẽ:
Ta thấy rằng đám quân Đen đang sống chung với đám quân Trắng bởi vì cả 2 đám
quân này có 2 khí chung. Mỗi bên đều không dám đưa quân vào chẹn 1 trong 2 khí chung
này. Lý do rất dễ hiểu : Nếu Trắng đặt thêm bất cứ một quân nào vào 1 trong 2 điểm trên thì
khi đến lượt Đen, Đen sẽ chẹn nốt khí còn lại và bắt được 4 quân Trắng làm tù binh. Và
ngược lại nếu Đen đi vào 1 trong 2 điểm đó thì Trắng sẽ bắt được 3 quân Đen. Chính sự
“Gầm ghè” giữa hai bên như vậy khiến cho cả hai đám quân của hai bên tồn tại cho tới cuối
ván cờ mà không bị bắt làm tù binh. Khi đến cuối ván cờ thì hai điểm (khí) chung này sẽ
không được tính vào đất của bên nào cả. Ví dụ 3 trường hợp sống chung:
Như trên ta thấy 3 trường hợp sống chung (ở góc, biên, giữa, được cách nhau bằng
viền đậm). Đều không có bên nào chết trong tình huống đó. Nhưng cũng không có bên nào
có điểm (đất). Sau đây chúng tôi sẽ giới thiệu cho bạn một cách khác để sống vĩnh viễn mà
12 Công nghệ tri thức và ứng dụng
không phải sống chung với quân khác (chỉ một mình mình sống) mà còn có điểm (đất).
Làm hai mắt: Nhìn vào hình vẽ trước:
Ta thấy đám quân Đen bị quân Trắng vây chặt nhưng đám quân Đen vẫn không bị bắt
làm tù binh, tức là chưa chết hẳn vì đám quân Đen còn có hai mắt(khí), nghĩa là đám quân
Đen vẫn còn khí để thở. Quân Trắng không thể chẹn nốt hai khí này vì theo luật thì đây là
hai “điểm hết khí”. Và như vậy đám quân Đen sẽ sống vĩnh viễn.
Ngoài trường hợp chết thực sự (thành tù binh) và sống “vĩnh viễn” nhờ “sống chung”
và “tạo hai mắt” như trên thì các đám quân của mỗi bên còn có một trạng thái nữa gọi là
“chết kỹ thuật” (như đã giải thích ở trên, ở đây bổ sung một tí). Khi một đám quân bị bao
vây nhưng không có “sống chung”, không có “hai mắt”. Trong quá trình chơi ván cờ, đám
quân này có thể được cứu thoát để hồi sinh (ví dụ như các đám quân tham gia vây hãm đám
quân này bị bắt làm tù binh, hay vòng vây bị phá…). Nhưng nếu không được giải cứu thì tới
cuối ván cờ tất cả những quân bị vây không còn lối thoát này (kể cả vẫn còn khí) sẽ được
coi như chết thật sự và bị nhấc ra khỏi bàn như những tù binh vậy. Hnh dưới ví dụ 3 trường
hợp làm mắt(ở góc, biên, giữa). Ta thấy mắt càng to cho càng nhiều điểm.

13 Công nghệ tri thức và ứng dụng
10 - MẮT LÀ GÌ?
Như trên ta nói tới mắt, nhưng mắt là gì? Mắt được định nghĩa một cách đơn giản sau
đây: Mắt là một hay nhiều giao điểm trống của một đám quân bị một bên vây kín. Có 2 loại
mắt: Mắt nhỏ và mắt to. Mắt nhỏ gồm từ một tới hai giao điểm. Mắt to có từ 3 giao điểm trở
lên.
Mắt thật và mắt giả: Mắt thật là mắt hoàn chỉnh, không có khiếm khuyết, các vị trí
đều có đủ quân. Mắt giả là mắt thiếu quân, và về sau có thể sẽ không còn là mắt nữa. Một ví
dụ đơn giản dưới đây:
TÌNH HUỐNG “KO” VÀ LUẬT TRANH CHẤP
Đây là một trường hợp đặt biệt mà điều 8 phần luật đã nói. Nó được diễn tả như sau:
Bên Đen có một điểm hết khí (xem hình vẽ).
Nếu Trắng đặt quân mình vào vị trí sao thì hợp lệ vì ăn ngay một quân Đen, đồng
thời tạo ra điểm hết khí mới của Trắng. Đến lượt Đen đi, cũng lại đặt quân vào điểm hết khí
này và bắt một quân Trắng, đồng thời tạo ra một điểm hết khí mới của Đen. Hai bên cứ ăn đi
ăn lại như thế không bao giờ chấm dứt được. Nó dẫn tới sự tranh chấp vĩnh viễn khiến ván
cờ trở nên vô nghĩa. Để tránh việc này,(hiện tược “Ko”) người ta quy ước như sau: Khi một
bên ăn quân theo kiểu tranh chấp thì bên kia không được ăn lại ngay theo kiểu tranh chấp đó
mà phải đi ít nhất một nước khác rồi sau đó mới được ăn lại theo kiểu tranh chấp. Nhờ quy
định này, một bên có thể đặt một quân của mình vào giao điểm hết khí đó và chấm dứt tình
trạng ăn đi ăn lại mãi.
14 Công nghệ tri thức và ứng dụng
Lợi thế của người so với máy.
Nhìn chung, lợi thế lớn nhất của máy so với người là tốc độ tính toán và khả năng lưu
trữ lớn không thể hiện rõ ở môn cờ vây. Mức độ phân nhánh lớn khiến chiều sâu của cây
nước đi máy có thể tính không nhiều hơn người. Việc có nhiều yếu tố định tính, mập mờ
trong việc đánh giá thế trận khiến cho người có thể đánh giá thế trận tốt hơn máy nhiều.
Để có thể ra một nước đi trong các môn cờ thì việc ước lượng được thế trận và đánh
giá ảnh hưởng của nước đi lên thế trận là rất quan trọng. Tuy nhiên do đặc điểm đơn giản
của những quân cờ vây, việc đánh giá một nước đi trở thành một vấn đề rất nan giải. Một

quân cờ vây không có đặc điểm gì để đánh giá, mà phải dựa vào tương quan về vị trí giữa
những quân cờ với nhau cũng như tương quan giữa những đám quân đó trên bàn cờ. Đôi khi
chỉ một quân cũng có thể dẫn đến những kết quả rất khác nhau. Mặc dù đã có nhiều nghiên
cứu được tiến hành nhưng vẫn chưa ai đề ra được một phương pháp đánh giá nào thật sự
hiệu quả và chính xác hơn các quyết định của những kỳ thủ chuyên nghiệp.
Một đặc điểm quan trọng nữa là các quân trong bàn cờ vây ít thay đổi. Nếu như ở cờ
vua hoặc cờ tướng, sau mỗi nước người chơi phải ghi nhận 2 hoặc 3 thay đổi trên bàn cờ
(chỗ trống mà quân di chuyển đang chiếm giữ sẽ trống đi, có một vị trí mới bị chiếm giữ và
có thể có một quân đối phương bị bắt). Đối với cờ vây, thông thường mỗi nước đi chỉ gây ra
một sự thay đổi trên bàn cờ (việc bắt quân là không phổ biến ở cờ vây, đặc biệt ở đẳng cấp
chuyên nghiệp). Như vậy người chơi không phải ghi nhớ quá nhiều về hình dạng của bàn cờ
khi tính toán các nước đi vì gần như bàn cờ trước mặt sẽ không thay đổi. Điều nay cho phép
người chơi tập trung vào việc đánh giá thế trận hơn và tính toán được nhiều nước đi hơn so
với các môn cờ khác.
Thực tế, vẫn tồn tại một số thế cờ nhất định mà để phá
thế đòi hỏi phải liên tục bắt quân. Việc đặt vào và lấy đi
thường xuyên nhiều quân khiến cho người chơi gặp khó khăn
hơn nhiều so với máy. (ví dụ như hình bên) Tuy nhiên các thế
cờ này là ít gặp trong cờ vây và thường được người chơi giải
quyết bằng kinh nghiệm luyện tập từ trước.
2)Một số đặc điểm chung của các
chương trình chơi cờ vây.
Cũng như các chương trình chơi cờ khác, chơi cờ vây cũng yêu cầu các kỹ thuật như
tính toán nước đi (move generation), ước lượng nước đi (move evaluation), đi thử và ước
lượng thế trận (reading, look-ahead), tìm kiếm nước đi (tree-search) v.v dĩ nhiên với một
15 Công nghệ tri thức và ứng dụng
số điều chỉnh cho phù hợp với đặc điểm của cờ vây.
Nếu trong các loại hình cờ khác, chúng ta có thể áp dụng kỹ thuật move generation
trước để có danh sách các nước đi khả thi. Tiếp đến ta ước lượng các nước đi đó (move
evaluation) bằng cách ước lượng thế trận diễn ra sau khi tiến hành nước đi này. Từ đó ta

chọn một số nước đi có tiềm năng nhất và lặp lại quá trình trên. Đến khi đạt được một độ số
nước nhất định ta sẽ dùng các kỹ thuật tree-search để tìm ra nước đi tốt nhất.
Đối với cờ vây, bàn cờ vây tiêu chuẩn có kích thước 19x19, quân cờ được đặt vào các
giao điểm (điểm khí) của những đường ngang và dọc bàn cờ. Tổng cộng có 19 x 19 = 361
giao điểm, hơn gấp 5 lần so với cờ vua hay cờ tướng. Mỗi lượt đi quân cờ có thể được đặt
tại gần như mọi điểm còn trống, điều này khiến mức độ phân nhánh (branching factor) của
cờ vây lớn hơn rất nhiều so với các loại cờ khác. Việc vét cạn tất cả các nước đi để xét là bất
khả thi với những hệ thống máy tính hiện tại. Hệ số phân nhánh cao khiến việc ước lượng
tất cả nước đi là rất khó. Thay vào đó ta sẽ bắt buộc phải tiến hành việc ước lượng thế trận
trước để rút ra một số ít những nước đi tốt nhất với thế trận hiện tại sau đó tiến hành ước
lượng những nước đi này với một độ sâu nhỏ hơn so với các môn cờ khác. Thậm chí một số
hệ thống chơi cờ vây đơn giản dựa hoàn toàn vào việc ước lượng thế trận để tìm nước đi mà
bỏ qua khâu ước lượng các nước đi này.
Việc cài đặt các kỹ thuật trên ở cờ vây cũng tương đối khác. Nếu như ở cờ vua hoặc
cờ tướng chúng ta có một số cơ sở định lượng nhất định để ước lượng thế trận – bằng cách
đánh giá trị cho những quân cờ, thì ở cờ vây việc ước lượng thế trận khá khó khăn và phải
dựa nhiều vào kỹ thuật heuristics. Cây nước đi của cờ vây cũng lớn hơn vì thế trước khi tiến
hành tìm kiếm, tree-search, một số kỹ thuật cắt tỉa cây phải được thực hiện.
Phần 3.Phân tích thiết kế
1) Thiết kế tổng quát của chương trình
Chương trình hiện tại gồm có hai module chính là giao diện người dùng và engine
chơi cờ.
16 Công nghệ tri thức và ứng dụng
Trong đó người chơi sẽ đưa ra các nước đi thông qua một bàn cờ với giao diện đồ
họa, thông tin về tọa độ của nước đi sẽ được chuyển đến AI và các nước đi của máy sẽ được
hiển thị ngược lại lên màn hình chính. Sau khi ván cờ kết thúc, module tính điểm sẽ gắn sẵn
trong AI sẽ được gọi ra và thông báo kết quả.
2) Cách biểu diễn bàn cờ.
Do bàn cờ vây khá đơn giản nên để biểu diễn bàn cờ này bên trong máy chúng ta chỉ
cần một mảng byte 2 chiều, kích thước 19x19 là đủ. Mỗi byte sẽ mang 1 trong 3 giá trị,

tương ứng với 3 trạng thái: còn trống, có quân trắng và có quân đen.
Để tiện cho việc nghiên cứu thế trận chúng ta lưu một danh sách các nhóm quân hiện
có trên bàn cờ. Vị trí của nhóm quân sẽ được đại diện bằng vị trí một quân bất kỳ thuộc
nhóm, khi cần xác định cả nhóm, ta có thể sử dụng thuật toán flood fill để xác định do các
quân của nhóm nằm kề nhau. Bên đó ta lưu cả số khí sống của nhóm và số quân có trong
nhóm. Đây là cơ sở quan trọng để chương trình xác định tình trạng mạnh yếu của nhóm từ
đó đưa ra nước đi phù hợp.
Những công việc thường gặp khi đánh cờ như kiểm tra tình trạng sống sau mỗi nước
đi, gỡ bỏ những quân bị bắt, thống kế và cập nhật danh sách các groups trên bàn cờ sẽ được
thực hiện bằng thuận toán flood fill.
3) Engine chơicờ
Do chỉ thực hiện đơn giản nên giải thuật được chương trình sử dụng để đánh cờ chỉ
bao gồm 2 kỹ thuật chính là tính toán nước đi và ước lượng thế trận. Kỹ thuật đi thử để tạo
cây nước đi nhằm tìm nước tối ưu được bỏ qua. Thay vào đó những nước đi được chọn sẽ là
ngẫu nhiên từ những nước đi tốt nhất có thể tìm được ở tình trạng hiện tại của bàn cờ.
Chương trình sẽ ước lượng thế trận dựa trên việc so khớp giữa thế cờ tại điểm đang
xét với một mảng các thế cờ có sẵn (pattern matching). Các thế cờ này là cơ sở tri thức cơ
bản của chương trình, được tham khảo phần lớn từ phần mềm waffyGo của tác giả Bill
Newmam( ). Mỗi pattern sẽ được xét tại từng điểm khí trên
bàn cờ, , với cú pháp sau:
PATTERN,
3, 22,
3 phần tử đầu tiên gồm:
- Ký hiệu bắt đầu một pattern
- Số điểm khí cần xét
- Độ ưu tiên, giá trị của pattern
17 Công nghệ tri thức và ứng dụng
-1, 0,
F_BLACK,
Với mỗi 3 tham số tiếp theo:

- 2 tham số đầu là tọa độ tương đối của điểm khí
cần xét so với điểm khí hiện tại
- Tham số thứ 2 là tình trạng báo hiệu của
pattern
Ví dụ ở hàng -1, 0, F_BLACK có nghĩa pattern này
bao gồm một quân đen tại vị trí bên trái điểm hiện tại
1, -1,
F_BLACK,
0, -1,
F_WHITE,
Danh sách PATTERN:
int[] patterns =
{ PATTERN, /*a code for the
beginning of a pattern*/
4, 24, /*Three points, basic
urgency 24. Urgency is highest */
/* for lower numbers.
Original values: */
/* capturing an enemy
group=16, */
/* defending one of
ours= 20, */
/* atariing an enemy
group= 32 */
-1, 0, F_BLACK|F_OFF,
/*Recognize the pattern by black stone at (x-
1, y+0) */
/* or that point off the
board, */
1, 0, F_BLACK, /* a black

stone at (x+1, y+0), and */
0, -1, F_WHITE, /* a white
stone at (x+0, y-1), and */
0, 1, F_EMPTY|F_WHITE, /* a
white stone or space at (x, y+1), */
/* that is: */ /* ~ */
/* ~ $ # */
/* O */
PATTERN, 3, 22, /* # $ */
-1, 0, F_BLACK, /* O # */
1, -1, F_BLACK,
0, -1, F_WHITE,
PATTERN, 5, 26, /* # O #
*/
-1, 1, F_BLACK|F_OFF, /* $
. */
1, 1, F_BLACK, /* */
0, 1, F_WHITE, /* ~ */
1, 0, F_EMPTY,
0, -3, F_EMPTY|F_WHITE,
/*This so that we don't get trapped in
*/
/* an extremely
18 Công nghệ tri thức và ứng dụng
common pattern against the edge */
/* of the board, or
in a shicho.*/
PATTERN, 4, 26, /* # O # */
-1, 1, F_BLACK|F_OFF, /* $
# */

1, 1, F_BLACK,
1, 0, F_BLACK,
0, 1, F_WHITE,
PATTERN, 6, 24, /* ~ */
-1, 0, F_BLACK, /* # $ . # */
0, -1, F_WHITE, /* O */
1, 0, F_EMPTY,
1, -1, F_EMPTY,
2, 0, F_BLACK,
0, 1, F_EMPTY|F_WHITE,
PATTERN, 5, 27, /* ~ */
-1, 0, F_BLACK, /* # $ . ~ */
0, -1, F_WHITE, /* O */
1, 0, F_EMPTY,
2, 0, F_OFF,
0, 1, F_EMPTY|F_WHITE,
PATTERN, 5, 24, /* # . $ . #
*/
-2, 0, F_BLACK, /* O */
-1, 0, F_EMPTY,
0, -1, F_WHITE,
1, 0, F_EMPTY,
2, 0, F_BLACK,
PATTERN, 5, 30, /* # . $ . ~
*/
-2, 0, F_BLACK, /* O
*/
-1, 0, F_EMPTY,
0, -1, F_WHITE,
1, 0, F_EMPTY,

2, 0, F_OFF,
PATTERN, 7, 26, /*
~ . */
-1, 0, F_BLACK, /* #
$ # O */
1, -1, F_WHITE, /*
~ O */
1, 0, F_BLACK,
2, 0, F_WHITE,
1, 1, F_EMPTY,
0, 1, F_EMPTY|F_WHITE,
0, -1, F_EMPTY|F_WHITE,
PATTERN, 8, 26, /* ~
# O */
-1, -1, F_BLACK|F_EMPTY,
/* # . $ */
-2, 0, F_BLACK, /* ~
~ ~ */
19 Công nghệ tri thức và ứng dụng
-1, 0, F_EMPTY,
-1, 1, F_BLACK,
0, 1, F_WHITE,
0, -1, F_BLACK|F_EMPTY,
-2, -1, F_BLACK|F_EMPTY,
-2, 1, F_BLACK|F_EMPTY,
PATTERN, 4, 26, /* . */
0, 2, F_EMPTY, /* # # */
-1, 1, F_BLACK, /* $ O */
1, 1, F_BLACK,
1, 0, F_WHITE,

PATTERN, 4, 24, /* . */
0, 1, F_EMPTY, /* $ */
-1, -1, F_WHITE, /* O # O */
0, -1, F_BLACK,
1, -1, F_WHITE,
PATTERN, 4, 24, /* . */
0, 1, F_EMPTY, /* $ O */
-1, -1, F_WHITE, /* O # */
0, -1, F_BLACK,
1, 0, F_WHITE,
PATTERN, 4, 26, /* O */
0, 1, F_EMPTY, /* O . O */
-1, 1, F_WHITE, /* $ */
1, 1, F_WHITE,
0, 2, F_WHITE,
PATTERN, 8, 24, /* O */
-2, 0, F_EMPTY|F_BLACK, /*
~ $ # O */
0, -1, F_EMPTY, /* . . . */
1, -2, F_OFF, /* ~ */
1, -1, F_EMPTY,
1, 0, F_BLACK,
1, 1, F_WHITE,
2, -1, F_EMPTY,
1, 0, F_WHITE,
PATTERN, 8, 28, /* . # O */
-1, 0, F_EMPTY, /* . $ # O */
0, -1, F_EMPTY, /* . . */
0, 1, F_BLACK,
1, 0, F_BLACK,

1, 1, F_WHITE,
2, 0, F_WHITE,
-1, 1, F_EMPTY,
1, -1, F_EMPTY,
PATTERN, 8, 23, /* # # */
0, 2, F_BLACK, /* . # */
1, 2, F_BLACK, /* ~ $ . # */
2, 0, F_BLACK, /* ~ */
2, 1, F_BLACK,
1, 0, F_EMPTY,
0, 1, F_EMPTY,
20 Công nghệ tri thức và ứng dụng
-1, 0, F_EMPTY|F_BLACK|
F_WHITE,
0, -1, F_EMPTY|F_WHITE,
PATTERN, 8, 24, /* O O */
0, 2, F_WHITE, /* . O */
1, 2, F_WHITE, /* ~ $ . O */
2, 0, F_WHITE, /* ~ */
2, 1, F_WHITE,
1, 0, F_EMPTY,
0, 1, F_EMPTY,
-1, 0, F_EMPTY|F_WHITE|
F_BLACK,
0, -1, F_EMPTY|F_BLACK,
PATTERN, 8, 34, /* ~ # # */
-1, 1, F_BLACK, /* # . # */
-1, 0, F_BLACK, /* # $ */
0, 2, F_BLACK, /* ~ */
0, 1, F_EMPTY,

1, 1, F_BLACK,
1, 2, F_BLACK,
-1, 2, F_BLACK|F_EMPTY,
0, -1, F_WHITE|F_EMPTY,
PATTERN, 7, 34, /* ~
# ~ */
-1, 1, F_BLACK, /* # .
# */
-1, 0, F_BLACK|F_EMPTY,
/* ~ $ */
-1, 2, F_BLACK|F_EMPTY,
0, 2, F_BLACK,
0, 1, F_EMPTY,
1, 1, F_BLACK,
1, 2, F_BLACK|F_EMPTY,
PATTERN, 10, 27, /* . . . */
/*(This is Wally's fuseki for */
-2, 0, F_BLACK, /* # . $ . #
*/ /* a 9 x 9 board with 4 handicap */
2, 0, F_BLACK, /* . . . */
/* stones.)*/
-1, 0, F_EMPTY,
1, 0, F_EMPTY,
-1, 1, F_EMPTY,
0, 1, F_EMPTY,
1, 1, F_EMPTY,
-1, -1, F_EMPTY,
0, -1, F_EMPTY,
1, -1, F_EMPTY,
PATTERN, 6, 25, /* # . #

*/
-1, 1, F_BLACK, /* ~ . $
*/
-1, -1, F_BLACK, /* #
*/
1, 1, F_BLACK,
0, 1, F_EMPTY,
-1, 0, F_EMPTY,
-2, 0, F_EMPTY|F_BLACK|
21 Công nghệ tri thức và ứng dụng
F_OFF,
PATTERN, 5, 35, /* O #
*/
-1, 0, F_EMPTY, /* . $ ~ */
0, 1, F_WHITE, /* ~ */
1, 1, F_BLACK,
0, -1, F_OFF,
0, 1, F_BLACK|F_EMPTY,
PATTERN, 5, 40, /* O #
*/
-1, 0, F_EMPTY, /* . $ ~ */
-1, 1, F_WHITE, /* ~ */
0, 1, F_BLACK,
0, -1, F_OFF,
1, 0, F_WHITE|F_EMPTY,
PATTERN, 6, 38, /* O . #
*/
-1, 1, F_WHITE, /* $ . */
1, 1, F_BLACK, /* . */
0, 1, F_EMPTY, /* ~ */

1, 0, F_EMPTY,
0, -1, F_EMPTY,
0, -2, F_OFF|F_BLACK,
PATTERN, 6, 38, /* . # */
-1, 0, F_WHITE, /* O $ .
*/
1, 1, F_BLACK, /* . */
0, 1, F_EMPTY, /* ~ */
1, 0, F_EMPTY,
0, -1, F_EMPTY,
0, -2, F_OFF|F_BLACK,
/*
some patterns for a 19 x 19 board,
which is a little different from
the high handicap 9 x 9 game this
program originally played
*/
PATTERN, 11, 29, /* O */
-2, 0, F_EMPTY|F_BLACK, /*
~ $ # O */
0, -1, F_EMPTY, /* . . . */
1, -2, F_OFF, /* ~ ~ ~
*/
1, -1, F_EMPTY, /* ~ */
1, 0, F_BLACK,
1, 1, F_WHITE,
2, -1, F_EMPTY,
-1, -2, F_EMPTY|F_OFF,
0, -2, F_EMPTY|F_OFF,
1, -2, F_EMPTY|F_OFF,

1, 0, F_WHITE,
PATTERN, 12, 38, /* ~ # */
-1, 0, F_WHITE, /* O $ ~ ~
*/
22 Công nghệ tri thức và ứng dụng
1, 1, F_BLACK, /* ~ ~ ~
*/
0, 1, F_EMPTY|F_BLACK,/*
~ ~ ~ */
1, 0, F_EMPTY|F_WHITE,/*
~ */
0, -3, F_OFF,
0, -1, F_EMPTY|F_BLACK,
0, 2, F_EMPTY|F_BLACK|
F_OFF,
1, -1, F_EMPTY|F_BLACK|
F_OFF,
2, -1, F_EMPTY|F_BLACK|
F_OFF,
0, -2, F_EMPTY|F_BLACK|
F_OFF,
1, -2, F_EMPTY|F_BLACK|
F_OFF,
2, -2, F_EMPTY|F_BLACK|
F_OFF,
PATTERN, 12, 38, /* # ~ */
-1, 0, F_WHITE, /* O $ ~ ~
*/
0, 1, F_BLACK, /* ~ ~ ~
*/

1, 1, F_EMPTY|F_BLACK,/*
~ ~ ~ */
1, 0, F_EMPTY|F_WHITE,/*
~ */
0, -3, F_OFF,
0, -1, F_EMPTY|F_BLACK,
0, 2, F_EMPTY|F_BLACK|
F_OFF,
1, -1, F_EMPTY|F_BLACK|
F_OFF,
2, -1, F_EMPTY|F_BLACK|
F_OFF,
0, -2, F_EMPTY|F_BLACK|
F_OFF,
1, -2, F_EMPTY|F_BLACK|
F_OFF,
2, -2, F_EMPTY|F_BLACK|
F_OFF,
/*
Let's not just pass when
confronted by
an empty 19 x 19 board hence
the following patterns
*/
PATTERN, 15, 25, /* ~
*/
0, 1, F_EMPTY, /* ~ ~
*/
0, 2, F_EMPTY, /* . . .
*/

1, 0, F_EMPTY, /* . . . .
*/
1, 1, F_EMPTY, /* . $ . .
*/
1, 2, F_EMPTY, /* . .
*/
2, 0, F_EMPTY,
2, 1, F_EMPTY,
23 Công nghệ tri thức và ứng dụng
2, 2, F_EMPTY,
4, 3, F_OFF,
3, 4, F_OFF,
-1, 0, F_EMPTY,
-1, 1, F_EMPTY,
0, -1, F_EMPTY,
1, -1, F_EMPTY,
3, 3, F_EMPTY|F_WHITE|
F_BLACK,
PATTERN, 10, 29,
-1, 0, F_EMPTY, /* ~
*/
-1, 1, F_EMPTY, /* ~ ~
*/
0, -1, F_EMPTY, /* . . .
*/
1, -1, F_EMPTY, /* . $ .
*/
0, 1, F_EMPTY, /* . .
*/
1, 0, F_EMPTY,

1, 1, F_EMPTY,
2, 2, F_EMPTY|F_WHITE|
F_BLACK,
3, 2, F_OFF,
2, 3, F_OFF,
PATTERN, 17, 29, /* . . .
*/
0, 1, F_EMPTY, /* . . .
*/
0, -1, F_EMPTY, /* ~ . $ .
~ ~ */
1, 0, F_EMPTY, /* . . .
*/
-1, 0, F_EMPTY, /* . . .
*/
1, 1, F_EMPTY,
1, -1, F_EMPTY,
-1, 1, F_EMPTY,
-1, -1, F_EMPTY,
-1, 2, F_EMPTY,
0, 2, F_EMPTY,
1, 2, F_EMPTY,
-1, -2, F_EMPTY,
0, -2, F_EMPTY,
1, -2, F_EMPTY,
3, 0, F_WHITE|F_BLACK|
F_EMPTY,
4, 0, F_OFF|F_BLACK,
-2, 0, F_WHITE|F_EMPTY,
PATTERN, 12, 31, /* . . .

*/
0, 1, F_EMPTY, /* . $ .
*/
0, -1, F_EMPTY, /* ~ . . . ~
*/
1, 0, F_EMPTY, /* ~
*/
-1, 0, F_EMPTY, /* ~
*/
24 Công nghệ tri thức và ứng dụng
1, 1, F_EMPTY,
1, -1, F_EMPTY,
-1, 1, F_EMPTY,
-1, -1, F_EMPTY,
-2, -1, F_EMPTY|F_BLACK,
2, -1, F_EMPTY|F_BLACK,
0, -2, F_EMPTY|F_BLACK|
F_WHITE,
0, -3, F_OFF,
PATTERN, 22, 33, /* ~ ~ #
*/
0, 1, F_EMPTY, /* . . . . .
*/
0, -1, F_EMPTY, /* . . $ . .
*/
1, 0, F_EMPTY, /* . . . . .
*/
-1, 0, F_EMPTY, /* . . . . .
*/
1, 1, F_EMPTY,

1, -1, F_EMPTY,
-1, 1, F_EMPTY,
-1, -1, F_EMPTY,
2, -2, F_EMPTY,
-2, -2, F_EMPTY,
0, 2, F_BLACK,
0, -2, F_EMPTY,
2, 0, F_EMPTY,
-2, 0, F_EMPTY,
2, 1, F_EMPTY,
2, -1, F_EMPTY,
-2, 1, F_EMPTY,
-2, -1, F_EMPTY,
1, -2, F_EMPTY,
-1, -2, F_EMPTY,
-1, 2, F_EMPTY|F_WHITE,
-2, 2, F_EMPTY|F_WHITE,
PATTEND

Nếu tại một điểm nào đó ta phát hiện một pattern, điểm đó sẽ là lựa chọn cho nước đi
tiếp theo. Những nước đi tìm được từ các pattern có cùng độ ưu tiên cao nhất sẽ được cho
vào một danh sách nước đi cho bước xử lý tiếp theo. (Danh sách đầy đủ các pattern có thể
được tìm thấy trong source code.
Sau khi có danh sách các nước đi, đầu tiên chương trình sẽ xét theo thứ tự:
1- Những nước đi có độ ưu tiên từ 0->15.
2- Những nước đi có thể chẹt chết được quân của đối phương. Các nước này được
sắp theo độ ưu tiên chính bằng với số quân bắt được
3- Những nước đi có độ ưu tiền từ 16->23
25 Công nghệ tri thức và ứng dụng
4- Phòng thủ những nhóm quân yếu nhất của mình

5- Những nước đi có độ ưu tiên từ 24->33
6- Những nước đi còn lại
7- Những nước đi có khả năng phá đất của đối phương.
Nếu không có khả năng nào xảy ra trong 7 khả năng trên có nghĩa ván cờ đã đến lúc
kết thúc
Phần 4.Kết quả và hướng phát triển
Chương trình được viết trong môi trường:
- Microsoft Visual Studio 2010
- .Net Framework 3.5
- Sử dụng WPF
Sử dụng WPF cho phép chương trình có thể tự vẽ ra các hiệu ứng đổ bóng, tô màu
gradient một cách đơn giàn hơn, cho phép tạo ra giao diện bóng bẩy chỉ bằng những dòng
code và không phải sử dụng một hình ảnh nào. Điều này giúp đảm bảo tính chất nhỏ gọn
của chương trình (nhỏ hơn 100KB).
Toàn bộ bàn cờ sẽ được vẽ bằng hàm DrawRectangle, DrawEllipse, DrawText, và
DrawGeometry. Ngoài khả năng giảm kích thước chương trình, việc tạo hình hoàn tòa bằng
code cho phép giao diện có thể được điều chỉnh sang bất cứ kích thước nào mà không bị ảnh
hưởng giống như khi dùng ảnh raster tĩnh.

×