Mục tiêu của thuật toán là tìm ra nước đi tối ưu cho một người chơi, giả sử cả hai đối thủ chơi với chiến lược tối ưu.Cách thuật toán Minimax hoạt động:1.Xây dựng cây trò chơi Game Tree:
Trang 1TRƯNG ĐI HC SƯ PHM ĐÀ NẴNG
Khoa : Tin học
ĐỒ ÁN CUỐI KÌ
MÔN : TRÍ TUỆ NHÂN TO
ỨNG DỤNG GAME CARO AI VỚI
NGÔN NGỮ PYTHONGiảng viên hướng dẫn :
Giảng viên hướng dẫn : Nguyễn Đỗ Công Pháp
Nhóm : Nhóm : AI 11 Ngành :
Ngành : Công Nghệ Thông Tin Sinh Viên Thực Hiện : Phan Quốc Trường Trần Thị Thúy
Võ Thị Minh Khuyên Nguyễn Hoàng Uyên Nhi
Lê Thị Thùy Trinh
Năm Học 2023- 2024
Trang 2Sự bùng nổ của công nghệ thông tin toàn cầu hiện nay, đã có những bước phát triển mạnh mẽ của các công nghệ số Những chiếc điện thoạismart phone thông minh với nhiều hệ điều hành khác nhau ngày càng được nhiều người sử dụng tin dùng Nắm bắt được xu thế những người lập trình game đưa ra các ý tưởng và tạo ra các ứng dụng game hay và rất hấp dẫn người chơi và có những trò chơi đã đi vào huyền thoại ai cũng biết đến nó Đó là một thành công của lập trình viên trong đó có Việt Nam Để biết rõ hơn về vấn đề này chúng ta cùng nhau tìm hiểu về
GAME "Tic Tac Toe AI" một game đã quá quen thuộc với giới trẻ hiện nay
II Giới thiệu về ngôn ngữ Python,Visual Studio Code và thuật toán MINMAX
a)Ngôn Ngữ Python
Python là một ngôn ngữ lập trình được sử dụng rộng rãi trong các ứng dụng web, phát triển phần mềm, khoa học dữ liệu và máy học (ML) Các nhà phát triển sử dụng Python vì nó hiệu quả, dễ học và
có thể chạy trên nhiều nền tảng khác nhau Phần mềm Python được tải xuống miễn phí, tích hợp tốt với tất cả các loại hệ thống
và tăng tốc độ phát triển
Những lợi ích của Python bao gồm:
- Các nhà phát triển có thể dễ dàng đọc và hiểu một chương trình Python vì ngôn ngữ này có cú pháp cơ bản giống tiếng Anh
- Python giúp cải thiện năng suất làm việc của các nhà phát triển
vì so với những ngôn ngữ khác, họ có thể sử dụng ít dòng mã hơn để viết một chương trình Python
Trang 3- Python có một thư viện tiêu chuẩn lớn, chứa nhiều dòng mã có thể tái sử dụng cho hầu hết mọi tác vụ Nhờ đó, các nhà phát triển sẽ không cần phải viết mã từ đầu.
- Các nhà phát triển có thể dễ dàng sử dụng Python với các ngôn ngữ lập trình phổ biến khác như Java, C và C++
- Cộng đồng Python tích cực hoạt động bao gồm hàng triệu nhà phát triển nhiệt tình hỗ trợ trên toàn thế giới Nếu gặp phải vấn
đề, bạn sẽ có thể nhận được sự hỗ trợ nhanh chóng từ cộng đồng
- Trên Internet có rất nhiều tài nguyên hữu ích nếu bạn muốn học Python Ví dụ: bạn có thể dễ dàng tìm thấy video, chỉ dẫn, tài liệu và hướng dẫn dành cho nhà phát triển
- Python có thể được sử dụng trên nhiều hệ điều hành máy tính khác nhau, chẳng hạn như Windows, macOS, Linux và Unix
b)Giới thiệu về Visual Studio Code
Visual Studio Code chính là ứng dụng cho phép biên tập, soạn thảo các đoạn code để hỗ trợ trong quá trình thực hiện xây dựng, thiết
kế website một cách nhanh chóng Visual Studio Code hay còn được viết tắt là VS Code Trình soạn thảo này vận hành mượt mà trên các nền tảng như Windows, macOS, Linux Hơn thế nữa, VS Code còn cho khả năng tương thích với những thiết bị máy tính có cấu hình tầm trung vẫn có thể sử dụng dễ dàng
Trong đó có thể kể đến những ưu điểm sau:
- Đa dạng ngôn ngữ lập trình giúp người dùng thỏa sức sáng tạo và
Trang 4- Tích hợp các tính năng quan trọng như tính năng bảo mật (Git), khả năng tăng tốc xử lý vòng lặp (Debug),…
- Đơn giản hóa việc tìm quản lý hết tất cả các Code có trên hệ thống
c) Thuật toán MINIMAX:
Thuật toán Minimax là một thuật toán tìm kiếm cây quyết định được sửdụng trong trò chơi với hai đối thủ, như Tic Tac Toe, Chess, hoặc các tròchơi giống nhau Mục tiêu của thuật toán là tìm ra nước đi tối ưu cho một người chơi, giả sử cả hai đối thủ chơi với chiến lược tối ưu
Cách thuật toán Minimax hoạt động:
1.Xây dựng cây trò chơi (Game Tree): Mỗi nút trong cây đại diện
cho một trạng thái của trò chơi, và mỗi cạnh đại diện cho một nước đi có thể được thực hiện từ một trạng thái cụ thể
2.Đánh giá giá trị của các nút lá (Leaf Nodes): Các nút lá là những
trạng thái cuối cùng của trò chơi Mỗi nút lá được đánh giá một giá trị -1 (nếu người chơi khác thắng), 0 (nếu hòa), hoặc 1 (nếu người chơi hiện tại thắng)
3.Lấy giá trị của các nút cha (Parent Nodes): Giá trị của một nút cha
được xác định bằng cách chọn giá trị lớn nhất (nếu đến lượt ngườichơi hiện tại) hoặc giá trị nhỏ nhất (nếu đến lượt đối thủ)
4.Lặp lại quá trình đánh giá và lấy giá trị: Thuật toán lặp lại quá
trình này từ trên xuống đến dưới cho đến khi nó đến nút gốc của cây Tại nút gốc, nó chọn nước đi tối ưu dựa trên giá trị của các nút con
5.Chọn nước đi tối ưu: Sau khi thuật toán đã đánh giá toàn bộ cây,
nó chọn nước đi tối ưu dựa trên giá trị của các nút con trực tiếp kết nối với nút gốc Nếu đây là lượt của người chơi hiện tại, thuật
Trang 5toán sẽ chọn nước đi với giá trị lớn nhất; nếu là lượt của đối thủ, thuật toán sẽ chọn nước đi với giá trị nhỏ nhất.
Thuật toán Minimax đảm bảo rằng người chơi sẽ chọn nước đi tối ưu dựa trên giả định rằng cả hai đối thủ chơi với chiến lược tối ưu, và nó làmột trong những phương pháp quan trọng trong trí tuệ nhân tạo liên quan đến trò chơi
III Báo cáo làm game 'TIC TAC TOE AI' với ngôn ngữ Python
a) Giới thiệu về game 'TIC TAC TOE AI'
-"Tic Tac Toe AI" là một phiên bản của trò chơi caro kinh điển, nơi haingười chơi lần lượt đánh dấu trên một bảng 3x3 Mục tiêu của trò chơi
là tạo thành một dãy 3 ký hiệu giống nhau theo chiều ngang, dọc hoặcchéo Trong phiên bản này, có sự tích hợp của trí tuệ nhân tạo (AI), giúpngười chơi thưởng thức trải nghiệm chơi đơn với máy tính
-Đặc điểm của trò chơi:
+Giao diện đồ họa thân thiện: Trò chơi có một giao diện đồ họa sẽthuận tiện cho việc chơi và theo dõi trạng thái của bảng
+Chế độ chơi: Người chơi có thể chọn giữa chế độ chơi với người khác(Player vs Player - PvP) hoặc chế độ chơi với máy tính (Player vs AI -PvAI)
+Mức độ khó khăn của AI: Trong chế độ PvAI, người chơi có thể thửthách bản thân với các mức độ khó khăn khác nhau của trí tuệ nhântạo Các mức độ này có thể bao gồm cả mức dễ (AI ngẫu nhiên) đếnmức khó (AI sử dụng thuật toán Minimax)
Trang 6+Khả năng chơi lại: Người chơi có thể khởi động lại trò chơi bất kỳ lúc
nào, cung cấp sự thuận tiện khi muốn chơi lại sau khi kết thúc một ván +Hiển thị kết quả: Khi trò chơi kết thúc, người chơi sẽ được thông báo
về kết quả của ván đấu, liệu có người chiến thắng hay trò chơi hòa
"Tic Tac Toe AI" cung cấp một trải nghiệm chơi caro đơn giản nhưng thú
vị với sự thách thức từ trí tuệ nhân tạo, tạo điểm nhấn cho người chơimuốn trải nghiệm caro một cách mới lạ
Game Tic Tac Toe AI Trên PC
b) Luật chơi :
Trang 7a) Bảng chơi: Trò chơi được thực hiện trên một bảng 3x3 ô vuông.
b) Người chơi: Có hai người chơi, một đại diện cho ký hiệu "X" (cross),
và người còn lại đại diện cho ký hiệu "O" (circle)
c) Mục tiêu: Mục tiêu của mỗi người chơi là tạo thành một dãy 3 ký hiệu
giống nhau theo chiều ngang, dọc hoặc chéo trên bảng
d) Lượt đi: Người chơi "X" thường đi trước Sau đó, lượt đi chuyển qua
lại giữa "X" và "O" cho đến khi có người chiến thắng hoặc bảng đầy (hòa)
e) Đánh dấu ô: Mỗi người chơi, khi đến lượt, chọn một ô trống trên
bảng để đánh dấu ký hiệu của mình vào đó
f) Chế độ chơi AI: Nếu trong chế độ PvAI, người chơi sẽ đối mặt với trí
tuệ nhân tạo AI có thể sử dụng thuật toán Minimax để đưa ra nước
đi tối ưu
g) Kết thúc trò chơi: Trò chơi kết thúc khi có một người chiến thắng
hoặc bảng đầy Người chiến thắng là người đầu tiên tạo thành một dãy 3 ký hiệu liên tiếp Nếu bảng đầy mà không có người chiến thắng, trò chơi được coi là hòa
c) Giao diện :
- Nền của trò chơi màu xanh dương
- Được chia làm 9 ô vuông
- “O” sẽ có màu trắng và “X” sẽ có màu đen để phân biệt
- Khi thắng sẽ có dấu gạch cùng màu “X” or “O” thể hiện đường chiến thắng của người tham gia
IV CODE GAME
import copy
import sys
Trang 8screen pygame.display.set_mode( (WIDTH, HEIGHT) ) =
pygame.display.set_caption( 'TIC TAC TOE AI' )
screen.fill( BG_COLOR )
a) Trong đoạn mã này:
1.self.squares: Đây là một thuộc tính của đối tượng được tạo ra từ
lớp Nó là một mảng hai chiều có kích thước (ROWS, COLS), trong
đó ROWS và COLS là các hằng số không được định nghĩa trong phần mã bạn đã chia sẻ Đối tượng này chứa các ô vuông (squares) và được khởi tạo với giá trị 0
2.self.empty_sqrs: Đây là một thuộc tính khác của đối tượng,
nhưng nó được gán bằng tham chiếu đến self.squares Điều này
có nghĩa là self.empty_sqrs và self.squares trỏ đến cùng một đối tượng mảng trong bộ nhớ Bất kỳ thay đổi nào thực hiện trên
self.squares cũng sẽ ảnh hưởng đến self.empty_sqrs, và ngược lại
3.self.marked_sqrs: Đây là một biến khác của đối tượng, khởi tạo
với giá trị 0 Đây có thể là một biến để theo dõi số lượng ô vuông
đã được đánh dấu (marked)
# CLASSES
-class Board :
def init ( self ):
Trang 9self squares np.zeros( (ROWS, COLS) ) =
self empty_sqrs = self squares # [squares]
self marked_sqrs = 0
def final_state ( self show , = False ):
'''
@return 0 if there is no win yet
@return 1 if player 1 wins
@return 2 if player 2 wins
Điều kiện self.squares[0][col] == self.squares[1][col] ==
self.squares[2][col] != 0 kiểm tra xem các giá trị trong cột hiện tại
có giống nhau và khác 0 không Nếu có, nó chỉ ra một dãy ô vuông giống nhau theo chiều dọc và không có ô nào trống (giá trị khác 0)
Nếu điều kiện trên đúng, có nghĩa là có một chiến thắng theo chiều dọc Nếu show là True, mã sẽ vẽ một đường line mô phỏng việc kết nối các ô vuông chiến thắng, và trả về giá trị của người chơi chiến thắng (1 hoặc 2) tại cột đó
# vertical wins
for col in range (COLS):
if self squares[0 ][col] == self squares[1 ][col] == self squares[2 ][col] : != 0 show: if
color CIRC_COLOR = if self squares[0 ][col] == 2 else CROSS_COLOR iPos (col SQSIZE SQSIZE = * + // 2 20 , )
fPos (col SQSIZE SQSIZE , HEIGHT = * + // 2 - 20 )
pygame.draw.line(screen, color, iPos, fPos, LINE_WIDTH)
return self squares[ ][col] 0
Trang 10c) Phần mã này đang kiểm tra trạng thái chiến thắng theo chiều ngang (horizontal) trong bảng các ô vuông của trò chơi.Giải thích mã:
Vòng lặp for row in range(ROWS) duyệt qua từng hàng của bảng (ROWS có thể là một hằng số đại diện cho số lượng hàng trong bảng)
Điều kiện self.squares[row][0] == self.squares[row][1] ==
self.squares[row][2] != 0 kiểm tra xem các giá trị trong hàng hiện
tại có giống nhau và khác 0 không Nếu có, nó chỉ ra một dãy ô vuông giống nhau theo chiều ngang và không có ô nào trống (giá trị khác 0)
Nếu điều kiện trên đúng, có nghĩa là có một chiến thắng theo chiều ngang Nếu show là True, mã sẽ vẽ một đường line mô phỏng việc kết nối các ô vuông chiến thắng, và trả về giá trị của người chơi chiến thắng (1 hoặc 2) tại hàng đó
# horizontal wins
for row in range (ROWS):
if self squares[row][0 ] == self squares[row][1 ] == self squares[row][2 ] != 0 : show: if
color CIRC_COLOR = if self squares[row][0 ] == 2 else CROSS_COLOR iPos ( = 20 , row SQSIZE SQSIZE * + // 2 )
fPos (WIDTH = - 20 , row SQSIZE SQSIZE ) * + // 2
pygame.draw.line(screen, color, iPos, fPos, LINE_WIDTH)
return self squares[row][ ] 0
d)if self.squares[0][0] == self.squares[1][1] == self.squares[2][2] != 0: Điều kiện kiểm tra xem có ba ô vuông giống nhau theo chiều
chéo giảm dần không và không có ô nào trống (khác 0)
o Nếu điều kiện trên đúng, có nghĩa là có một chiến thắng theo chiều chéo giảm dần Trong trường hợp này, đoạn mã sẽ:
Trang 11 if show:: Kiểm tra nếu tham số show là True, tức là nếu bạn
muốn hiển thị đường line mô phỏng việc kết nối các ô vuôngchiến thắng
color = CIRC_COLOR if self.squares[1][1] == 2 else
CROSS_COLOR: Xác định màu sắc của đường line dựa trên
giá trị của ô vuông ở giữa trên đường chéo
iPos = (20, 20): Xác định tọa độ bắt đầu của đường line.
fPos = (WIDTH - 20, HEIGHT - 20): Xác định tọa độ kết thúc
của đường line
pygame.draw.line(screen, color, iPos, fPos,
CROSS_WIDTH): Vẽ đường line trên màn hình Pygame.
return self.squares[1][1]: Trả về giá trị của người chơi chiến
thắng (1 hoặc 2) tại ô vuông giữa trên đường chéo
Mã này kiểm tra chiến thắng theo chiều chéo giảm dần và có thể là mộtphần của hàm kiểm tra trạng thái kết thúc của trò chơi
fPos (WIDTH = - 20 , HEIGHT - 20 )
pygame.draw.line(screen, color, iPos, fPos, CROSS_WIDTH)
return self squares[ ][ ] 1 1
e)if self.squares[2][0] == self.squares[1][1] == self.squares[0][2] != 0: Điều kiện kiểm tra xem có ba ô vuông giống nhau theo chiều
chéo tăng dần không và không có ô nào trống (khác 0)
o Nếu điều kiện trên đúng, có nghĩa là có một chiến thắng theo chiều chéo tăng dần Trong trường hợp này, đoạn mã sẽ:
Trang 12 if show:: Kiểm tra nếu tham số show là True, tức là nếu bạn
muốn hiển thị đường line mô phỏng việc kết nối các ô vuôngchiến thắng
color = CIRC_COLOR if self.squares[1][1] == 2 else
CROSS_COLOR: Xác định màu sắc của đường line dựa trên
giá trị của ô vuông ở giữa trên đường chéo
iPos = (20, HEIGHT - 20): Xác định tọa độ bắt đầu của đường
line
fPos = (WIDTH - 20, 20): Xác định tọa độ kết thúc của đường
line
pygame.draw.line(screen, color, iPos, fPos,
CROSS_WIDTH): Vẽ đường line trên màn hình Pygame.
return self.squares[1][1]: Trả về giá trị của người chơi chiến
thắng (1 hoặc 2) tại ô vuông giữa trên đường chéo
Mã này kiểm tra chiến thắng theo chiều chéo tăng dần và có thể là một phần của hàm kiểm tra trạng thái kết thúc của trò chơi
2. self.squares[2][0] == self.squares[1][1] == self.squares[0][2] != 0: Điều kiện này kiểm tra xem có người chiến thắng hay không dựa trên đường chéo từ góc phải lên góc trái của bàn cờ Cụ thể:
self.squares[2][0]: Ô nằm ở góc dưới cùng bên trái.
self.squares[1][1]: Ô ở giữa bàn cờ.
: Ô nằm ở góc trên cùng bên phải.
Trang 13Nếu giá trị của các ô này bằng nhau và khác 0 (tức là không phải ô trống), thì điều kiện này sẽ đúng, và đoạn mã trong khối if sẽ được thực thi.
3. if show:: Nếu show là True, tức là cần hiển thị đường chéo của người chiến thắng, thì thực hiện các bước sau:
color = CIRC_COLOR if self.squares[1][1] == 2 else CROSS_COLOR: Chọn màu sắc cho đường chéo dựa trên giá trị của ô giữa bàn cờ (self.squares[1][1]) Nếu giá trị này là 2 (đại diện cho người chơi 2), sẽ sử dụng màu CIRC_COLOR, ngược lại sẽ sử dụng màu
4. return self.squares[1][1]: Trả về giá trị của ô giữa bàn cờ, có thể được
sử dụng để xác định người chiến thắng là người chơi 1 hay người chơi 2
pygame.draw.line(screen, color, iPos, fPos, CROSS_WIDTH)
return self squares[ ][ ] 1 1
# no win yet
return
f) mark_sqr method : để đánh dấu ô trên bàn cờ
def mark_sqr ( self row col player , , , ):
self squares[row][col] player =
Trang 14self marked_sqrs += 1
empty_sqr method: được thiết kế để kiểm tra xem một ô trên bàn cờ
có trống (chưa được đánh dấu) hay không
def empty_sqr ( self row col , , ):
return self squares[row][col] == 0
g)get_empty_sqrs method: được thiết kế để trả về danh sách các ô trống trên bàn cờ
def get_empty_sqrs ( self ):
empty_sqrs [] =
for row in range (ROWS):
for col in range (COLS):
if self empty_sqr(row, col):
empty_sqrs.append( (row, col) )
return empty_sqrs
h)isfull , isempty method: được thiết kế để kiểm tra trạng thái của bàn cờ.
def isfull ( self ):
return self marked_sqrs == 9
def isempty ( self ):
return self marked_sqrs == 0
i) AI class: Hàm init là một phương thức khởi tạo trong Python và nó được gọi tự động khi một đối tượng mới của lớp được tạo
class AI :