You are on page 1of 16

BÁO CÁO BÀI TẬP LỚN

Môn: Trí tuệ nhân tạo


Đề tài: Xây dựng game cờ Caro

Sinh viên thực hiện:


1. Nguyễn Hữu Giáp
2. Lê Quốc Lập
3. Mạc Đình Hiếu
4. Đỗ Trung Hiếu

Giảng viên hướng dẫn: PGS Lê Thanh Hương

1
Mục lục

Lời mở đầu..................................................................................................................................................3
I. Giới thiệu đề tài “Game Caro”.............................................................................................................4
II. Thuât toán MiniMax và thuật toán cắt cụt Alpha-Beta........................................................................5
1. Thuật toán MiniMax.......................................................................................................................5
2. Thuật toán cắt cụt alpha-beta.........................................................................................................6
3. Hàm đánh giá...................................................................................................................................8
III. Cài đặt chương trình........................................................................................................................9
1. Lớp Board........................................................................................................................................9
2. Lớp CaroAI.....................................................................................................................................10
3. Lớp Result......................................................................................................................................12
IV. Giao diện chương trình..................................................................................................................12
V. Kết luận..............................................................................................................................................12
VI. Tài liệu tham khảo.........................................................................................................................13

2
Lời mở đầu
Hiện nay, việc ứng dụng trí tuệ nhân tạo vào việc phát triển game đã trở
nên vô cùng phổ biến, đặc biệt là những game mang tính trí tuệ cao. Và cờ Caro là
một game như vậy. Chính vì lý do đó mà chúng em đã quyết định lựa chọn cờ
Caro làm để tài cho bài tập lớn môn trí tuệ nhân tạo. Đây là tài liệu dùng để miêu
tả một cách cơ bản về việc xây dựng game cờ Caro. Trong game có sử dụng thuật
toán MiniMax với độ sâu là 4 và thuật toán cắt cụt alpha-beta để giảm thời gian
tính toán. Tài liệu này giúp ta có một cái nhìn tổng quát về việc áp dụng thuật
toán MiniMax và cắt cụt alpha-beta vào game cờ Caro. Do thời gian có hạn nên
chúng em chưa thể tối ưu được các thuật toán sử dụng trong game, nhưng chúng
em sẽ cố gắng hoàn thiện trong thời gian sớm nhất.

Nhóm thực hiện đề tài này với mục đích xây dựng game Caro có tính nhân tạo
cao. Tuy nhiên trong quá trình thực hiện không thể tránh khỏi có những sai sót,
chúng em rất mong nhận được những góp ý và đánh giá của cô.

3
I. Giới thiệu đề tài “Game Caro”
Game gồm có 2 người chơi, một người cầm quân X, một người cầm quân O.
Hai người chơi sẽ lần lượt đưa đánh quân tương ứng của mình trên một bàn cờ
MxN ô (thường thì M = N).

Luật chơi:

Quân X là quân được đánh trước. Hai người chơi có thể đánh vào bất kỳ ô nào
trên bàn cờ miễn là ô đó chưa được đánh.
Trò chơi kết thúc khi một trong hai người chơi có 5 quân thằng hàng liên tiếp
nhau (ngang, dọc hoặc chéo).
Dưới đây là bàn cờ caro kích thước 15x15

4
II. Thuât toán MiniMax và thuật toán cắt cụt
Alpha-Beta
1. Thuật toán MiniMax
a. Nguyên lý:
 Có 2 người chơi là Min và Max.
 Một chiến lược tối ưu là một chuỗi các nước đi giúp đưa đến trạng thái
đích mong muốn.
 Chiến lược của MAX bị ảnh hưởng ( phụ thuộc ) vào các nước đi của MIN
–và ngược lại.
 MAX cần chọn một chiến lược giúp cực đại hóa giá trị của hàm mục tiêu
– với giả sử là MIN đi các nước đi tối ưu.
 Chiến lược này được xác định bằng việc xét các giá trị MINIMAX đối với
mỗi nút trong cây biểu diễn trò chơi.
 MAX chọn các nước đi tương ứng với giá trị MINIMAX cực đại ( MIN
chọn các nước đi ứng với giá trị MINIMAX cực tiểu.

b. Áp dụng vào game Caro:

Người chơi cầm quân X đóng vai trò như Max, người chơi cầm quân O đóng
vai trò như Min. Để quyết định nước đi tiếp theo, ta xây dựng một thủ tục đệ quy
gồm 2 hàm max_value() để tìm nước đi tiếp theo cho quân X, min_value() để tìm
nước đi tiếp theo cho quân O. Để giảm thời gian của giải thuật đệ quy, ta giới hạn
độ sâu của giải thuật bằng 4.
int max_value(state s, int dept){

if(terminal_test() || dept >= 4) return eval(s);

v = -∞;

for(duyệt tất cả các trạng thái con s’ của s){

v = max(v, min_value(s’, dept + 1));

5
}

return v;

int min_value(state s, int dept){

if(terminal_test() || dept >= 4 ) return eval(s);

v = +∞;

for(duyệt tất cả các trạng thái con s’ của s){

v = min(v, max_value(s’, dept + 1));

return v;

Hàm xác định trạng thái kết thúcterminal_test():

Hàm có nhiệm vụ xác định xem trò chơi có kết thúc hay không khi một quân
cờ được đánh thêm vào. Hàm hoạt động như sau:

 Từ vị trí thêm quân cờ, kiểm tra theo các chiều ngang, dọc, chéo(ví dụ
kiểm tra theo chiều ngang: giả sử quân cờ đánh vào là X, duyệt theo
hướng bên trái cho đến khi gặp quân O hoặc tường thì dừng lại, tiếp tục
duyệt theo hướng bên phải tương tự để xác định số quân X liên tiếp
nhau).
 Nếu số quân X (hoặc O) liên tiếp là 5 thì trả lại giá trị true, ngược lại trả
về giá trị false.

2. Thuật toán cắt cụt alpha-beta


Trong chiến lược Minimax với độ sâu hạn chế thì số đỉnh của cây trò chơi phải
xét vẫn còn rất lớn với h>=3. Khi đánh giá đỉnh utới độ sâu h, thuật toán
Minimax đòi hỏi phải đánh giá tất cả các đỉnh của cây gốc u với độ sâu h. Tuy
nhiên, phương pháp cắt cụt alpha-beta cho phép cắt bỏ những nhánh không cần
thiết cho việc đánh giá đỉnh u. Phương pháp này làm giảm bớt số đỉnh phải xét

6
mà không ảnh hưởng đến kết quả đánh giá đỉnh u. Ý tưởng: Giả sử tại thời điểm
hiện tại đang ở đỉnh Trắng a, đỉnh a có anh em là v đã được đánh giá. Giả sử cha
của đỉnh a là b, b có anh em là u đã được đánh giá, và cha của b là c như hình
sau:

max
c

min
u b

v a
max

Khi đó ta có giá trị đỉnh Trắng c ít nhất là giá trị của u, giá trị của đỉnh Đen b nhiều
nhất là giá trị của v. Do đó, nếu eval(u) > eval(v) ta không cần đi xuống để đánh
giá đỉnh a nữa mà vẫn không ảnh hưởng đến đánh giá đỉnh c. Hay nói cách khác,
ta có thểcắt bỏ cây con gốc a. Lập luận tương tự cho trường hợp a là đỉnh Đen,
trường hợp này nếu eval(u)<eval(v) ta cũng cắt bỏ cây con gốc a. Để cài đặt kỹ
thuật này, đối với các đỉnh nằm trên đường đi từ gốc tới đỉnh hiện thời, ta sử
dụng tham số α để ghi lại giá trị lớn nhất trong các giá trị của các đỉnh con đã
đánh giá của một đỉnh Trắng, tham số β để ghi lại giá trịnhỏ nhất trong các giá trị
của các đỉnh con đã đánh giá của một đỉnh Đen.
int max_value(state s, int dept, int alpha, int beta){

if(terminal_test() || dept >= 4) return eval(s);

v = -∞;

for(duyệt tất cả các trạng thái con s’ của s){

v = max(v, min_value(s’, dept + 1, alpha, beta));

if(v > beta) return v;

7
alpha = max(alpha, v);

return v;

int min_value(state s, int dept, int alpha, int beta){

if(terminal_test() || dept >= 4 ) return eval(s);

v = +∞;

for(duyệt tất cả các trạng thái con s’ của s){

v = min(v, max_value(s’, dept + 1, alpha, beta));

if(v < alpha) return v;

beta= min(beta, v);

return v;

3. Hàm đánh giá


Hàm đánh giá là một hàm quan trọng trong việc xây dựng trò chơi cờ caro. Hàm
này giúp cho điểm trạng thái của bàn cờ để từ đó xây dựng cây trò chơi. Việc xây
dựng hàm lượng giá hợp lý, chính xác sẽ giúp cho hệ thống có đánh giá chính xác
về trạng thái bàn cờ để đưa ra nước đi thông minh hơn.

Trong game caro, để tính điểm cho trạng thái bàn cờ ta đưa ra các tiêu chí sau:

 Trong trường hợp chắc chắn thắng, điểm cộng sẽ là +Int32.MAX_VALUE đối
với X và -Int32.MAX_VALUE đối với O.
 Trong trường hợp có nước 3, điểm cộng sẽ là +300 đối với X và -300 đối với
O
 Trong trường hợp có nước 4, điểm cộng sẽ là +600 đối với X và -600 đối với
O

8
III. Cài đặt chương trình
Chương trình gồm các lớp như sau:

1. Lớp Board

Là lớp để lưu lại trạng thái của bàn cờ

Biến:

 COLUMN, ROW: số cột và hàng của bàn cờ


 PieceState: các trạng thái có thể có của một quân cờ(X, O, chưa đánh hoặc
không hợp lệ).
 boardState: là một mảng lưu lại các trạng thái của các quân cờ.
byte[] boardState;

Hàm:

 GetPieceAt(): Lấy trạng thái của quân cờ tại một tọa độ xác đinh.
 IsOccupied(): Xác định xem tại một vị trí xác định đã có quân cờ nào đươc
đánh chưa.
 AddPiece(): Thêm một quân cờ vào bàn cờ.
 IsWinner(): Kiểm tra trạng thái hiện tại của bàn cờ đã kết thúc chưa.

9
2. Lớp CaroAI

Biến:

 MINMAX_DEPTH: độ sâu của giải thuật MiniMax


 numMoves, numComparisons: số nút con duyệt qua và số lượng phép so
sánh cần sử dụng trong giải thuật MiniMax (dùng để đánh giá thuật toán).
 computerPiece, playerPiece: dùng để xác định kiểu quân cờ của người chơi
và máy(X hay O).

Hàm:

 MinimaxHelper(): xác định nếu thêm một quân cờ vào trạng thái hiện tại
của bàn cờ có làm trạng thái hiện tại trở thành trạng thái kết thúc hay
không, nếu không thì sử dụng giải thuật MiniMax.
 MiniMax(): cài đặt giải thuật MiniMax.
private Result MiniMax(Node node, int depth, int alpha, int beta, bool
needMax) {
if (depth <= 0 || node.IsTerminalNode()) {
var result = new Result();
var score = node.GetObjectiveValue(computerPiece);
result.setScore(score);
return result;
}

var best = new Result();

foreach (var child in node.getChildren()) {

10
var result2 = MiniMax(child, depth-1, alpha, beta, !needMax);

var score = result2.getScore();


numComparisons++;
if (needMax) {
if (score > alpha) {
alpha = score;
best = new Result();
best.add(child);
best.addAll(result2.gameNodes);
}
if (beta <= alpha) {
break;
}
} else {
if (score < beta) {

best = new Result();


best.add(child);
best.addAll(result2.gameNodes);

beta = score;
}
if (beta <= alpha) {
break;
}
}
}
var retval = needMax ? alpha : beta;
best.setScore(retval);
return best;
}

11
3. Lớp Result

Biến:

 score: điểm của trạng thái bàn cờ.


 gameNodes: là một mảng chứa các nút con của nút đang xét

Hàm:

 GetMove():
 getScore(): lấy điểm của trạng thái bàn cờ.
 setScrore(): gán điểm của trạng thái bàn cờ.
 Add():

12
IV. Giao diện chương trình
1. Giao diện khi vào game

2. Giao diện khi chơi

13
3. Giao diện khi chiến thắng

14
V. Kết luận
Qua quá trình học môn trí tuệ nhân tạo và qua việc thực hiện đề tài này, chúng
em đã hiểu thêm hơn về việc ứng dụng trí tuệ nhân tạo trong việc giải quyết các
vấn đề trong thực tế. Game cờ caro là một game ứng dụng rất tốt thuật toán
Minimax và cắt cụt alpha-beta. Tuy nhiên do hạn chế về mặt thời gian nên nhóm
em chưa thể tối ưu được thuật toán, hàm tính điểm cũng chưa thật sự được tốt
như mong đợi, cũng như trong quá trình thực hiện không thể tránh khỏi sai sót.
Chúng em rất mong nhận được sự góp ý của cô để game được thật sự hoàn thiện.

Chúng em xin chân thành cảm ơn.

1. Những điều thu được trong quá trình thực hiên:


 Hiểu thêm về hai thuật toán MiniMax và cắt cụt alpha-beta
 Cài đặt được hai thuật toán trên
2. Những điều còn thiếu sót:
 Chưa tối ưu được hàm tính điểm

15
VI. Tài liệu tham khảo
 Slide bài giảng Trí tuệ nhân tạo
 http://en.wikipedia.org/wiki/Minimax
 http://en.wikipedia.org/wiki/Alpha-beta_pruning

16

You might also like