Cờ tướng nhìn qua có vẻ giống cờ vua nhưng luật di chuyển và khống chế phạm vi của quân cờ được áp đặt lên, làm cho người chơi có thêm nhiều chiến thuật trong cách phòng ngự và tấn công.
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ÁO CÁO MÔN TRÍ TUỆ NHÂN TẠO
Ứng dụng Alpha-beta cắt tỉa xây dựng game cờ
Trang 2Nhóm 6 1
Nguyễn Đức Thọ
20102258 Nguyễn Văn Thông
20102261 Nguyễn Trọng Hiển 20101533
Mục lục
Phần 1: Tổng quan về các vấn đề liên quan 1
1 Giới thiệu về trò chơi cờ tướng 1
2 Windows Phone và framework XNA 4.0 2
Phần 2: Xây dựng game cờ tướng 3
1 Biểu đồ UseCase 3
2 Tìm lớp và xác định trách nhiệm cho lớp 3
3 Thiết kế chi tiết cho các lớp 5
Xác định nước đi kế tiếp cho các quân cờ 5
Phần 2: Xây dựng thuật giải Alpha-Beta Pruning 11
1 Thuật giải Minimax 11
2 Thuật giải Alpha-beta cắt tỉa 12
3 Áp dụng vào bài toán chơi cờ tướng 16
a) Hàm lượng giá 16
b) Thiết kế giải thuật trong game 17
c) Biểu diễn cây trò chơi 19
4 Phương án tối ưu cho bài toán 20
a) Tối ưu hàm lượng giá 20
b) Tối ưu thời gian tìm kiếm 20
5 Thống kê cài đặt thuật toán thành công 20
Phần 3: Kết luận 21
Trang 3Phần 2: Xây dựng thuật giải Alpha-Beta PruningPhần 2: Xây
dựng thuật giải Alpha-Beta Pruning
2
Tài liệu tham khảo 22
Phần 1: Tổng quan về các vấn đề liên quan
1 Giới thiệu về trò chơi cờ tướngTrò chơi cờ tướng là một trong những trò chơi thể thao trí tuệ hấp dẫn, được đưa vào thi đấu quốc tế Cờ tướng có xuất xứ từ Trung Quốc và nhanh chóng được nhiều người chơi trên toàn thế giới Cờ tướng cũng giống như các môn cờ khác là trò chơi đối kháng 2 người, người chơi sử dụng kĩ năng, tư duy chiến thuật để giành chiến thắng Cờ tướng cũng là một loại cờ có nhiều chiến thuật, áp dụng nhiều tư duy nhất Cờ tướng nhìn qua có vẻ giống
cờ vua nhưng luật di chuyển và khống chế phạm vi của quân cờ được áp đặt lên, làm cho người chơi có thêm nhiều chiến thuật trong cách phòng ngự và tấn công
Bàn cờ tướng có kích thướng 9x10, ở thời điểm xuất phát 2 bên được phân cách bởi sông (còn gọi là “hà”), người chiếm được “hà”
sẽ có nhiều lợi thế trong tấn công Cờ tướng gồm 7 quân cờ chính:Tướng, Sĩ, Tượng, Xe, Pháo, Mã, Tốt
2 Windows Phone và framework XNA 4.0Hiện nay, điện thoại di động ngày càng phổ biến và tiện lợi, việc sở hữu 1 chiếc smartphone là rất dễ dàng Các ứng dụng trênđiện thoại có rất nhiều với mục đích giải trí, học tập… Nhóm quyếtđịnh xây dựng game cờ tướng trên nền tảng Windows Phone
Windows Phone (Windows Phone 7 Series) là hệ điều hành của Microsoft dành cho SmartPhone kế tục nền tảng Windows Khác với Windows Mobile, Windows Phone tập trung vào sự phát triển Marketplace – nơi các nhà phát triển có thể cung cấp sản phẩm tới người dùng
Với Windows Phone 7, Microsoft đã phát triển giao diện người dùng mới mang tên Metro – tích hợp khả năng liên kết phần cứng với phần mềm của hãng thứ 3 một cách dễ dàng
Sau đó là các phiên bản 7.1, 7.5, 7.8 và gần đây nhất là phiên bảnWindows Phone 8.0 với nhiều tính năng thông minh hỗ trợ
Trang 4Nhóm 6 3
Vì mới bắt đầu tìm hiểu và làm ứng dụng Windows Phone đầu
tiên, nhóm đã quyết định lựa cho nền tảng Windows Phone 7.1
không quá mới như 8.0 chạy ổn định, và hỗ trợ nhiều hơn so với
7.0
Ứng dụng viết trên nền XNA 4.0 framwork chuyển cho lập trình
game trên các loại hệ điều hành windows
Phần 2: Xây dựng game cờ tướng
Game cờ tướng gồm có: bàn cờ và các quân cờ trên bàn cờ Quân
cờ gồm 7 loại quân với cách di chuyển khác nhau, nhưng có nhiều
thuộc tính chung của 1 quân cờ
Bàn cờ được hình thành từ các quân cờ, như vậy ta xây dựng lớp
quân cờ kết tập nên bàn cờ 7 quân cờ cụ thể lại được kết thừa từ
lớp quân cờ này
Người chơi chơi game ở màn chơi -> xây dựng lớp Game
Xây dựng thuật toán chạy AI -> lớp computer
Trang 5Phần 2: Xây dựng thuật giải Alpha-Beta PruningPhần 2: Xây
dựng thuật giải Alpha-Beta Pruning
4
Entity
EntityChess ChessBoard
ChessPiece BoundingBox
Rook Artillery Elephant Guard Horse
Pawn King Move
Figure 2: biểu đồ lớp tổng quan
Trang 6ImageWidth
GetBounding
WidthDisplay ImageHeight _id
LoadContent( ContentManager
content)
_isDied _color _canMove _type
Update( GameTime gameTime) Draw( SpriteBatch spriteBatch,
Point p) Move( Point destination,
ChessBoard board) ChangeColor() GetNextMoves( ChessBoard board) Clone( ChessPiece piece) ChessPiece( EColor color) ChessPiece( int id, EColor color,
Point point) ChessPiece( ChessPiece piece)
BoundingBox
Rectangle GetBounding LoadContent(Microsoft.Xna.Framew ork.Content ContentManager
content) BoundingBox() Draw( SpriteBatch spriteBatch)
Draw( SpriteBatch spriteBatch)
GetPosition( TouchLocation touch)
ChangeColor()
SetPoint( ChessPiece chess, Point
p)
GetPoint( Point p)
GetPoint( int x, int y)
SetPoint( Point p, int value)
GenerateBoardNegativeTeam( ChessB oard board)
Minimax( ChessBoard board, int
player) AlphaBetaPruning( ChessBoard
board, int alpha, int beta, int
depth, int player)
rd board) _value
Guard _type Draw(SpriteBatch spriteBatch) GetNextMoves( ChessBoa
rd board) _value
Horse _type Draw(SpriteBatch spriteBatch) GetNextMoves( ChessBoa
rd board) _value
King _type Draw(SpriteBatch spriteBatch) GetNextMoves( ChessBoa
rd board) _value
Pawn _type Draw(SpriteBatch spriteBatch) GetNextMoves( ChessBoa
rd board) _value
Rook _type Draw(SpriteBatch spriteBatch) GetNextMoves( ChessBoa
rd board) _value
Figure 4: Biểu đồ lớp chi tiết
Xác định nước đi kế tiếp cho các quân cờ
Tại mỗi bàn cờ nhất định, chúng ta cần duyệt qua tất cả các cách
đi của các quân cờ để tìm ra nước đi tối ưu tiếp theo Muốn làm
được điều đó ta cần biết đặc điểm và cách đi của từng quân cờ
Luật chơi cờ tướng cơ bản :
Trang 7Phần 2: Xây dựng thuật giải Alpha-Beta PruningPhần 2: Xây
dựng thuật giải Alpha-Beta Pruning
6
Luật di chuyển các quân cờ như sau:
1 Tướng: Mỗi nước đi một ô, đi ngang hoặc dọc Tướng luôn ở
trong phạm vi cung."Cung" gồm 4 hình vuông nhỏ được gạch đường chéo
2 Sĩ: Đi chéo, mỗi nước một ô Sĩ luôn ở trong "Cung" giống
như Tướng
3 Tượng: Đi chéo 2 ô mỗi nước, đi ngang hoặc dọc Tượng
không được phép qua sông sang bàn cờ của đối phương.Nước đi của Tượng không hợp lệ khi có quân cờ chặn giữa đường
4 Xe: Đi ngang hoặc dọc khắp bàn cờ miễn không có quân
khác cản trên đường đi
5 Mã: Đi ngang 2 ô và đi dọc 1 ô ( hoặc đi dọc 2 ô và đi ngang
1 ô) cho mỗi nước đi.Nếu có quân khác nằm cạnh mã và cản
đường ngang 2 hoặc cản đường dọc 2, thì mã không được đi
đường đó
6 Pháo: Đi ngang hoặc dọc giống như Xe Điểm khác là khi
Pháo muốn ăn quân của đối phương thì giữa Pháo và quân muốn
ăn phải có quân cản ở giữa
7 Tốt: Đi mỗi nước một ô Nếu Tốt chưa qua sông thì chỉ được
đi thẳng tiến Khi đã vượt qua sông có thể đi ngang hoặc đi thẳng tiến, mỗi nước một ô
8 Ăn quân: Khi quân di chuyển đến một vị trí đang đứng của
quân đối phương, quân đối phương bị ăn và bị lấy ra khỏi bàn cờ
9 Chống tướng: 2 tướng trên bàn không được nằm trên cùng
một cột dọc mà không có quân cản ở giữa.Nước đi để 2 quân
tướng ở vị trí chống tướng là không hợp lệ
Dựa vào luật chơi cờ tướng cơ bản trên, ta xây dựng được phương pháp xác định nước đi tiếp theo của từng quân cờ
Trang 8Nhóm 6 7
Coi bàn cờ là một mảng 2 chiều a[i,j] với a[i,j]=0 tức là chưa có
quân cờ và a[i,j]={1,2,3,4,5,6,7} tương ứng với quân {tướng, sỹ,
tượng, xe, mã , pháo, tốt} của quân ta và
a[i,j]={-1,-2,-3,-4,-5,-6,-7} tương ứng quân {tướng, sỹ, tượng, xe , mã , pháo, tốt } của
quân địch
Bây giờ ta cần xác định những ô có thể đi của các quân cờ với vị
trị hiện tại của chúng là a[i,j]
1 Tướng :
3< j<7 0<i<4 thì cập nhật vị trí quân tướng
có thể đi
2 Sỹ :
Ta kiểm tra tất cả các ô {a[i+1 , j−1]a[i+1 , j+1]
a[i−1 , j−1] a[i−1 , j+1]
Trang 9Phần 2: Xây dựng thuật giải Alpha-Beta PruningPhần 2: Xây
dựng thuật giải Alpha-Beta Pruning
8
3< j<7 0<i<4 thì cập nhật vị trí quân sỹ có thể đi
3 Tượng :
If {a a[[i−1 , j−1] i−2 , j−2]=0<1
0<i−2<11 0< j−2<10
then ( quân tượng đi được tới ô a[i-2,j-2]
If {a a[[i−1 , j+1] i−2 , j+2]=0<1
0<i−2<11 0< j+2<10
then ( quân tượng đi được tới ô a[i-2,j+2]
If {a a[[i+1 , j−1] i+2 , j−2]=0<1
0<i+2<11 0< j−2<10
then ( quân tượng đi được tới ô a[i+2,j-2]
If {a a[[i+1 , j+1] i+2 , j+2]=0<1
0<i+2<11 0< j+2<10
then ( quân tượng đi được tới ô a[i+2,j+2]
Trang 11Phần 2: Xây dựng thuật giải Alpha-Beta PruningPhần 2: Xây
dựng thuật giải Alpha-Beta Pruning
10
If {a a[i+1 , j−2][i, j−1]=0<1
0<i+1<11 0< j−2<10
then ( quân mã đi được tới ô a[i+1,j-2] )
Chưa sang sông :
if a[i+1,j] < 1 then ( quân tốt đi được tới vị trí a[i+1,j] )
Đã sang sông :
5< j<11 0<i<10 thì cập nhật vị trí quân tốt có thể đi
Trang 12Nhóm 6 11
Phần 2: Xây dựng thuật giải Alpha-Beta Pruning
Game cờ tướng là một trong những game chơi đối kháng, phù
hợp với việc áp dụng thuật giải Minimax kết hợp với Alpha-beta
cắt tỉa trong đó 1 người chơi là Max, 1 người chơi là Min, thay
phiên nhau đi các nước, kết thúc ván cờ có 1 thắng 1 người
thua, hoặc rơi vào trạng thái hòa thì cần phải có trọng tài để
đánh giá
1 Thuật giải Minimax
đối kháng, 1 người chơi là Max, 1 người chơi là Min Minimax
sử dụng tri thức là 1 hàm lượng giá, khi khởi tạo hàm lượng
giá này có giá trị là 0, ứng với khả năng giành chiến thắng
của Max và Min là như nhau
lại, Max tìm cách cực đại hóa hàm lượng giá, Min tìm cách
cực tiểu giá trị này
và các nước đi hợp lệ của Max (Min)
đánh giá, ở các cây con của Max, Max chọn các trạng thái tốt
nhất với nó là những trạng thái hàm đánh giá cực đại và
ngược lại với Min, nó chọn các trạng thái sao cho hàm đánh
giá là nhỏ nhất
vào độ sâu tìm kiếm Trên thực tế không có máy tính nào
cho phép tính đến trạng thái đích từ trạng thái bắt đầu, vì
cây trò chơi là quá lớn vì thế chỉ có thể cài đặt ở một độ sâu
nhất định, đảm bảo về mặt thời gian
Trang 13Phần 2: Xây dựng thuật giải Alpha-Beta PruningPhần 2: Xây
dựng thuật giải Alpha-Beta Pruning
12
Với sự bùng nổ của cây trò chơi Minimax và giải thuật Minimax cổ điển không có sự tối ưu nào để giảm bớt sự phức tạp tìm kiếm, bỏ bớt những nút không tối ưu Chính vì thế người ta đã áp dụng cắt tỉa Alpha-beta vào việc tối ưu tìm kiếm
2 Thuật giải Alpha-beta cắt tỉa
Tư tưởng của cắt tải alpha-beta: “Nếu một nhánh tìm kiếm nào đó không thể cải thiện đối với giá trị (hàm tiện ích) mà chúng ta đã có, thì không cần xét đến nhánh tìm kiếm đó nữa!”
Cắt tỉa Alpha-beta được áp dụng vào nhằm cắt tỉa bớt những
nhánh tồi tiết kiệm chi phí thời gian, bộ nhớ cho cây tìm kiếm.Lợi ích của việc cắt tỉa alpha-beta nằm trong thực tế là chi nhánh của cây tìm kiếm có thể được loại bỏ Bằng cách này, thời gian tìm kiếm có thể được giới hạn trong 'hứa hẹn' cây con, và tìm kiếm sâu hơn có thể được thực hiện trong cùng một lúc Giống như người tiền nhiệm của nó, nó thuộc về chi nhánh và ràng buộc lớp của các thuật toán Việc tối ưu hóa làm giảm độ sâu hiệu quả
để nhẹ hơn một nửa so với minimax đơn giản nếu các nút được đánh giá trong một trật tự tối ưu tối ưu hoặc gần (sự lựa chọn tốt nhất cho các bên trên di chuyển ra lệnh đầu tiên tại mỗi nút)
α là giá trị của nước đi tốt nhất đối với Max (giá trị tối đa tínhđến thời điểm hiện tại đối với nhánh tìm kiếm
Trang 14Nhóm 6 13
Nếu v là giá trị tồi hơn α, Max sẽ bỏ đi nước đi ứng với v, cắt
tỉa nhánh ứng với v
β là giá trị tốt nhất đối với Min, β khi khởi tạo mang giá trị
âm vô cùng, sau đó được cập nhật các giá trị giảm dần, nếu
một nhánh tìm thấy có giá trị cao hơn β nó sẽ cắt tỉa nhánh
đó
Mã giả thuật toán:
chức năng alphabeta (nút, chiều sâu, α, β, maximizingPlayer)
nếu độ sâu = 0 hoặc nút là một nút thiết bị đầu cuối
trả về giá trị theo kinh nghiệm của nút
nếu maximizingPlayer
cho mỗi đứa trẻ của nút
α: = max (α, alphabeta (trẻ em, độ sâu - 1, α, β, không
cho mỗi đứa trẻ của nút
β: = min (β, alphabeta (trẻ em, độ sâu - 1, α, β, không
(maximizingPlayer)))
nếu β ≤ α
phá vỡ (* Alpha cắt *)
trở β
(* Ban đầu gọi *)
alphabeta (nguồn gốc, độ sâu, vô tận, vô cực, TRUE)
Cải thiện hơn nữa có thể đạt được mà không bị mất độ chính xác,
bằng cách sử dụng heuristic để tìm kiếm các bộ phận của cây có
khả năng buộc cutoffs alpha-beta đầu Ví dụ, trong cờ vua, di
chuyển mà phải mất mảnh có thể được kiểm tra trước khi di
chuyển mà không làm, hoặc di chuyển mà đã ghi được đánh giá
có thể được đánh giá trước những người khác Khác thường, và rất
Trang 15Phần 2: Xây dựng thuật giải Alpha-Beta PruningPhần 2: Xây
dựng thuật giải Alpha-Beta Pruning
sổ tìm kiếm, null-cửa sổ tìm kiếm, hoặc tìm kiếm trinh sát Điều này đặc biệt hữu ích cho thắng / thua tìm kiếm ở gần cuối của một trò chơi, nơi độ sâu thêm thu được từ cửa sổ hẹp và thắng / thua chức năng đánh giá đơn giản có thể dẫn đến một kết quả thuyết phục Nếu một khát vọng tìm kiếm thất bại, nó là đơn giản
để phát hiện xem nó không thành công cao (cạnh cao của cửa sổ quá thấp) hoặc thấp (cạnh dưới của cửa sổ là quá cao) Điều này cung cấp thông tin về những gì giá trị cửa sổ có thể có ích trong một lại tìm kiếm vị trí này
Một số biểu diễn minh họa
Trang 16Nhóm 6 15
min
min
max
Min
max
Trang 17Phần 2: Xây dựng thuật giải Alpha-Beta PruningPhần 2: Xây
dựng thuật giải Alpha-Beta Pruning
tốt xấu Nhờ điểm này máy mới có thể so sánh các thế cờ với
nhau và biết chọn nước đi tốt nhất Đâylà một nhiệm vụ rất khó
khan và phức tạp do không tồn tại một thuật toán tổng quát và
thống nhất nào để tính điểm cả Điểm của một thế cờ dựa trên
Trang 18Nhóm 6 17
rấtnhiều yếu tố mà khó có thể số hoá hết được như phụ thuộcvào
số lượng và giá trị các quân cờ hiện tại, phụ thuộc vào tính hãm,
tính biến, thếcông, thế thủ của từng quân cờ cũng như cả cục
diệntrận đấu Ví dụ, một cặp Mã giao chân, có thể sát
Cánh tiến quân và tựa lưng phòng thủ thường có giá hơn hai Mã
đứng rời Nhưng cũng có lúc hai Mã đứng rời lại tốthơn hai Mã giao
chân khi Mã này lại cản Mã kia trong một thế trận nào đó Ta cũng
biết rằng, "lạc nước hai Xe đành bỏ phí, gặp thời một Tốt cũng
Thành công", thế nhưng số hoá điều này qua hàm lượng giá quả
là một điều khó quá sức
Trong bài toán này, nhóm sử dụng cách lượng giá đơn giản và dễ
hiểu nhất Đánh giá giá trị bàn cờ thông qua giá trị của các quân
cờ
h (n)=Tổng giá trị quân mình−Tổng giá trị quân đối phương
Cách đánh giá này tuy không đem lại nhiều chiến thuật trong
cách chơi cờ, nhưng là đơn giản và dễ hiểu khi một bên sở hữu
nhiều quân cờ có giá trị cao hơn sẽ có nhiều lợi thế hơn trong việc
Tốt sang sông ở vị trí biên
Hai tốt cặp kè nhau khi sang sông
b) Thiết kế giải thuật trong game
Từ mã giả ở phần trên nhóm đã thiết kế phương thức
AlphaBetaPruning(ChessBoard board, int alpha, int beta, int depth, int player)
nằm trong lớp Computer
Trang 19Phần 2: Xây dựng thuật giải Alpha-Beta PruningPhần 2: Xây
dựng thuật giải Alpha-Beta Pruning
18
public Computer AlphaBetaPruning(ChessBoard board, int alpha, int beta, int
depth, int player)
Trang 20Nhóm 6 19
}
c) Biểu diễn cây trò chơi
Figure 5: 1 trường hợp của cây trò chơi
Khi sang nhánh thứ 2, với NODE con đầu tiên của nhánh thứ 2 ta
có giá trị -640, vậy giá trị của nhánh con thứ 2 ngay lập tức sẽ xác
tiếp nhánh thứ 2 thế nào, ta cũng có thể biết được là kết quả ở
nhánh thứ 2 sẽ tồi hơn kết quả tìm được ở nhánh con thứ 1 Bởi
vậy ta sẽ không tiếp tục duyệt tiếp ở các NODE con ở nhánh thứ
2 Áp dụng tương tự với nhánh thứ 3, ta sẽ không cần duyệt tiếp
NODE thứ 2 của nhánh thứ 3 Áp dụng liên tục phương pháp này,
cập nhật lại các kết quả α nếu tìm được các kết quả tốt hơn, ta sẽ
có thể cắt bớt được các nhánh không cần thiết Từ đó tốc độ của
chương trình sẽ nhanh hơn và tối ưu hơn