Trong tiếng TriềuTiên, trò chơi này được gọi là omok 오 목 và trong tiếng Nhật là 五 目 並 べgomoku narabe; tiếng Anh cũng sử dụng thuật ngữ gomoku từ tiếng Nhật.Ban đầu, cờ ca-rô được chơi bằ
Trang 1BÁO CÁO TIẾN ĐỘ TIỂU LUẬN
TRÍ TUỆ NHÂN TẠO
TÊN ĐỀ TÀI:“XÂY DỰNG TRÒ CHƠI CỜ CARO CỔ
ĐIỂN CÓ SỬ DỤNG TRÍ TUỆ NHÂN
TẠO”
Nhóm sinh viên thực hiện: Trần Huy Hoàng - 2254810192 Lê Tấn Đạt - 2254810177 Đặng Nhật Hào - 2254810159 Nguyễn Quốc Trí - 2254810196 Trần Đình Anh Duy - 2254810246 Hoàng Minh Trí - 2254810284
TP HCM, tháng 6 năm 2024
Trang 2PHẦN 1 CƠ SỞ LÝ THUYẾT 1 Giới thiệu đề tài
Đề tài của nhóm 5 chúng em là xây dựng một trò chơi cờ ca rô (Gomoku) để giảitrí cùng nhóm bạn Chúng em sử dụng Visual Studio Code và ngôn ngữ lập trìnhPython để phát triển dự án này Để giải quyết vấn đề và tạo ra một đối thủ AIthông minh, nhóm chúng em áp dụng thuật toán cắt tỉa alpha-beta Mục tiêu là tạora một trò chơi có giao diện thân thiện và cung cấp trải nghiệm thú vị cho ngườichơi
2 Cơ sở lý thuyết
2.1 Cờ cà rô (Gomoku) là gì?
Cờ ca-rô, còn được gọi là sọc ca-rô, là một trò chơi dân gian Trong tiếng TriềuTiên, trò chơi này được gọi là omok (오 목) và trong tiếng Nhật là 五 目 並 べ(gomoku narabe); tiếng Anh cũng sử dụng thuật ngữ gomoku từ tiếng Nhật.Ban đầu, cờ ca-rô được chơi bằng các quân cờ vây (quân cờ màu trắng và đen)trên một bàn cờ vây kích thước 19x19 Người chơi cầm quân đen sẽ đi trước, sauđó luân phiên đặt quân cờ của mình lên các giao điểm còn trống Người chiếnthắng là người đầu tiên xếp được chuỗi liên tục gồm 4 quân cờ theo hàng ngang,dọc hoặc chéo mà không bị chặn ở cả hai đầu Sau khi được đặt xuống, quân cờkhông thể di chuyển hoặc lấy ra khỏi bàn cờ, vì vậy trò chơi này cũng có thể chơitrên giấy bằng bút
Tại Việt Nam, trò chơi này thường được chơi trên giấy và vở học sinh có sẵn các ôca-rô, và người chơi dùng bút để đánh dấu hình tròn O và chữ X để đại diện chohai quân cờ Cách chơi tương tự, nhưng người chiến thắng là người xếp được
Trang 3chuỗi liên tục 5 quân cờ theo hàng ngang, dọc hoặc chéo mà không bị chặn hoặcngắt đoạn bởi quân cờ khác.
2.2 Luật chơi:
Cờ caro (Gomoku) có lợi thế rất lớn cho người chơi đầu tiên khi không có hạn chếnào Các giải vô địch cờ caro trước đây đã sử dụng quy tắc khai cuộc "Pro", quyđịnh rằng người chơi đầu tiên phải đặt quân cờ đầu tiên ở trung tâm bàn cờ Ngườichơi thứ hai có thể đặt quân cờ ở bất kỳ vị trí nào Quân cờ thứ hai của người chơiđầu tiên phải được đặt cách quân cờ đầu tiên ít nhất ba giao điểm Quy tắc này đãđược sử dụng trong các giải vô địch thế giới năm 1989 và 1991 Khi tỷ lệ thắng-thua của hai giải vô địch này được tính toán, người chơi đầu tiên (đen) thắng 67phần trăm số trận đấu
Điều này được coi là quá mất cân bằng cho các giải đấu, vì vậy vào năm 2009, giảiđấu cờ caro đã áp dụng giao thức khai cuộc Swap2 Trong Swap2, người chơi đầutiên đặt ba quân cờ, hai đen và một trắng, lên bàn cờ Người chơi thứ hai sau đóchọn một trong ba tùy chọn: chơi với quân đen, chơi với quân trắng và đặt thêmmột quân trắng khác, hoặc đặt thêm hai quân cờ nữa, một trắng và một đen, và đểngười chơi đầu tiên chọn màu
Tỷ lệ thắng của người chơi đầu tiên được tính là khoảng 52 phần trăm khi sử dụnggiao thức khai cuộc Swap2, giúp cân bằng trò chơi đáng kể và chủ yếu giải quyếtđược lợi thế của người chơi đầu tiên
2.3 Thuật toán Minimax:
2.3.1 Định nghĩa:
Thuật toán Minimax là một phương pháp đệ quy được áp dụng để xác định bướcđi tối ưu trong các trò chơi hai người Cách thức hoạt động của nó là đánh giá giá
Trang 4trị của các nút trong cây trò chơi, sau đó chọn nút có giá trị phù hợp để quyết địnhnước đi tiếp theo Trong mô hình này, hai người chơi được gọi là MAX và MIN.MAX luôn nỗ lực để tối đa hóa điểm số của mình, trong khi MIN cố gắng giảmthiểu lợi thế của MAX Thuật toán Minimax đánh giá giá trị các nút theo nguyêntắc: nút thuộc lớp MAX sẽ được gán giá trị cao nhất từ các nút con của nó, còn nútthuộc lớp MIN sẽ nhận giá trị thấp nhất từ các nút con của nó Thông qua quá trìnhnày, người chơi có thể xác định bước đi tiếp theo một cách hợp lý.
2.3.2 Lý do dùng Minimax cho Gomoku:
Có nhiều thuật toán tìm kiếm khác nhau để phát triển AI trong game như A*,Heuristic Mỗi thuật toán phù hợp với một loại game nhất định Trong các tròchơi đối kháng như cờ vua, cờ tướng, cờ ca-rô, nơi người chơi luân phiên đánh,bạn có thể mở rộng không gian trạng thái nhưng thách thức chính là dự đoán phảnứng và nước đi của đối thủ Một cách đơn giản để giải quyết vấn đề này là giả địnhđối thủ của bạn cũng có kiến thức về không gian trạng thái như bạn Thuật toánminimax sử dụng giả thuyết này để tìm kiếm trong không gian trạng thái của tròchơi Trong trường hợp này, thuật toán minimax sẽ đáp ứng những gì bạn cần
2.4 Thuật toán cắt tỉa Alpha-beta:
2.4.1 Định nghĩa:
Alpha–beta pruning là một thuật toán tìm kiếm nhằm giảm thiểu số lượng nútđược đánh giá bởi thuật toán minimax trong cây tìm kiếm của nó Đây là một thuậttoán tìm kiếm đối kháng, thường được sử dụng cho việc chơi máy của các trò chơitổ hợp hai người chơi (Cờ ca rô, Cờ vua, Connect 4, v.v.) Thuật toán này ngừngđánh giá một nước đi khi có ít nhất một khả năng được tìm thấy chứng minh rằngnước đi đó kém hơn so với một nước đi đã được xem xét trước đó Những nước đinhư vậy không cần được đánh giá thêm nữa Khi được áp dụng vào một cây
Trang 5minimax tiêu chuẩn, nó trả về cùng một nước đi như minimax, nhưng loại bỏ cácnhánh không thể ảnh hưởng đến quyết định cuối cùng.
2.4.2 Lý do sử dụng Alpha-beta cho Gomoku:
Alpha-beta pruning giúp giảm số lượng nước đi cần phải xem xét trong trò chơiGomoku Gomoku là một trò chơi có rất nhiều nước đi và tình huống khác nhau, vìvậy việc đánh giá tất cả các nước đi có thể mất rất nhiều thời gian và tài nguyên.Alpha-beta pruning giúp tối ưu hóa quá trình này bằng cách loại bỏ các nước đikhông cần thiết
Cụ thể, Alpha-beta pruning ngừng đánh giá các nước đi khi phát hiện rằng mộtnước đi không tốt hơn các nước đã được xem xét trước đó Điều này giúp giảm bớtsố lượng nước đi phải kiểm tra, từ đó tăng tốc độ tính toán và hiệu suất củachương trình chơi Gomoku
Ngoài ra, Alpha-beta pruning vẫn đảm bảo kết quả cuối cùng giống như khi sửdụng minimax thông thường Điều này có nghĩa là chúng ta không bỏ qua bất kỳnước đi tốt nào, chỉ là chúng ta tránh lãng phí thời gian vào các nước đi không cótriển vọng
Tóm lại, việc sử dụng Alpha-beta pruning trong Gomoku giúp cho chương trìnhchơi hiệu quả hơn, nhanh hơn mà vẫn đảm bảo chất lượng các quyết định
2.5 Áp dụng thuật toán vào đề tài:
2.5.1 Hàm tiện ích (evaluate_board):
Hàm tiện ích được sử dụng để đánh giá trạng thái của bảng tại bất kỳ điểm nàotrong thuật toán Minimax Nó trả về một giá trị số đại diện cho "giá trị" của trạngthái bảng đó đối với người chơi hiện tại Giá trị này được sử dụng để so sánh cáctrạng thái khác nhau và quyết định nước đi tốt nhất
Trang 6def evaluate_board(self, board): score = 0
if self.check_win(board, self.player): score += 10000
if self.check_win(board, self.opponent): score -= 10000
for row in range(board.size): for col in range(board.size): if board.squares[row][col] == self.player: score += self.evaluate_position(board, row, col,
self.player) elif board.squares[row][col] == self.opponent: score -= self.evaluate_position(board, row, col,
self.opponent) return score
def evaluate_position(self, board, row, col, player): score = 0
directions = [( , ), ( , ), ( , ), ( , -01101111)] for dr, dc in directions:
count = 0
block_count = 0
for delta in range(- , 34): r = row + delta * dr c = col + delta * dc if <= r < board.size 0and <= c < board.size:0
if board.squares[r][c] == player: count += 1
elif board.squares[r][c] != :0
block_count += 1
break
else: block_count += 1
break
if block_count < :2
score += count ** 2
Trang 7Ở đây, chúng em sử dụng hàm evaluate_position đánh giá một vị trí cụ thể trênbảng, còn hàm evaluate_board tổng hợp điểm số từ tất cả các vị trí để đưa ra đánhgiá tổng thể của bảng.
2.5.2 Thuật toán Minimax với thuật toán Alpha-beta:
Mục tiêu:Minimax: Xác định giá trị của các trạng thái trò chơi bằng cách duyệt toàn bộ cây
trạng thái trò chơi
Cắt tỉa Alpha-Beta: Loại bỏ các nhánh không cần thiết trong cây tìm kiếm, giúp
tăng tốc độ thuật toán
def minimax(self, board, depth, alpha, beta, maximizing): if depth == 0or board.is_full():
return self.evaluate_board(board), None
if maximizing: max_eval = -float('inf') best_move = None
empty_sqrs = board.get_empty_sqrs() random.shuffle(empty_sqrs)
for (row, col) in empty_sqrs: temp_board = copy.deepcopy(board) temp_board.mark_sqr(row, col, self.player) eval, _ = self.minimax(temp_board, depth - , alpha, 1
beta, False) if eval > max_eval: max_eval = eval best_move = (row, col) alpha = max(alpha, max_eval) if beta <= alpha:
break
Trang 8 min_eval = float('inf') best_move = None
empty_sqrs = board.get_empty_sqrs() random.shuffle(empty_sqrs)
for (row, col) in empty_sqrs: temp_board = copy.deepcopy(board) temp_board.mark_sqr(row, col, self.opponent) eval, _ = self.minimax(temp_board, depth - , alpha, 1
beta, True) if eval < min_eval: min_eval = eval best_move = (row, col) beta = min(beta, min_eval) if beta <= alpha:
break
return min_eval, best_move
Phân tích chi tiết:Người chơi tối đa (Maximizing Player):
Khởi tạo giá trị tối đa: max_eval với giá trị âm vô cùng (-float('inf')).Duyệt qua tất cả các ô trống: Lấy danh sách các ô trống (empty_sqrs) và lặp quatừng ô để giả lập nước đi
Giả lập nước đi: Tạo bản sao của bàn cờ hiện tại, đánh dấu ô trống với nước đi củangười chơi tối đa (self.player), sau đó gọi đệ quy minimax cho lượt của đối thủ(người chơi tối thiểu)
Cập nhật giá trị tối đa: Nếu giá trị trả về từ đệ quy lớn hơn max_eval, cập nhậtmax_eval và lưu lại nước đi tốt nhất (best_move)
Trang 9Cập nhật Alpha: Với giá trị lớn hơn giữa alpha hiện tại và giá trị trả về từ đệ quy(eval).
Cắt tỉa Alpha-Beta: Nếu beta nhỏ hơn hoặc bằng alpha, dừng duyệt các ô còn lại(break)
Người chơi tối thiểu (Minimizing Player):
Khởi tạo giá trị tối thiểu: min_eval với giá trị dương vô cùng (float('inf')).Duyệt qua tất cả các ô trống: Lặp qua từng ô trống để giả lập nước đi.Giả lập nước đi: Tạo bản sao của bàn cờ hiện tại, đánh dấu ô trống với nước đi củađối thủ (self.opponent), sau đó gọi đệ quy minimax cho lượt của người chơi tối đa.Cập nhật giá trị tối thiểu: Nếu giá trị trả về từ đệ quy nhỏ hơn min_eval, cập nhậtmin_eval và lưu lại nước đi tốt nhất (best_move)
Cập nhật Beta: Với giá trị nhỏ hơn giữa beta hiện tại và giá trị trả về từ đệ quy(eval)
Cắt tỉa Alpha-Beta: Nếu beta nhỏ hơn hoặc bằng alpha, dừng duyệt các ô còn lại(break)
Quá trình cắt tỉa Alpha-Beta:
Duyệt một nhánh của cây tìm kiếm: Người chơi tối đa (Max) đang duyệt các nướcđi của mình và cập nhật giá trị Alpha Người chơi tối thiểu (Min) đang duyệt cácnước đi của mình và cập nhật giá trị Beta Nếu người chơi tối thiểu tìm thấy mộtnước đi với giá trị nhỏ hơn hoặc bằng giá trị Alpha hiện tại, điều đó có nghĩa làngười chơi tối đa sẽ không bao giờ chọn nhánh này, vì đã có một nhánh khác tốthơn hoặc ít nhất là bằng tốt nhất cho người chơi tối đa Vì vậy, chúng ta có thể"cắt tỉa" nhánh hiện tại, không cần kiểm tra các nước đi tiếp theo trong nhánh này
Trang 10if beta <= alpha: break
if beta <= alpha:: Kiểm tra điều kiện cắt tỉa Nếu giá trị Beta (giá trị tốt nhất mà
người chơi tối thiểu có thể đảm bảo) nhỏ hơn hoặc bằng giá trị Alpha (giá trị tốtnhất mà người chơi tối đa có thể đảm bảo), chúng ta không cần kiểm tra thêm cácnước đi khác trong nhánh hiện tại
break: Thoát khỏi vòng lặp hiện tại và dừng việc duyệt các nước đi còn lại trong
Trang 11Trò chơi kết thúc khi có một người chơi chiến thắng bằng cách có một hàngngang, dọc hoặc chéo gồm 5 ký tự liên tiếp hoặc khi bàn cờ không còn ô trống.
3.2 Chế độ đấu người đấu với máy (A.I)Mô tả: Chế độ này cho phép người chơi đấu với máy tính Máy tính sẽ sử dụng
các thuật toán để đưa ra nước đi phù hợp
Cách chơi:
Người chơi chọn 'X' hoặc 'O'.Máy tính sẽ đảm nhận vai trò còn lại.Trò chơi kết thúc khi người hoặc máy chiến thắng hoặc hoà khi bàn cờ không cònô trống
Giao diện người dùng
Giao diện menu có nút chức năng chọn kích thước bàn cờ, chọn chế độ chơi“Người đấu Người” và “Người đấu A.I” , nút “Bắt đầu chơi” hiện cửa sổ mới giaodiện bàn cờ, nút “Thoát” để tắt giao diện
Giao diện bàn cờ caro được làm theo ba kích thước, bao gồm: 5x5, 7x7, 11x11.Khi một trong hai người chơi thắng thông báo thắng hoặc hòa sẽ được hiển thị
Trang 12Ngoài ra, sản phẩm cũng có nút “Chơi lại” để khởi động bàn cờ, nút “Trở về” đểquay lại giao diện menu.
Người chơi và máy tính sẽ đánh dấu vào các ô vuông để tiến hành trận đấu
PHẦN 2 DEMO CODE
1 Giao diện
Giao diện Menu:
Trang 13Hình 1.Giao diện Menu
Giao diện bàn cờ:
Hình 2 Bàn cờ kích thước 5x5
Trang 14Hình 3 Bàn cờ kích thước 7x7
Trang 15Hình 4 Bàn cờ kích thước 11x11
2 Demo
Chế độ Người đấu Người:
Trang 16Hình 5 Menu chế độ Người đấu Người
Trang 17Hình 6 Chế độ Người đấu Người
Chế độ Người đấu A.I:
Trang 18Hình 7 Menu chế độ Người đấu A.I
Trang 19Hình 8 Chế độ Người đấu A.I
Bảng thông báo hoà:
Trang 20(Hình 9 Bảng thông báo hoà)
Trang 21Tài liệu tham khảo
1 https://vi.wikipedia.org/wiki/Tic-tac-toe
2 https://viblo.asia/p/thuat-toan-minimax-ai-trong-game-APqzeaVVzVe
3 https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning#:~:text=Alpha%E2%80%93beta%20pruning%20is%20a,Connect%204%2C%20etc.)
4 https://github.com/AlejoG10/python-tictactoe-ai-yt
5 alpha-beta-pruning/
https://www.geeksforgeeks.org/minimax-algorithm-in-game-theory-set-4-6 https://github.com/reshanf-iiitd/CS50_AI_Tic