Trò chơi Dodgem game được tạo ra gồm có hai quân Đen và hai quân Đỏ được xếp vào bàn cờ 3*3 hình vẽ.. Trò chơi kết thúc khi 1 trong 2 người chơi đưa được hết các quân cờ của mình ra ngoà
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÀI TẬP LỚN NHẬP MÔN TRÍ TUỆ NHÂN TẠO
ĐỀ TÀI : TRÒ CHƠI DODGEM
ỨNG DỤNG THUẬT TOÁN MINIMAX VÀ ALPHA BETA PRUNNING
GV hướng dẫn: TS NGUYỄN NHẬT QUANG Sinh viên thực hiện:
1 Nguyễn Văn Hòa MSSV: 20081020
2 Lê Bá Huy MSSV: 20081131
3 Thân Văn Quang MSSV: 20082082
4 Nguyễn Hoàng Việt MSSV: 20083139 Lớp: TTM- K53
Trang 2LỜI NÓI ĐẦU
Đây là tài liệu dùng để biểu diễn cơ bản thiết kế và xây dựng “Trò chơi Dodgem” sử dụng thuật toán MiniMax và Alpha beta pruning do nhóm em thiết kế và lập trình Tài liệu này giúp ta có cái nhìn toàn vẹn về các chức năng của phần mềm cũng như ứng dụng thuật toán MiniMax và Alpha beta prunning để giải quyết bài toán này Do thời gian có hạn nên đồ án không thể tối ưu được toàn bộ các trạng thái bài toán Tuy nhiên, nhóm sẽ nghiên cứu hoàn thiện trong thời gian sớm nhất
Nhóm thực hiện đề tài nhằm mục đích xây dựng một trò chơi ứng dụng giải trí và có tính
“ nhân tạo “ khá cao Trong quá trình thực hiện đề tài không tránh khỏi những sai sót, nhóm em mong sẽ nhận được sự góp ý và đánh giá của thầy
Sinh viên thực hiện
Nguyễn Văn Hòa
Lê Bá Huy Thân Văn Quang Nguyễn Hoàng Việt
Trang 3Mục lục
Phần 1: Giới thiệu trò chơi Dodgem 4
Phần 2 : Thuật toán MiniMax và Alpha beta pruning 5
2.1 Thuật toán MiniMax 5
2.2 Thuật toán Alpha beta pruning 7
3.1 Hàm đánh giá 1 11
3.2 Hàm đánh giá 2 12
Phần 4 : Cài đặt chương trình 13
4.1 Cell 13
4.2 Grid 13
4.3 Computer 15
4.4 GameManager 16
Phần 5: Giao diện chương trình 17
Phần 6: Kết luận 18
Phần 7: Tài liệu tham khảo 19
Trang 4Phần 1: Giới thiệu trò chơi Dodgem
Dodgem game là một chess game, giống như cờ Caro hay cờ tướng… Mỗi game đều
có 2 người chơi Một người là Min, người còn lại sẽ là Max Hai người chơi sẽ thay phiên nhau đưa ra các nước đi của mình theo một quy luật nào đó
Trò chơi Dodgem game được tạo ra gồm có hai quân Đen và hai quân Đỏ được xếp vào bàn cờ 3*3 (hình vẽ)
Luật chơi:
Quân Đen: được phép đi lên trên, sang phải hoặc xuống dưới.Quân Đen có
thể được đưa ra ngoài khi ở cột ngoài cùng bên phải
Quân đỏ: được phép đi lên trên, sang trái hoặc sang phải.Quân Đỏ có thể
đưa được ra ngoài khi ở hàng trên cùng của bàn cờ
Trò chơi kết thúc khi 1 trong 2 người chơi đưa được hết các quân cờ của mình ra ngoài hoặc chặn không cho quân đối phương di chuyển (thì được coi là chiến thắng)
Trang 5Phần 2 : Thuật toán MiniMax và Alpha beta pruning
2.1 Thuật toán MiniMax
Nguyên lý:
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á nước đi ứng với giá trị MINIMAX cực tiểu
Áp dụng vào trò chơi DODGEM
Với Quân Đen, ta chọn Max(các children), Quân Đỏ, ta tìm Min(các children) Từ hình vẽ trên, ta xây dựng các thủ tục đệ quy, gồm 2 hàm, MaxVal() đại diện cho Quân Đen, nhằm tìm nước đi tối ưu cho mình ( Max(children) ), ngược lại, MinVal() đại diện cho Quân
Đỏ, tìm Min(Children) cho mình
Trang 6int MinVal( dept, beta)
{
int p;
if( GameOver() or dept > maxdept)
return;
int min = vô cung lon
for moi vi tri cua quan den
{
1 Di chuyen sang o lan can
2 IF (dept = maxdept ) p=getpoint() ;
3 Else p=MaxVal ( dept +1, beta)
4 If ( beta >= p ) beta =p;
5 Cho quan den ve vi tri cu
}
return beta;
}
int MaxVal( dept, alpha)
{
int p;
if( GameOver() or dept > maxdept)
return;
int max = vô cung bé
for moi vi tri cua quan do
{
1 Di chuyen sang o lan can
2 IF (dept = maxdept ) p=getpoint() ;
3 Else p=MinVal ( dept +1, beta)
4 If ( alpha <= p ) alpha =p;
5 Cho quan do ve vi tri cu
}
return alpha;
}
Trang 7Với maxdept là độ sâu tối đa sẽ duyệt đến.Maxdept càng lớn ( duyệt càng sâu ) thì càng tiến gần đến thắng lợi Biến dept được khởi tạo giá trị là 0 Như vậy Computer đóng vai trò là quân đỏ ( Min ) nó sẽ gọi đến hàm MinVal
2.2 Thuật toán Alpha beta pruning
Trong chiến lược tìm kiếm Minimax, để tìm kiếm nước đi tốt cho Trắng tại trạng thái u, cho dù ta hạn chế không gian tìm kiếm trong phạm vi cây trò chơi gốc u với độ cao h, thì
số đỉnh của cây trò chơi này cũng rất lớn với h >= 3
Chẳng hạn, trong cờ vua, nhân tố nhánh trong cây trò chơi trung bình khoảng 35, thời gian đòi hỏi phải đưa ra nước đi là 150 giây, với thời gian này trên máy tính thông thường chương trình của bạn chỉ có thể xem xét các đỉnh trong độ sâu 3 hoặc 4
Một người chơi cờ tr.nh độ trung bình cũng có thể tính trước được 5, 6 nước hoặc hơn nữa, và do đó chương trình của bạn mới đạt trình độ người mới tập chơi!
Khi đánh giá đỉnh u tới độ sâu h, một thuật toán Minimax đòi hỏi ta phải đánh giá tất cả các đỉnh của cây gốc u tới độ sâu h Song ta có thể giảm bớt số đỉnh cần phải dánh giá mà vẫn không ảnh hưởng gì đến sự đánh giá đỉnh u Phương pháp cắt cụt alpha-beta cho phép
ta cắt bỏ các nhánh không cần thiết cho sự đánh giá đỉnh u
Tư tưởng của kỹ thuật cắt cụt alpha-beta là như sau:
Nhớ lại rằng, chiến lược tìm kiếm Minimax là chiến lược tìm kiếm theo độ sâu
Giả sử trong quá trính tìm kiếm ta đi xuống đỉnh a là đỉnh Trắng, đỉnh a có người anh em
v đã được đánh giá
Trang 8Giả sử cha của đỉnh a là b và b có người anh em u d được đánh giá, và giả sử cha của b là c(Xem hình trên)
Khi đó ta có giá trị đỉnh c (đỉnh Trắng) ít nhất là giá trị của u, giá trị của đỉnh b (đỉnh Đen) nhiều nhất là giá trị 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 gì dế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, trong trường hợp này nếu eval(u) < eval(v) ta cũng có thể cắt bỏ cây con gốc a
Cụ thể hơn, ta có hình bên dưới
Trong khi, ta đang cố tìm giá trị cho A, Chúng ta đi xuống B, và tìm được giá trị là 6 là Min(6,9) Sau đó, ta đi qua C Từ đó, chúng ta tính được E là 4 là Max(4,-2) Do đó, C là nhỏ hơn,Ngay tại lúc này ta biết được giá trị của C là <=4, Do đó, C sẽ không được chọn bởi A là giá trị Maximum, vì A đã có B chứa giá trị 6, là giá trị chắc chắn lớn hơn bất kỳ giá trị nào của C (nếu ta tính tiếp) Do đó việc tìm giá tri Max cho F và G là không cần thiết nữa Và lúc đó, ta sẽ dừng việc sử lý trên Node C, Và ta tiếp tục tìm trên Node D… Như vậy, cho đến bây giờ ta có thể bổ sung kỹ thuật vừa nói trên vào thuật toán Minimax,
ta có được chương trình hoàn thiện như sau:
Để cài đặt kỹ thuật cắt cụt alpha-beta, đố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ố a để 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, còn tham số b ghi lại giá trị nhỏ nhất trong các đỉnh con
Trang 9để đánh giá của một đỉnh Đen Giá trị của a và b sẽ được cập nhật trong quá trình tìm kiếm a và b được sử dụng như các biến địa phương trong các hàm MaxVal(u, a, b) (hàm xác định giá trị của đỉnh Trắng u) và Minval(u, a, b) (hàm xác định giá trị của đỉnh Đen u)
int BlueValue(Board b, int depth, int alpha, int beta)
{
if ((GameOver(b) or depth>MaxDepth)
return Analysis(b)
int max = -infinity
for each legal move m in board b
{
copy b to c
make move m in board c
int x = RedValue(c, depth+1, alpha, beta)
if (x>max) max = x
if (x>alpha) alpha = x
if (alpha>=beta) return alpha
}
return max
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int RedValue(Board b, int depth, int alpha, int beta)
{
if ((GameOver(b) or depth>MaxDepth)
Trang 10int min = infinity
for each legal move m in board b
{
copy b to c
make move m in board c
int x = BlueValue(c, depth+1, alpha, beta)
if (x<min) min = x
if (x<beta) beta = x
if (alpha>=beta) return beta
}
return min
}
Trang 11Phần 3: Hàm đánh giá
Vấn đề được đặt ra là: làm sao có thể lựa chọn được nước đi tối ưu nhất dành cho mỗi lần đi?
Để làm được điều này câu trả lời là cần phải xây dựng 1 hàm đánh giá phù hợp và tối ưu
3.1 Hàm đánh giá 1
Cho điểm các ô trong bàn cờ đối với các quân cờ Đen và Đỏ như sau:
Ngoài ra, nếu quân trắng cản trực tiếp quân đen, cộng thêm 40 điểm cho quân trắng, nếu cản gián tiếp thì được cộng 30 điểm, Tương tự cho quân đen, nếu quân Đen cản trực tiếp quân Đỏ nó được thêm -40 điểm, cản gián tiếp nó được thêm -30 điểm
Ví dụ, tính giá trị bàn cờ cho 2 hình vẽ bên dưới Trong bàn cờ đầu, ta có các giá trị sau:
Trang 12vừa bị cản trực tiếp, vừa bị cản gián tiếp, Quân đỏ được thêm 70 điểm, Vậy KQ cuối cùng là: -10 + 15+70 = 75, tương tự, cho hình số 2
3.2 Hàm đánh giá 2
Hàm đánh giá 2 được cải thiện từ hàm đánh giá 1:
Do tiêu chí của bài toán là đưa được hết quân cờ ra ngoài bàn cờ vì vậy mà mỗi quân khi được đưa ra ngoài sẽ được cộng ( hoặc trừ) với một giá trị nhất định
Ngoài phần cho điểm như hàm đánh giá 1 thì với mỗi quân Đen (quân Đỏ ) được đưa ra ngoài ta sẽ công thêm -85 điểm ( 85 điểm ), vì vậy ta sẽ cho điểm các ô bên ngoài như sau:
Trang 13
Phần 4 : Cài đặt chương trình
Chương trình được cài đặt bằng ngôn ngữ C# gồm các Class như sau:
4.1 Cell
Là 1 là 1 dẫn xuất của lớp PictureBox Biểu diễn trạng thái của 1 ô trên bàn cờ
Biến :
Int x ,y ; // Tọa độ của 1 ô
Char State ; // Trạng thái của 1 ô
Bool selected; // Xem 1 ô đã được chọn hay chưa
Hàm:
Public Cell ( char type, int x, int y ) // Phương thức khởi dựng
Void state (char type ) // Xác định trạng thái của 1 ô
4.2 Grid
Trang 14Biến :
Int x, y // Tọa độ của 1 ô
Int n // Kích thước của bàn cờ
Char[,] State // Trạng thái của 1 ô tính theo tọa độ x,y
Int [,] redpoint // Điểm của quân đỏ trên bàn cờ theo tọa độ x,y
Int [,] blackpoint // Điểm của quân Đen trên bàn cờ theo tọa độ x,y
Cell [,] Matrix // Ma trận các ô
Int [] dx, dy // Xác định các ô lân cận có thể di chuyển theo luật
Int[] SelectedCell // lưu lại tọa độ của 1 ô được chọn
Hàm:
Void PanelClick(object sender, MouseEventArgs e) // Xử lý sự kiên để đưa 1 quân cờ ra ngoài
Void CellClick( int x, int y) // Xử lý sự kiện khi click vào 1 ô trên bàn cờ
Void DisableOthers() // Chuyển trạng thái của 1 ô sau 1 nước đi
Void UpdateCell() // Cập nhật bàn cờ
Public Grid(int N) // phương thưc khởi tạo dung để khởi tạo bàn cờ, cho điểm các ô
Void DrawCell() // Vẽ ô
Trang 15Public GetState() // Lấy trạng thái của bàn cờ
Public SetState () // Thiết lập trạng thái của bàn cờ
4.3 Computer
Biến :
Int [] dx, dy // Tìm đến tọa độ các ô lân cận có thể di chuyển
Int n // Kích thước bàn cờ
Int [,] S // Trạng thái của 1 ô theo tọa độ x, y
Int maxdept = 10 // Độ sâu tìm kiếm tối đa
Int INT_MAX = 2147483647
Hàm:
Int MinVal ( int dept, int alpha, int beta) // Hàm tính điểm cho MIN theo thuật toán Alpha beta pruning
Int MaxVal (int dept, itn alpha , int beta )// Hàm tính điểm cho MAX theo thuật toán
Trang 16Void Getstate () // Lấy trạng thái của bàn cờ
Void Setstate () // Thiết lập trạng thái của bàn cờ
Byte [] Solve ( byte[] state) // hàm máy tính dùng để tính toán nước đi tiếp theo
Int Getpoint() // Tính điểm tại 1 trạng thái của bàn cơ
4.4 GameManager
Biến:
Int [,] dx, dy // Tìm đến tọa độ các ô lân cận có thể di chuyển
Bool lockTimer //
Bool GameOver // Trò chơi kết thúc hay chưa
Bool Player // Biến xác định lượt chơi là người hay máy
Hàm:
Void newGame() // Chọn trò chơi mới
Void SwitchPlayer() // Đổi lượt chơi
Void Check() // Kiểm tra xem trò chơi đã kết thúc chưa, xem ai là
// người thắng
Trang 17Phần 5: Giao diện chương trình
Đây là giao diện đầu tiên mà bạn thấy khi vào Game
Để bắt đầu chơi bạn vào Game - chọn New Game
Để xem hướng dẫn Cách chơi bạn vào Help chọn Cách chơi
Sau khi vào New Game, 1 Form mới sẽ hiện ra Ở Form này bạn có thể chọn các chức năng của trò chơi như: kích thước của bàn cờ (tối đa là 15*15) , lượt chơi và Cấp độ khó dễ (Level)
Sau khi chọn xong tất cả các Tùy chọn, để bắt đầu vào chơi bạn Click vào Button Xác nhận Giao diện chính của trò chơi sẽ hiện lên:
Trang 18Phần 6: Kết luận
Qua môn học và trong quá trình tìm hiểu để thực hiện đề tài này, nhóm em đã có cái nhìn toàn diện hơn trong việc ứng dụng trí tuệ nhân tạo vào giải quyết vấn đề trong thực tế Dodgem là một trò chơi ứng dụng tốt 2 thuật toán MINIMAX và Alpha beta Prunning Tuy nhiên trong quá trình thực hiện thì chương trình không thể tránh khỏi những sai sót
và chưa thực sự tối ưu Chúng em mong được sự góp ý của thầy để có thể tiếp tục hoàn thiện hơn trong tương lai
Em xin chân thành cảm ơn
1 Những gì đã đạt được:
Biết cách cài đặt được 2 thuật toán MiniMax và Alpha beta pruning
Lập trình Window form với C#
2 Những gì chưa đạt được:
Chưa thực sự tối ưu được hàm lượng giá
Trang 19Phần 7: Tài liệu tham khảo
1 Bài giảng trí tuệ nhân tạo – Nguyễn Nhật Quang