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
Trang 1
BO GIAO THONG VAN TAI TRUONG DAI HOC HANG HAI VIET NAM
`
`
y
/
Qe)
KHOA CONG NGHE THONG TIN
BAO CAO BAI TAP LON HOC PHAN :TRI TUE NHAN TAO
XÂY DỰNG TRÒ CHƠI CỞ CARO
Giảng viên bộ môn:Nguyễn Duy Trưởng Giang
Sinh viên thực hiện:
Phan Ha Mai Linh — MSV: 83741
Trang 2
L
Il
II
IV
V
¬—— EEE EEE EEE CELE EE EEE EEE LE EEE CEE E EEE; GLEE EGE; E ERG EE OE tEE Ere ee nen eaeeen ens 3
Giới thiệu đ Êtài “Game CarO”” c0 0Q 0n HH HH TH TH TH ng nh nh nh ch cư 4 Thuật toán MiniMax và thuật toán cất cụt Alpha-Beta con 4
1 Thuật toán MiniMax c2 nn SH rxt 4
2 Thuật toán cất cụt FT) 0 al 0 ch Xe 5
3 Hàm đánh giá QQ TT SE» TH nh nh nh hen 7 Cài đặt chương trình - con HT HS nh nen ko nh ch He cà nà vự 7
SEN uN‹-‹d::diddaaaiaa4ä4 9
Giao diện chương trình -.- n2 HS SH ST TH HT BE nh HE nh ke hy 10 Kết luận
Trang 3Loi me di
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à em đã quyết định lựa chọn co Caro lam dé tai cho bai tap 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 em chưa thể tối ưu được các thuật toán sử dụng trong game, nhưng em sẽ cố gắng hoàn thiện
trong thởi gian sớm nhất Em 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 th ¥
Trang 4I.Giới thiệu đềtài “Game Caro”
Game g ồn có 2 người chơi, một người cần quân X, một người cần 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 ban co’ MXN 6 (thuong thi 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
IILThuâ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 MỊN —và ngược lại
MAX c3 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
Trang 5O MAX chon cac nuce đi tương ứng với giá trị MINIMAX cực dai ( MIN chọn các nước đi ứng với giá trị MINIMAX cực tiểu
Áp dụng vào game Caro:
Người chơi cân quân X đóng vai trò như Max, người chơi cần 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ân 2 hàm max_ value() để tìm nước đi tiếp theo cho quân X, min_valueQ để tìm nước đi tiếp theo cho quân O Để giảm thoi gian của giải thuật đệ quy, ta giới hạn độ sâu của giải thuật bang 4
int max_value(state s, int dept){
if(terminal_testQ || dept >= 4) return eval(s);
v= -_œ;
for(duyệt tất cả các trạng thái con s” của s)4
Vv = max(v, min_value(s’, dept + 1));
Ỳ
return v;
t
int min_value(state s, int dept){
if(terminal_test() Il dept >= 4 ) return eval(s);
v= +0;
for(duyệt tất cả các trạng thái con s” của s)4
Vv = min(v, max_value(s’, dept + 1));
Ỳ
return v;
Ỳ
Hàm xác định trạng thái kết thúc terminal_ testQ:
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:
[1 Từ vị trí thêm quân cở, kiểm tra theo các chỉ ti ngang, dọc, chéo(ví dụ kiểm tra theo
chỉ li ngang: giả sử quân co đá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ì đừ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)
H1 Nếu số quân X (hoặc ©) 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ỏ 5
Trang 6nhữ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 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
Q
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 `âi nhất là giá trị của v Do đó, nếu eval(u) > eval(v) ta không c3n đ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)4
Vv = max(v, min_value(s’ , dept + 1, alpha, beta));
Ỳ
if(v > beta) return v;
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)4
Vv = min(v, max_value(s’ , dept + 1, alpha, beta));
Ỳ
Trang 7if(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 êtrang 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:
-In32.MAX_VALUE đối với O
[1 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 [1 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
IH Cài đặt chương trình
Chương trình g ồn các lớp như sau:
1.Lớp Board
COLUMN: int {readOnly}
ROW: int {readOnly}
PieceState{ Null, X, O , Invalid}: enum
boardState: PieceState[]
GetPieceAt(int, int) : PeceState
IsOccupied(int, int) : boolean
saddPiece(int, int, PieceStste) : boolean
IsWinner(PieceState) : boolean
Là lớp để lưu lại trạng thái của bàn co
Biến:
lệ)
[1 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:
7
Trang 8[1 IsOccupiedQ: Xác định xem tại một vị trí xác định đã có quân co nào được đánh chưa
[1 IsWinnerQ: Kiểm tra trạng thái hiện tại của bàn cở đã kết thúc chưa
2.Lớp CaroAI
CaroAl
+ MINMAX_DEPTH: int {readOnly}
numMoves: int
numComparsons: ínt
computerPiece: PieceStste
pisyerPiece: PieceStste
MiniMax(Node, int, int, int, boo!) : Result
GetMove(Board) : Move
Bién
O MINMAX_DEPTH: dé sau cta giai thuat MiniMax numMoves,
thuật MiniMax (dùng để đánh giá thuật toán)
hay O)
Ham:
MinimaxHelper(Q: 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
MiniMaxQ: 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.GetObjective Value(computerPiece);
result.setScore(score);
return result;
Ỳ
var best = new Result();
foreach (var child in node getChildrenQ) {
Trang 9var 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;
Ỳ
3.Lớp Result
gameNodes: Node[]
GetMove() : Move
getScore() : int
setScore() : int
sdd(Node) : void
sddAlWArrayList) : void
Trang 1010
Bién:
Hàm:
IV Giao diện chương trình
1 Giao diện khi vào game
RE
“oo
2 Giao dién khi choi
Trang 1111
3 Giao diện khi chiến thắng
jiic»- coong,
De
| Player
V Kết luận
Trang 1212
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 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 Em rất mong nhận được sự góp ý của th%% để game được thật sự
hoàn thiện
Em xin chân thành cảm ơn:
1 Những đi`âi thu được trong quá trình thực hiên:
O Cài đặt được hai thuật toán trên
2 Những đi âi còn thiếu sót: