Professional Documents
Culture Documents
3.1.1. Cấu trúc dữ liệu và cách cách biểu diễn trạng thái bài toán: .............................. 8
3.1.1.1. Cấu trúc dữ liệu biểu diễn trạng thái ô cờ trên bàn cờ: ...................................... 8
3.1.1.2. Cấu trúc dữ liệu biểu diễn thông tin bàn cờ: ...................................................... 9
3.1.1.3. Cấu trúc dữ liệu lưu trữ trạng thái bàn cờ ở mỗi bước đi ................................... 9
3.1.2. Thiết kế các thành phần chính cấu trúc class trong chương trình: ................... 10
Nhóm 3 Page 1
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
3.1.3. Thiết kế các thuật toán chính sử dụng trong chương trình: .............................. 11
3.1.3.1. Thuật toán gán giá trị tăng thêm của ô cờ trong khu vực xuất hiện quân cờ của
người chơi: ..................................................................................................................... 11
3.1.3.2. Thuật toán gán giá trị tăng thêm của ô cờ trong khu vực xuất hiện quân cờ của
máy: 12
3.1.3.3. Thuật tóan đánh giá gía trị các ô cờ (tương ứng với làm lượng giá heristic): .. 13
3.2.1. Lựa chọn ngôn ngữ để cài đặt thuật toán: ........................................................ 19
Nhóm 3 Page 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Caro là một trò chơi đối kháng điển hình: gồm 2 người chơi, đối thủ này sẽ tìm cách dành
chiến thắng trước đối thủ kia trong một số hữu hạn nước đi để tạo ra một đường năm
quân liên tiếp.Mỗi nước đi của người chơi được dựa trên trạng thái tiếp theo của trận
đấu.Nếu sau một số giới hạn nước đi, chưa ai dành chiến thắng thì xem như hoà. Caro là
một trò chơi đơn giản, gần gũi trong cuộc sống nhưng đòi hỏi sự thông minh và khéo léo
của người chơi.Ngày nay với sự phát triển của công nghệ, cũng như sự phát triển của các
hệ cơ sở tri thức, ta có thể xây dựng một chương trình cờ caro để thay thế một người chơi
trong ván cờ.Vấn đề đặt ra là sẽ xây dựng một chương trình cờ caro giữa người và máy,
máy có khả năng thay thế người chơi, và luôn tìm cách giành thắng lợi.
Do chương trình được xây dựng với bàn cờ có kích thước 20x20, nên không gian
tìm kiếm tương đối lớn. Nhóm quyết định chọn giải thuật Heristic tìm kiếm tốt nhất đầu
tiên (best first search) để giải quyết vấn đề.
Heuristic là những tri thức được rút tỉa từ những kinh nghiệm, “trực
giác con người”.
Nhóm 3 Page 3
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Trong những bài toán tìm kiếm không gian trạng thái, có 2
trường hợp cần đến Heuristic:
Vấn đề có nghiệm chính xác nhưng phí tổn tính toán để tìm ra
nghiệm là quá lớn.
Heuristic giúp tìm kiếm đạt kết quả với chi phí thấp hơn.
Thuật toán để sử dụng nó trong tìm kiếm không gian trạng thái.
Bước 1: Thu thập những tri thức về cờ caro : cách chơi, các quy định, cách
đánh tối ưu. Từ những tri thức đó ta lựa chọn thuật toán phù hợp để thể hiện các
tri thức cần thiết vào chương trình.
Nhóm 3 Page 4
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Bước 2: Từ những kiến thức thu thập được ta xây dựng thuật toán cho lựa chọn
cách đánh của máy. Nhóm lựa chọn giải thuật Heuristic dựa vào những tri thức
kinh nghiệm về những cách đi có lợi, để xây dựng tìm nước đi cho máy .
Theo kinh nghiệm, với mỗi nước đi của máy ta phải tìm cách phải chặn được
đường thắng của quân đối thủ để đối thủ không có khả năng tạo đường thắng,
máy sẽ ưu tiên chọn nước đi có khả năng tạo đường thắng cho máy cao hơn.
Nên ta định vị trí đánh tối ưu cho máy theo :
Bước 2.1: Định giá trị cho các ô còn trống trên bàn cờ (tương ứng với việc xây
dựng hàm đánh Heuristic) bằng cách: Ta lần lược duyệt qua các ô cờ theo chiều
dọc, ngang, chéo chính, chéo phụ:
Duyệt tìm những khu vực mà đối thủ hoặc máy tính có khả năng mở đường
thắng (là tạo năm ô liên tiếp của một loại cờ). Khu vực gồm năm ô liên tiếp
trong nó chỉ xuất hiện ô cờ trống và loại cờ của máy hoặc chỉ xuất hiện ô cờ
trống và quân cờ của đối thủ và tăng giá trị cho các ô cờ trống trong khu vực
đó.
Giá trị tăng thêm của ô cờ trống trong trong khu vực mà đối thủ hoặc máy tình
có khả năng tạo đường thắng phụ thuộc vào số lượng quân cờ đối thủ hoặc
quân cờ của máy xuất hiện trong khu vực đó.
Giá trị tăng thêm của từng ô cờ trống trong khu vực có khả năng thắng của
quân cờ đối thủ sẽ thấp hơn giá trị tăng thêm của ô cờ trống trong khu vực khả
năng tạo đường thắng trong khu vực quân cờ đối thủ.
Nhóm 3 Page 5
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Giá trị tăng thêm của ô trống trong khu vực có khả năng thắng xuất hiện “a”
quân cờ máy sẽ thấp hơn giá trị tăng thêm của ô trống trong khu vực xuất hiện
“b” quân cờ với ” a nhỏ hơn b”.
Tương tự, giá trị tăng thêm của ô trống trong khu vực có khả năng thắng xuất
hiên “a” quân cờ đối thủ sẽ thấp hơn giá trị tăng thêm của ô trống trong khu
vực xuất hiện “b” quân cờ đối thủ với ” a nhỏ hơn b”.
Giá trị tăng thêm của ô trống trong khu vực có khả năng thắng xuất hiên “a”
quân cờ của máy tính sẽ nhỏ hơn giá trị tăng thêm của ô trống trong khu vực
xuất hiện “b” quân cờ đối thủ nếu “a” nhỏ hơn “b” và ngược lại.
Mỗi bước đi của máy tính, thì luôn tìm cách ưu tiên mở đường thẳng cho máy
tính nếu có thể nên trong trường hợp trong khu vực có khả năng thắng xuất
hiện ô cờ đối thủ xét xem khả năng mở đường thắng trong khu vực này có bị
chặn đầu nào chưa. Nếu đã bị chặn ta chú ý trường hợp giá trị tăng thêm của ô
cờ trống trong khu vực này sẽ thấp hơp giá tri tăng thêm của ô trống trong khu
vực có khả năng mở đường thắng xuất hiện 2 quân cờ của máy.
Theo cách lập luận trên thì những ô trống trong khu vực xuất hiện càng nhiều ô
cờ đối thủ hoặc nhiều ô cờ máy tính sẽ có giá trị càng cao vì ô trống trong khu
vực này có khả năng chặn hoặc mở đường thắng cao. Và ta khởi tạo giá trị tăng
thêm của từng ô cờ trống trong các trường hợp xuất hiện quân cờ đối thủ hoặc
quân cờ của máy trong khu vực có khả năng tạo thành đường thắng như sau:
Số quân cờ đối thủ Số quân cờ của Bị chặn Giá trị tăng thêm
máy
Nhóm 3 Page 6
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
0 0 0
1 0 1
0 1 2
2 0 12
0 2 49
3 0 Bị chặn 40
0 3 789
4 0 3157
0 4 12169
Giá trị tăng thêm thể hiện mức nguy hiểm của thế cờ trong từng hợp, độ lệch giá
trị trong trường hợp trong từng trường hợp là 4 lần. Vì giá trị của từng ô trống có
thể tăng thêm khi duyệt theo đường ngang, đường dọc, chéo chính, chéo phụ, nên
ta gán giá trị lệch nhau khoảng 4 lần để đảm bảo sự an toàn.
Nhóm 3 Page 7
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Bước 2.2: Sau khi định lượng giá trị cho các ô trống thì xác định vị trí đánh cờ tối
ưu cho máy là ô cờ trống được ước lượng giá trị theo 4 chiều (ngang ,dọc, chéo chính,
chéo phụ) có giá trị cao nhất đầu tiên.
Bước 3: Tổ chức cấu trúc dữ liệu để lưu trữ các đối tượng trên bàn cờ.
Bước 4: Thiết kế giao diện cho game tương đối thân thiện với người sử dụng.
Bước 5: Lựa chọn ngôn ngữ, và cài đặt thuật toán và các hàm cần thiết vào chương
trình .
3.1.1. Cấu trúc dữ liệu và cách biểu diễn trạng thái bài toán:
3.1.1.1. Cấu trúc dữ liệu biểu diễn trạng thái ô cờ trên bàn cờ :
Mỗi ô cờ trên bàn cờ có ba trạng thái: còn trống, có quân cờ của máy,
quân cờ của đối thủ. Để lưu trữ thông tin trạng thái của từng ô cờ ta dùng
một biến enum tên “quanco” gồm ba thành phần:
enum quanco
None =0;
Nguoi=-1;
May =1;
Nhóm 3 Page 8
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
3.1.1.2. Cấu trúc dữ liệu biểu diễn thông tin bàn cờ:
Bàn cờ gồm có nhiều ô cờ liên tiếp nhau theo chiều ngang, chiều
dọc. Ứng với mỗi vị trí dòng cột trên bàn cờ là một ô cờ, trạng thái
của mỗi ô cờ được biểu diễn bởi một biến enum “quanco”. Ta sử
dụng một mảng 2 chiều 20x20 kiểu “quanco” tên “arrbanco” để lưu
trữ thông tin bàn cờ.
3.1.1.3. Cấu trúc dữ liệu lưu trữ trạng thái bàn cờ ở mỗi bước đi :
Trạng thái của mỗi bàn cờ ở từng bước đi cần lưu trữ:
Để lưu trữ trạng thái của bàn cờ ở mỗi bước đi ta sử dụng một đối
tượng Node để lưu trữ. Các thành phần của Node bao gồm :
Nhóm 3 Page 9
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Hai biến kiểu int tên “add_cl” và “add_rw” lưu chỉ số dòng
cột của ô cờ mà máy quyết định đánh.
Node()
add_rw;
add_cl;
3.1.2. Thiết kế các thành phần chính cấu trúc class trong chương trình:
Là class chứa các phương thức các hàm có chức năng chính:
Nhóm 3 Page 10
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Trong class bàn cờ có biến để lưu trữ thông tin: bàn cờ, người
giành chiến thắng, người hiện tại, trạng thái hiện tại của bàn cờ.
Là class khởi tạo đối tượng Node để lưu trữ trạng thái bàn cờ ở mỗi
bước đi, chứa các hàm có chức năng chính:
Đánh giá giá trị của các ô cờ ở trạng thái hiện tại.
Là Class gọi các sự kiện các hàm khởi tạo trò chơi, xử lý thể hiện
giao diện trò chơi.
3.1.3. Thiết kế các thuật toán chính sử dụng trong chương trình:
3.1.3.1. Thuật toán gán giá trị tăng thêm của ô cờ trong khu vực xuất
hiện quân cờ của người chơi:
Giá trị tăng thêm của một ô cờ trống trong khu vực chỉ xuất hiện
quân cờ người phụ thuộc vào số lượng quân cờ người, và các
quân cờ người trong khu vực đó có bị chặn hay không.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Input:
Output: hàm trả về một giá trị integer là giá trị tăng thêm
của ô cờ
return 197;
return 40;
3.1.3.2. Thuật toán gán giá trị tăng thêm của ô cờ trong khu vực xuất
hiện quân cờ của máy:
Giá trị tăng thêm của một ô cờ trống trong khu vực chỉ xuất hiện
quân cờ máy phụ thuộc vào số lượng quân cờ máy trong khu vực đó.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Out put: trả về giá trị giá tăng thêm của quân cờ kiểu int.
3.1.3.3. Thuật toán đánh giá giá trị các ô cờ (tương ứng với làm lượng
giá heristic):
Đánh giá giá trị của một ô cờ phải xét tổng hợp giá trị của ô cờ đó
theo 4 chiều ngang, dọc, chéo chính, chéo phụ.
Input: “ Cha” là Node lưu trạng thái hiện tại của bàn cờ.
Output: “tam” là Node lưu trạng thái hiện tại của bàn cờ và đã
cập nhật lại mảng giá trị các ô cờ.
Node Danh_Gia_Cac_O_Co_Trong(Cha)
{
Nhóm 3 Page 13
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
int so_quan_doi_thu;
int so_quan_may;
so_quan_doi_thu =0;
so_quan_may=0;
bichan =false;
so_quan_doi_thu++;
Nhóm 3 Page 14
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
tam.danhgiagiatri[i+k,j+k]+=suxuathienquancodoithu(
so_quan_doi_thu, bichan);
Nhóm 3 Page 15
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
return tam;
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Input: Node “cha” là Node lưu trạng thái của bàn cờ hiện tại.
Node TimViTriDeDanh(cha)
Giatri = Danh_Gia_Cac_O_Co_Trong(cha);
Max = giatri.danhgiagiatri[0,0];
Max =giatri.danhgiadiatri[I,j];
giatri.add_rw = i;
giatri.add_cl =j;
Nhóm 3 Page 17
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
return giatri
Tìm trên toàn bộ 5 ô cờ liên tiếp là của đối thủ hoặc của máy theo
chiếu dọc, chiều ngang, chéo chính, chéo phụ:
Nếu có 5 ô liên tiếp là cờ của máy thì máy giành chiến thắng.
Nếu có 5 ô liên tiếp là cờ của người thì người giánh chiến thắng.
int count;
Nhóm 3 Page 18
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
If cha.arrtrangthai[i, j] != quanco.None
Count =0;
return quanco.Node
Nhóm lựa chọn ngôn ngữ C # trên nền tảng WPF để hiện thực thuật toán
vài hiện thực giao diện chương trình.
Nhóm 3 Page 19
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Giao diện khi mới chạy chương trình gồm 2 nút Quit và Play:
Nếu muốn thoát khỏi chương trình thì người dùng sẽ chọn Quit.
Nếu muốn tiếp tục chương trình thì sẽ Click vào nút Play.
Nhóm 3 Page 20
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Nhóm 3 Page 21
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Khi chơi người dùng có thể chọn một trong 3 mức: Easy, Normal, Hard.
Ứng với mỗi mức sẽ có một thời gian suy nghĩ khác nhau.
3.2.2.3. Giao diện khi bắt dầu game: Giao diện khi có một người chơi
giành chiến thắng:
Khi ván cờ kết thúc, thì màn hình thì sẽ hiển thị kết quả cho người chơi là
thắng hay thua.
Chương trình cơ bản đạt được yêu cầu: xây dựng được một chương trình mà máy
có khả năng thay thế một người chơi trong ván cờ caro. Chương trình có ưu điểm
là giao diện tương đối đẹp và thân thiện với người dùng.
Nhóm 3 Page 22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cờ Ca Ro
Nhược điểm của chương trình là chưa xây dựng các chức năng lưu trữ ván cờ, lưu
lại tỷ số của người chơi.
Chương trình có thể phát triển mở rộng những chức năng trong phần nhược điểm.
Game có thể phát triển mở rộng cho ứng dụng web.
Bài giảng trí tuệ nhân tạo TS. Nguyễn Đình Thuân
Nhóm 3 Page 23
CuuDuongThanCong.com https://fb.com/tailieudientucntt