1. Trang chủ
  2. » Luận Văn - Báo Cáo

trí tuệ nhân tạo đề tài xây dựng trò chơi cờ caro cổ điển có sử dụng trí tuệ nhân tạo

21 2 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Xây dựng trò chơi cờ caro cổ điển có sử dụng trí tuệ nhân tạo
Tác giả Trần Huy Hoàng, Lê Tấn Đạt, Đặng Nhật Hào, Nguyễn Quốc Trí, Trần Đình Anh Duy, Hoàng Minh Trí
Thể loại Báo cáo Tiến độ Tiểu luận
Năm xuất bản 2024
Thành phố TP. HCM
Định dạng
Số trang 21
Dung lượng 1,57 MB

Nội dung

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 1

BÁ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 2

PHẦ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 3

chuỗ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 4

trị 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 5

minimax 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 6

def 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 9

Cậ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 10

if 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 11

Trò 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 12

Ngoà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 13

Hình 1.Giao diện Menu

Giao diện bàn cờ:

Hình 2 Bàn cờ kích thước 5x5

Trang 14

Hình 3 Bàn cờ kích thước 7x7

Trang 15

Hình 4 Bàn cờ kích thước 11x11

2 Demo

Chế độ Người đấu Người:

Trang 16

Hình 5 Menu chế độ Người đấu Người

Trang 17

Hình 6 Chế độ Người đấu Người

Chế độ Người đấu A.I:

Trang 18

Hình 7 Menu chế độ Người đấu A.I

Trang 19

Hì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 21

Tà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

Ngày đăng: 06/09/2024, 17:00

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w