You are on page 1of 25

Báo cáo sơ bộ bài tập lớn

Môn Trí Tuệ Nhân Tạo

Đề tài : Làm game chơi cờ


caro
Nhóm thực hiện:

- Phạm Hoàng Hà
- Mai Đức Khiêm
- Nguyễn Thanh Loan
- Hoàng Quyết Tiến
Nội dung báo cáo

1.Cờ caro ?
2. Tìm kiếm nước đi của players
3.Tìm kiếm nước đi của Computer
4. Lập trình
Computer Player vs Human Player
Một số công việc
đã thực hiện được
- Xây dựng được giao diện bàn cờ + sự kiện đánh cờ
giữa 2 người.
- Xây dựng được một số hàm lượng giá các trạng thái
của bàn cờ.
- Xây dựng bàn cờ theo các cell và có thể đánh được
trên bàn cờ đó
- Viết được code cơ bản của Anpha-beta
Công việc chưa thực hiện được
- Lưu trạng thái bàn cờ
- Ứng dụng thuật toán alpha-beta vào thực tế
- Xây dựng độ sâu của giải thuật tìm kiếm
Cờ caro
- Caro là một trò chơi sử dụng một bàn cờ có kẻ
các ô vuông liên tiếp nhau kích thước tuỳ ý (tối
thiểu là 3x3).
- Có hai loại quân cờ khác nhau (X 0).
- Mỗi người chơi chọn cho mình một loại quân.

- Cách chơi : Hai người chơi lần lượt đến lượt


mình đặt quân cờ của mình vào ô cho đến khi đạt
điều kiện thắng hoặc hết giới hạn bàn cờ.

- Điều kiện thắng : Có 5 quân cờ của một


người chơi đặt thẳng hàng (ngang, chéo, dọc).
Ví dụ minh hoạ
Tìm kiếm nước đi
của người chơi
- Tuỳ theo hiện trạng hiện thời mà người chơi có thể :

1. Tìm kiếm các vị trí mà khi đánh quân cờ mình vào


thì tạo ra các nguy hiểm cho địch thủ.
Ví dụ: Nước ba hở hai đầu, nước bốn hở một đầu, hở hai đầu,
nước đôi ( 2 nước 3; 1 nước 4, 1 nước 3 ...), nước 3 ....

2. Xác định các nước đi nguy hiểm của đối thủ và


ngăn chặn.

3. Đưa ra quyết định về vị trí sẽ đánh tiếp theo.

→ Các bước 1 và 2 thực hiện cho 1 hoặc nhiều nước đi tiếp


theo
Ví dụ
Tìm kiếm nước đi của máy tính
1.
Đánh giá khả năng và giá trị các vị trí ô trên bàn cờ ở
nước hiện tại và một số các nước tiếp theo
(Evalue Function ).

2.
Tìm kiếm nước đi hợp lý
( Giới hạn bởi thuật toán Minimax và Anpha-Beta – Heuristic ).

3.
Thực hiện reset bàn cờ sau khi đối thủ đưa ra quyết định.
Lặp lại các bước ở trên cho đến khi đạt trạng thái kết thúc.
(Điều kiện thắng hoặc Bàn cờ full).
Lập trình Computer player

Mô phỏng bàn cờ.

Tìm hiểu Heuristic – Thuật đánh giá cho các ô cờ.

Thuật toán tìm kiếm ( Minimax, Anpha-Beta) nước đi tốt


nhất (bestmove).

Đi thử

Lặp lại các bước trên.


Mô phỏng bàn cờ
- Bàn cờ (Board) bao gồm các ô cờ (Cells) được đặt
trong một mảng hai chiều (kích thước a x b).

* Trong mỗi Cell có thể xác định được :


- Vị trí Cell (row, collumme)

- Trạng thái Cell (Status). (Bao gồm đang trống


(empty) nước của đối thủ (Player) hoặc nước của máy
(Com).

- Độ nguy hiểm của ô cờ tuỳ theo trạng thái Cell và có


thể thay đổi được.
Đánh giá giá trị các Cell
Giống như trong thực tế, người chơi thường đánh giá
một số nước cờ là nguy hiểm, bình thường hoặc ít
nguy hiểm, máy tính cũng đánh giá nhưng cụ thể hơn
bằng các con số.

Ví dụ cụ thể :
Các hình trạng bàn cờ Độ nguy hiểm với người chơi Độ nguy hiểm với máy

- 3 quân liền nhau (_XXX_) Rất nguy hiểm 800

- 2 quân liền nhau (_XX_) Bình thường 100

- 4 quân bị chặn (0XXXX_) Cực kì nguy hiểm 900

- 5 quân liền nhau Kết thúc 1000


Tìm nước đi thích hợp
Minimax - AnphaBeta
Minimax

• Bao gồm hai bộ phận Minimum và Maximum

• Min thể hiện cho giá trị tối thiểu mà máy tính
có thể đi trong nước hoặc vài nước tiếp theo.
Người chơi thường chọn nước đi có giá trị
Min.

• Max thể hiện cho giá trị lớn nhất mà máy tính
có thể đi trong nước hoặc một vài nước tiếp
theo. Máy sẽ thường chọn nước đi được
đánh giá là Max.
Minimax

Thực tế không đơn giản như vậy vì khi máy tính


mong muốn chọn được giá trị max nhất (có lợi
nhất cho mình) nhưng đó cũng là thiệt hại nhất
cho đối thủ vì thế đối thủ sẽ chọn nước đi sao cho
giảm độ thiệt hại nhất có thể tức là sẽ luôn chọn
Min giá trị mà máy tính sẽ chọn.
Minimax
Ví dụ minh hoạ

COM1 COM2 COM3 COM4

800 200 -200 -900


Player 1

-200 400 800 1000


Player 2

900 0 -50 -800


Player 3
Ví dụ : Máy mong muốn chọn COM4 nhưng để ngăn chặn
Player 4 Người
200 chơi sẽ
-800 chọn Player1
50 0
Minimax

Giải pháp :
- Máy phải luôn luôn mặc định là người chơi
sẽ chọn giá trị tối thiểu (MIN) , máy cần chọn
trong các nước đi của mình sao cho ở trạng thái
cuối, máy luôn có được giá trị tốt nhất (MAX)
trong các trường hợp tính được.
Minimax

Mô tả :
Coding

minimax(player,board)
if(game over in current board position)
return winner
children = all legal moves for player from this board
if(max's turn)
return maximal score of calling minimax on all the
children
else (min's turn)
return minimal score of calling minimax on all the
children
Anpha – Beta Pruning
- Nếu dùng Minimax xét hết các trường hợp thì nếu với bàn cờ có số
lượng nhỏ, mức xét không cao thì chưa gây mất nhiều thời gian tính
toán, nếu là bàn cờ nhiều ô và xét với độ sâu lớn thì thời gian thực hiện
tính toán và tìm kiếm là lớn và tốn tài nguyên.

Độ phức tạp tính toán theo độ sâu khác nhau :

- Với độ sâu (ply) tính toán là b, trung bình mỗi ply phải xét n
trạng thái thì độ phức tạp tính toán là :
--> O (n + n^2 + n^3 + n^4 …) = O (n^(b+1)).

→ Để làm giảm quá trình tính toán này chúng ta sử dụng kết hợp
Minimax và thuật toán Anpha-Beta Pruning (tạm dịch là thuật cắt
gọt Anpha-Beta).
Anpha – Beta Pruning
Ý tưởng :
Dùng hai cận Anpha (dưới) và Beta (trên) để so sánh và
loại bỏ các trường hợp sẽ không cần xét đến trong thuật
toán Minimax.
Mô tả :
Anpha lưu nước đi tốt nhất của máy,
Beta lưu giá trị tốt nhất của Người chơi
.→ Nếu bất cứ khi nào, anpha >= beta, thì người
chơi chắc chắn sẽ chọn nước đi tốt nhất cho họ và
cưỡng bức nước đi tồi hơn anpha cho máy, vì vậy
mà không cần phải xét thêm nước nào nữa.
Cũng giống như vậy trong trường hợp máy đang
ở trường hợp Min, ta chỉ việc thay anpha cho beta.
Anpha – Beta Pruning

Độ phức tạp thuật toán


Mô tả
Coding
alpha-beta(player,board,alpha,beta)
if(game over in current board position)
return winner

children = all legal moves for player from this board


if(max's turn)
for each child
score = alpha-beta(other player,child,alpha,beta)
if score > alpha then alpha = score (we have found a better best move)
if alpha >= beta then return alpha (cut off)
return alpha (this is our best move)
else (min's turn)
for each child
score = alpha-beta(other player,child,alpha,beta)
if score < beta then beta = score (opponent has found a better worse move)
if alpha >= beta then return beta (cut off)
return beta (this is the opponent's best move)
Khó khăn trong quá trình
thực hiện

- Triển khai định giá theo mức (độ sâu) ply ???

You might also like