- Xe : Xe đi hay ăn quân theo đường ngang hay cột dọc , nó có thể đi từ đầu bàncờ đến hết bàn cờ không giới hạn bước đi với điều kiện không bị cản - Mã : Đi đến đỉnh đối của chữ nhật 2*3
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘIVIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
─────── * ───────
BÀI TẬP LỚN
MÔN: TRÍ TUỆ NHÂN TẠO
ĐỀ TÀI : GAME CỜ
VUA
Giáo viên hướng dẫn : Thầy Phạm Văn HảiSinh viên thực hiện :
Nhữ Đình Đức 20101421 Nguyễn Duy Phương 20102001 Trần Sỹ Đạt 20101365
Lê Đại Cát 20101151 Đào Văn Khang 20101694 Đoàn Đại Nghĩa 20101932 Nhóm : 12
Hà Nội, tháng 8 năm 2013
Trang 2M C L C ỤC LỤC ỤC LỤC
I LỜI MỞ ĐẦU 2
II NỘI DUNG 3
1 Giới thiệu bài toán 3
a Luật chơi : 3
b Yêu cầu đặt ra khi cài đặt chương trình 4
2 Thiết kế chương trình 5
a Mô thức lập trình , mô hình phát triển chương trình và ngôn ngữ sử dụng 5
b Biểu đồ usecase : 5
c Biểu đồ lớp 6
3 Giải quyết bài toán và các vấn đề gặp phải 11
a Thuật toán tìm kiếm 11
i MiniMax 11
ii Alpha-Beta cắt tỉa 13
iii Các vấn đề gặp phải trong quá trình cài đặt 19
b Hàm định trị 25
i Chiến lược 1 25
ii Chiến lược 2 26
iii Chiến lược 3 28
4 Cài đặt và chạy thử chương trình 30
III Kết luận 33
PHỤ LỤC 34
TÀI LIỆU THAM KHẢO 35
Trang 3I L I M Đ U ỜI MỞ ĐẦU Ở ĐẦU ẦU
Ngày nay với nền công nghệ thông tin đang ngày càng phát triển mạnh mẽ với sựphát triển khoa học công nghệ Trong thời kỳ hội nhập ngành công nghệ thông tinđóng vai trò quan trọng không thể thiếu đối với sự phát triển kinh tế của đất nước Vàmột phần quan trọng là việc áp dụng trí tuệ nhân tạo vào nền tự động hóa và tư duycao như hiện nay như robot thông minh , ngành công nghiệp tự động hóa và đời sống.Bên cạnh đó ưng dụng phát triển game là một trong nhưng ngành áp dụng phổ biếncác thành tựu trong trí tuệ nhân tạo Vậy trí tuệ nhân tạo là gì ?
Thuật ngữ trí tuệ nhân tạo (Artifical Intellegence) được Jonh MeCarthly đưa ra tronghội thảo ở Darthouth vào mùa hè năm 1956 Đã có rất nhiều định nghĩa khác nhau vềtrí tuệ nhân tạo Với trí tuệ nhân tạo , máy tính có thể giúp con người giải quyếtnhững bài toán một cách thông minh nhất Ngày nay , trí tuệ nhân tạo đã và đang hỗtrợ nhiều trong các ứng dụng hàng ngày làm cho máy móc biết suy nghĩ hay giải quyếtvấn đề thay cho con người , biết giao tiếp bằng ngôn ngữ và tiếng nói ……Ta sẽ tìmhiểu một số phương pháp giải quyết vấn đề cơ bản Cụ thể là cài đặt trò chơi cờ vua
sử dụng một số thuật toán được giới thiệu trong môn học
Chúng em xin cảm ơn thầy Phạm Văn Hải, thông qua bài giảng của thầy chúng
em có thể hoàn thiện tốt hơn chương trình của mình
Nhóm sinh viên
Nhữ Đình Đức Nguyễn Duy PhươngTrần Sỹ Đạt
Lê Đại Cát Đào Văn KhangĐoàn Đại Nghĩa
Trang 4II N I DUNG ỘI DUNG
1 Gi i thi u bài toán ới thiệu bài toán ệu bài toán
Cờ vua tên tiếng anh là (Chess ) Cờ vua là một trò chơi có chiến lược và là một tròchơi trí tuệ phổ biến nhất hiện nay do đó có thể nói đó là một trò chơi rất phức tạpngười chơi không thể đoán được hết nước đi nó là một con số rất lớn
a Lu t ch i : ật chơi : ơi :
Một bàn cờ gồm 64 ô trên đó sẽ gồm 16 quân đen và 16 quân trắng được sở hữu bởi 2 người chơi
Trang 5- Xe : Xe đi hay ăn quân theo đường ngang hay cột dọc , nó có thể đi từ đầu bàn
cờ đến hết bàn cờ không giới hạn bước đi với điều kiện không bị cản
- Mã : Đi đến đỉnh đối của chữ nhật 2*3 trên bàn cờ
- Tượng : Tượng trắng chỉ đi được các ô màu trắng và tượng đen thì ngược lại tượng đi theo đường chéo và không giói hạn nước đi với điều kiện không bị cản
- Hậu : là quân cờ linh hoạt nhất trên bàn cờ nó có thể là sự kết hợp của 1 quân
xe và 2 quân tượng có thể đi ngang dọc hay đường chéo
- Vua : Nó là quân quan trọng nhất nếu mất nó coi như bạn đã thua nó có thể đitheo ngang dọc , chéo nhưng gí hạn một nước đi ma thôi
- Tốt : đi thẳng từng bước một riêng nước đi đầu tiên có thể đi 2 nước và ănchéo
b Yêu c u đ t ra khi cài đ t ch ầu đặt ra khi cài đặt chương trình ặt ra khi cài đặt chương trình ặt ra khi cài đặt chương trình ươi : ng trình
- Mô tả được luật chơi thông dụng trong cờ vua
- Đưa trí thông minh vào chương trình ở mức cao nhất có thể
- Tối ưu hóa chương trình, đáp ứng được việc giới hạn về mặt thời gian trong khichơi (Không để người chơi phải đợi quá lâu)
- Giao diện chương trình ở mức đáp ứng được yêu cầu bài toán (Không quá chútrọng, trừ khi có đủ thời gian)
Trang 62 Thi t k ch ết kế chương trình ết kế chương trình ươi : ng trình
a Mô th c l p trình , mô hình phát tri n ch ức lập trình , mô hình phát triển chương trình và ngôn ngữ sử ật chơi : ển chương trình và ngôn ngữ sử ươi : ng trình và ngôn ng s ữ sử ử
- Mô hình phát triển chương trình :
Cùng với mô thức OOP MVC là mô hình lập trình được chúng em dùng trongthiết kế chương trình MVC được xem như phương pháp thiết kế thành côngtrong phương pháp thiết kế hướng đối tượng
MVC viết tắt của Model- View-Control là phương pháp thiết kế chia nhỏ ứngdụng thành 3 phần Model – Control – View trong đó , Model phần mô hình baogồm đối tượng hay tập hợp các đối tượng biểu diễn dữ liệu cho chương trình Control được gọi như phần xử lý , điều khiển toàn bộ logic , hoạt động giao diệntương tác với thao tác của người dùng , đồng thời cập nhật dữ liệu theo đầu vàonhận được và điều khiển thích hợp theo yêu cầu của người dùng View được coi
là phần giao diện người dùng gồm đưa dữ liệu ra màn hình , cung cấp giao diệncho người dùng thao tác với chương trình
một ngôn ngữ lập trình hướng đối tượng Với Java có ưu điểm rất mạnh đó làtính đa nền điều đó có nghĩa một chương trình viết bằng ngôn ngữ Java có thểchạy trên bất kỳ hệ thống nào khi đã được cài máy ảo java Java được xemngôn ngữ cho tương lai với một số tính năng nổi bật của nó như : Thông dịch ,
đa nền , hướng đối tượng ,đa nhiệm đa luồng …
Trang 7+ Đặc tả usecase :
- Chọn New Game : cho phép người chơi đưa bàn cờ về trạng thái đầu của bàn
cờ và bắt đầu màn chơi mới
- Chơi Game : usecase này là một loạt các hành động của người chơi điều khiển quân cờ thuộc về họ
- Chọn Level : cho phép người chơi chọn level khi chơi game
- Thoát Game : cho phép người chơi thoát chương trình
c Bi u đ l p ển chương trình và ngôn ngữ sử ồ usecase : ới thiệu bài toán
Chương trình gồm các package như sau :
Trang 8Package Main chứa hàm chính thực hiện chương trình.
- Chứa các lớp thực hiện các thuật toán và xử lý hàm định trị cụ thể :
o Evaluation class chứa một số hàm đánh giá theo các chiến lược kết quả trả về là giá trị bàn cờ ứng với từng chiến lược khác nhau sẽ có giá trị khác nhau
o ComAlphaBeta class : chứa các hàm minSearch và maxSearch thực hiên thuật toán và nextAction sẽ lựa chọn trạng thái tiếp theo cho bàn cờ
Trang 9Package view :
Chứa toàn bộ phần xử lý giao diện, xử lý sự kiện của người dùng tương tác tới chương trình
Trang 10Package process :
Chứa toàn bộ phần xử lý của các đối tượng trong model :
- CBProcess : xử lý cho đối tượng Cboard
- CPProcess : xử lý cho đối tượng Cpiece
- Cprocess : xử lý cho đối tượng Coord
Trang 11Package model : chứa toàn bộ cấu trúc dữ liệu cho trò chơi
Cấu trúc bàn cờ được thiết kế gồm :
- Lớp model.Cboard : Chứa các thuộc tính , phương thức biểu diễn của bàn cờ Bàn cờ (Board) : Trên bàn cờ ta định nghĩa mảng 2 chiều các Slot
- lớp model.Slot cho biết vị trí của các quân cờ trên bàn cờ dựa vào tọa độ củaquân cờ đó trên bàn cờ
- Lớp model.Coord cho ta biết tọa độ của một quân cờ theo đó tọa độ của mộtquân cờ sẽ có dạng (x,y) với 0 <= x <= 7 và 0 <= y <= 7
- Ngoài ra , trên bàn cờ ta định nghĩa thêm Một bảng các Bit thuộc lớpmodel.CTable bảng này có vai trò chứa các vị trí mà quân Trắng có thể ăn tớiđược điều đó tương đương với tại một vị trí , nếu Bit = false tương đương vớiquân Trắng không thể ăn tới được , ngược lại quân trắng có thể ăn tới được
- Lớp model.CPiece cho biết thuộc tính của từng quân cờ Theo đó một quân cờ
sẽ có các thuộc tính : vị trí của nó trên bàn cờ , màu quân cờ dùng để phân biệt
cờ của 2 bên , kiểu quân cờ phân biệt từng quân cờ và đã được định như sau:
public static final intKING = 0;
public static final intQUEEN = 1;
public static final intBISHOP = 2;
public static final intKNIGHT = 3;
public static final intROOK = 4;
public static final intPAWN = 5;
Trang 12- lớp model.Const cho biết giá trị của quân cờ đó trên bàn cờ gồm các trường như giá trị quân cờ , kiểu quân cờ , giá trị mất của từng quân … sẽ được sử dụng để tính tổng giá trị bàn cờ trong hàm định trị cho bàn cờ
3 Gi i quy t bài toán và các v n đ g p ph i ải quyết bài toán và các vấn đề gặp phải ết kế chương trình ấn đề gặp phải ề gặp phải ặt ra khi cài đặt chương trình ải quyết bài toán và các vấn đề gặp phải
a Thu t toán tìm ki m ật chơi : ết kế chương trình
i MiniMax
“Minimax (còn gọi là minmax) là một phương pháp trong lý thuyết quyết định có mục
đích là tối thiểu hóa (minimize) tổn thất vốn được dự tính có thể là "tối đa" (maximize) Có thể
hiểu ngược lại là, nó nhằm tối đa hóa lợi ích vốn được dự tính là tối thiểu(maximin) Nó bắt
nguồn từ trò chơi có tổng bằng không Nó cũng được mở rộng cho nhiều trò chơi phức tạp hơn
và giúp đưa ra các quyết định chung khi có sự hiện diện của sự không chắc chắn.”
Việc định giá độ tốt hay tồi của một thế cờ sẽ dựa trên hàm định lượng trạngthái một bàn cờ ( vấn đề này sẽ nằm ở phần sau ) Như vậy chất lượng của thuật toántrong việc tìm ra nước đi kế tiếp sẽ phụ thuộc trực tiếp vào hàm định lượng
Trang 13Một vi dụ cho việc tìm kiếm Minimax :
Đặc điểm của tìm kiếm MiniMax :
- Tính hoàn chỉnh : có ( nếu cây biểu diễn trò chơi hữu hạn )
- Tính tối ưu : có, điều này xảy ra khi 2 đối thủ đánh với nhau đều đi các nước tối
Trang 14- Độ phức tạp về bộ nhớ : O(bm)
ii Alpha-Beta c t t a ắt tỉa ỉa
Vấn đề xảy ra trong tìm kiếm của MiniMax là sẽ duyệt qua tất cả các nút và lá trong một cây, như vậy trong những bài toán tìm kiếm trong không gian cực lớn khi độ phân nhánh cao và ở độ sâu lớn, việc tìm kiếm bằng MiniMax là không khả thi do quá tốn thời gian tìm kiếm
Trên thực tế, nhiều nút không cần duyệt qua mà vẫn không ảnh hưởng đến kết quả tìm kiếm Phương pháp tìm kiếm Alpha-Beta cắt tỉa cải thiện được điều đó
Ý tưởng của tìm kiếm Alpha-Beta cắt tỉa :
- Thực chất đây chỉ là một cải tiến của MiniMax
- Tại mỗi một nút sẽ có 2 giá trị Alpha va Beta :
o Alpha lưu lại (cập nhật lại) giá trị lớn nhất của nút các con của nó trong trường hợp tìm kiếm max
o Beta lưu lại (cập nhật lại) giá trị bé nhất của các nút con của nó trong trường hợp tìm kiếm min
- Tại mỗi bước tìm kiếm sẽ truyền tham trị Alpha và Beta tới các nút tìm kiếm
Trang 18- Hàm maxSearch : trả về giá trị lớn nhất (không phải trong tất cả các trường
hợp) của các nút con
o Input : trạng thái bàn cờ, Alpha, Beta
o Output : xảy ra 2 trường hợp
Giá trị lớn nhât của các nút con trong trường hợp max < beta
Trang 19 Một giá trị >= Beta
Trang 20- Hàm minSearch : trả về giá trị nhỏ nhất (không phải trong tất cả các trường
hợp) của các nút con
o Input : trạng thái bàn cờ, Alpha, Beta
o Output : xảy ra 2 trường hợp
Giá trị lớn nhât của các nút con trong trường hợp max < beta
Một giá trị <= Alpha
Trang 21iii Các v n đ g p ph i trong quá trình cài đ t ấn đề gặp phải trong quá trình cài đặt ề gặp phải trong quá trình cài đặt ặp phải trong quá trình cài đặt ải trong quá trình cài đặt ặp phải trong quá trình cài đặt
Có sử dụng hay không phép so sánh = trong Max >= Beta và Min <= Alpha
Lấy ví dụ : nút màu cam là nút bị cắt
Khi sử dụng dấu = trong tìm kiếm trong trường hợp trên, dễ thấy nút gốc là nút
thực hiện hàm nextAction sẽ có tới 3 sự lựa chọn trong việc tìm kiếm nước đi kế tiếp,
trong khi đó thực sự chỉ tồn tại duy nhất một nước đi dẫn đến kết quả tốt hơn
Vấn đề này cũng có thể giải thích bằng việc thuật toán của minSearch vamaxSearch chỉ có thể đảm bảo là đầu ra về mặt giá trị của việc tìm kiếm là không đổichứ không đảm bảo được rằng nước đi đó có lỗi hay không
Cài đặt trên thực tế cho thấy việc đưa vào dấu = làm cho máy tính đi lỗi rấtnhiều, và khác hoàn toàn so với việc không để dấu =
Vấn đề khi xảy ra trường hợp không ăn luôn quân vua của địch khi có thể ăn.
Trong một vài trường hợp xảy ra xác suất có thể kết thúc ván cờ ngay do việc tìm kiếm alpha beta
Trang 22Các nút màu xanh là các nút sẽ kết thúc ván cờ, màu nghệ là bị cắt, dễ thấy com sẽ không đi theo nước có thể thắng được ngay
Như vậy ở hàm nextAction ta cần kiểm tra xem ở trạng thái kế tiếp có thể kết thúc ván cờ ngay không, nếu có thì sẽ không cần duyệt mà đưa ngay ra trạng thái chiến thắng
// restore lai ban co
Trang 23Vấn đề khi quân vua đi lỗi để bị ăn
Tương tự như phần trên, sẽ tồn tại xác suất làm cho việc quân vua “đâm đầu” vào chỗchết, vì vậy, tại độ sâu 1 sẽ kiểm tra xem quân vua có bị ăn bởi nước di chuyển vừa rồikhông, nếu có thì sẽ trả về một giá trị đặc biệt giúp nextAction nhận ra và loại nước đinày, việc này sẽ làm ở hàm minSearch (trong trường hợp com tìm max) :
// neu nuoc di dan den quan vua bi an thi tra ve gia tri nho nhat cua int
// restore lai ban co
}
return Integer MIN_VALUE;
}
Vấn đề trong kỹ thuật lập trình : sinh ra các trạng thái hoàn toàn mới hay chuyển đổi trạng thái đối tượng bàn cờ hiện tại
- Đầu vào là một đối tượng Cboard
- Yêu cầu : sinh ra các trạng thái kế tiếp
- Vấn đề gặp phải : có 2 phương pháp :
Trang 24o Phương pháp 1 : Sinh ra các đối tượng hoàn toàn mới độc lập lập với đối tượng Cboard ban đầu
o Phương pháp 2 : Chỉ dùng đối tượng ban đầu và thay đổi trạng thái nội
- Ngôn ngữ Java cấp phát bộ nhớ chậm hơn các ngôn ngữ như C, C++
Phân tích phương pháp 2 :
- Phương pháp 2 khắc phục được nhược điểm trên tuy nhiên khi viết chương trình
sẽ phức tạp hơn
- Sinh ra các nước đi ( chứ không sinh ra trực tiếp bàn cờ mới )
Trang 25// backup kieu cua quan co di chuyen trong truong hop tot phong hau
- Phải restore trạng thái bàn cờ khi đã thực hiện xong mọi tính toán
}
Trang 26b Hàm đ nh tr ịnh trị ịnh trị
Chất lượng của chương trình chơi cờ phụ thuộc rất nhiều vào hàm định trị Nếu hàm đánh giá cho ta sự đánh giá không chính xác về các trạng thái, nó có thể hướng dẫn ta
đi tới trạng thái được xem là tốt, nhưng thực tế là bất lợi
Thiết kế một hàm đánh giá tốt là khó, đòi hỏi quan tâm đến nhiều nhân tố của bàn cờ
i Chi n l ến lược 1 ược 1 c 1
Định lượng giá trị cho quân cờ :
- Mỗi một quân cở trên bàn cờ sẽ có một giá trị khác nhau, phụ thuộc mức độ quan trọng của quân đó trên bàn cờ, cụ thể như sau :
o public static final int KING_VALUE = 1000000 ;
o public static final int QUEEN_VALUE = 1000 ;
o public static final int BISHOP_VALUE = 350 ;
o public static final int KNIGHT_VALUE = 300 ;
o public static final int ROOK_VALUE = 500 ;
o public static final int PAWN_VALUE = 100 ;
- 2 bên sẽ có giá trị quân cờ đối ngược nhau :
o Bên trắng sẽ mang giá trị quân cờ dương
o Bên đen sẽ mang gia trị quân cờ âm
Việc định trị của bàn cờ sẽ là tổng của tất cả các quân cờ còn tồn tại trên bàn cờ
public static int cal_v(CBoard cBoard , int color) {
// Tinh tong diem cua cac quan tren ban co
Trang 27// tinh tong diem quan den
}
return value ;
}
Mục đích của chiến lược :
- Giúp máy có xu hướng ăn quân địch hoặc đổi quân có giá trị lớn hơn nhằm tạo
ưu thế hơn ( tổng giá trị nghiêng về phía có lợi cho máy )
- Giúp máy phong thủ, chạy quân khi bị nguy hiểm ( tổng giá trị nghiêng về phia không có lợi cho máy )
ii Chi n l ến lược 1 ược 1 c 2
Định lượng mức độ quản lý bàn cờ
- Trong trường hợp chơi với một người quản lý bàn cờ tốt, máy chỉ dùng hàm địnhtrị như trên sẽ có rất ít hoặc không có nước đi tối ưu Trạng thái bàn cờ đối với máy đang rơi vào cờ bí Điều này sẽ dẫn đến việc máy sẽ đi những nước vô nghĩa hoặc mất quân do đi nước tồi
- Yêu cầu đặt ra : đưa vào giá trị cho các nước đi có thể của quân cờ nhằm
“khuyến khích” quân cờ đi vào vị trí có khả năng quản lý càng nhiều ô càng tốt
// he so gia tri cua mot nuoc co the di chuyen
// mobiliy coefficient
public static final int KING_MCO = 0 ;
public static final int QUEEN_MCO = 1 ;
public static final int BISHOP_MCO = 1 ;
public static final int KNIGHT_MCO = 2 ;
public static final int ROOK_MCO = 1 ;
public static final int PAWN_MCO = 1 ;
- Tính toán cho hệ số quản lý bàn cờ :
ways * mCo ;