Game Cờ Carođược phát triển bằng ngôn ngữ Python, sử dụng thư viện Pygame và NumPy, cùng vớiviệc áp dụng các thuật toán AI nhằm nâng cao trải nghiệm của người chơi.. Lý do chọn đề tài V
Trang 1HỌC VIỆN HÀNG KHÔNG VIỆT NAM
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO TIỂU LUẬNTRÍ TUỆ NHÂN TẠO“NGHIÊN CỨU VÀ XÂY DỰNG
GAME CỜ CARO”
HỌC KỲ 3 – NĂM HỌC: 2023-2024 MÃ LỚP HỌC PHẦN: 010100085801
Giảng viên hướng dẫn: TS Trần Nguyên Bảo
Trang 2NHẬN XÉT VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN
Trang 3MỤC LỤC
DANH MỤC HÌNH ẢNH
LỜI NÓI ĐẦU
CHƯƠNG 1 GIỚI THIỆU
1.1.Lý do chọn đề tài 1
1.2.Mục tiêu đề tài 1
1.3 Phạm vi đề tài 1
1.4 Đối tượng nghiên cứu 1
1.5 Phương pháp nghiên cứu 2
CHƯƠNG 2 CƠ SỞ LÝ THUYẾT
2.1 Ngôn ngữ lập trình Python 3
2.2 Visual Studio Code 3
2.3 Thư viện hỗ trợ cho trò chơi Pygame 3
2.4 Thư viện NumPy 4
2.5 Thuật toán Greedy 4
2.6 Thuật toán A* 4
CHƯƠNG 3 SẢN PHẨM
3.1 Phân tích thuật toán trong game 5
3.1.1 Nguyên lý hoạt động của Thuật toán Greedy trong cờ caro 5
3.1.2 Nguyên lý hoạt động của Thuật toán A* trong cờ caro 6
3.2 Giao diện sản phẩm 8
3.2.1 Giao diện chính khi vào game 8
3.2.2 Giao diện hiển thị thông tin 9
3.2.3 Giao diện người chơi với người 10
3.2.4 Giao diện lựa chọn Máy sử dụng thuật toán nào 11
3.2.5 Giao diện đánh với máy( thuật toán Greedy ) 12
3.2.6 Giao diện đánh với máy( thuật toán A* ) 13
3.2.7 Giao diện lựa chọn thuật toán cho máy đánh với máy 14
3.2.8 Giao diện máy( Greedy ) đánh với máy ( A* ) 15
3.2.9 Giao diện chức năng đầu hàng 16
3.2.10 Giao diện chức năng thoát game 17
3.2.11 Giao diện tiếp lựa chọn tiếp tục trò chơi 18
Trang 4CHƯƠNG 4 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
4.1 Kết luận 19
4.2 Hướng phát triển 19
TÀI LIỆU THAM KHẢO
Trang 5DANH MỤC HÌNH ẢNH
Hình 3.2.1 Giao diện vào game
Hình 3.2.2 Giao diện thông tin
Hình 3.2.3 Giao diện người chơi với người
Hình 3.2.4 Giao diện chọn máy sử dụng thuật toán chọn X hoặc O
Hình 3.2.5 Giao diện đánh với máy( thuật toán Greedy )
Hình 3.2.6 Giao diện đánh với máy( thuật toán A* )
Hình 3.2.7 Giao diện lựa chọn thuật toán cho máy đánh với máy
Hình 3.2.8 Giao diện máy( Greedy ) đánh với máy ( A* )
Hình 3.2.9 Giao diện chức năng đầu hàng
Hình 3.2.10 Giao diện chức năng thoát game
Hình 3.2.11 Giao diện tiếp lựa chọn tiếp tục trò chơi
Trang 6LỜI NÓI ĐẦU
Trong bối cảnh công nghệ thông tin không ngừng phát triển và mang lại nhữngtiến bộ vượt bậc, trí tuệ nhân tạo (AI) đã trở thành một lĩnh vực then chốt, hứa hẹnnhững ứng dụng đột phá và những cơ hội mới mẻ Với mong muốn khám phá và ứngdụng các thuật toán AI vào thực tế, nhóm chúng em đã lựa chọn đề tài "Nghiên CứuVà Xây Dựng Game Cờ Caro" cho tiểu luận môn Trí Tuệ Nhân Tạo
Đề tài này không chỉ giúp chúng em tiếp cận sâu hơn với các thuật toán thôngminh như Greedy và A*, mà còn mang lại cơ hội rèn luyện kỹ năng lập trình, pháttriển phần mềm thông qua việc xây dựng một trò chơi hoàn chỉnh Game Cờ Carođược phát triển bằng ngôn ngữ Python, sử dụng thư viện Pygame và NumPy, cùng vớiviệc áp dụng các thuật toán AI nhằm nâng cao trải nghiệm của người chơi Đây khôngchỉ là một bài tập học thuật, mà còn là một dự án mang tính thực tiễn cao, giúp chúngem hiểu rõ hơn về cách thức ứng dụng AI vào đời sống
Trong suốt quá trình nghiên cứu và phát triển, nhóm chúng em đã nhận được sựhướng dẫn tận tình và quý báu từ TS Trần Nguyên Bảo Những chỉ dẫn sâu sắc vàkhuyến khích từ thầy đã giúp chúng em vượt qua những khó khăn và hoàn thiện tiểuluận này một cách tốt nhất.Chúng em hy vọng rằng, tiểu luận này sẽ không chỉ là mộtcông trình học thuật mà còn là một tài liệu hữu ích cho những ai quan tâm đến lĩnh vựctrí tuệ nhân tạo và phát triển game
Chúng em xin chân thành cảm ơn!
Trang 7CHƯƠNG 1 GIỚI THIỆU
1.1 Lý do chọn đề tài
Với những kiến thức đã được tiếp thu trên lớp, nhằm cũng cố kiến thức đã đượchọc nhóm quyết định lựa chọn xây dựng game cờ caro với mục đích áp dụng các thuậttoán đã được học để thấy sự hấp dẫn của thuật toán trong học hành và thực tế
1.2 Mục tiêu đề tài
Xây dựng game cờ caro hoàn chỉnh, giao diện thân thiện và dễ sử dụng, áp dụngcác thuật toán cho trí tuệ nhân tạo giúp đối thủ máy có khả năng đánh giá và đưa ranước đi tối ưu nhất
Lĩnh vực: Đề tài thuộc lĩnh vực trí tuệ nhân tạo và phát triển phần mềm, vớitrọng tâm là việc ứng dụng các thuật toán AI trong game Cờ Caro
Nội dung: Đề tài tập trung vào việc nghiên cứu các thuật toán Greedy và A*,phát triển giao diện người dùng, và triển khai các chức năng cơ bản của trò chơi CờCaro
1.4 Đối tượng nghiên cứu
Đề tài nghiên cứu các đối tượng sau:Thuật toán Greedy: Tìm hiểu nguyên lý, cách thức hoạt động và ứng dụng trongviệc tìm nước đi tối ưu trong game Cờ Caro
Trang 8Thuật toán A*: Nghiên cứu chi tiết về thuật toán A*, cách thức hoạt động vàứng dụng trong việc tìm đường đi tối ưu.
Ngôn ngữ lập trình Python: Sử dụng Python để lập trình game, khai thác cácthư viện hỗ trợ như Pygame và NumPy
Thư viện Pygame: Sử dụng Pygame để phát triển giao diện và xử lý các tươngtác trong game
Người chơi: Nghiên cứu về hành vi và trải nghiệm của người chơi khi tương tácvới game
1.5 Phương pháp nghiên cứu
Để thực hiện đề tài này, nhóm chúng em đã sử dụng các phương pháp nghiêncứu sau:
Phương pháp thu thập thông tin:Khảo sát: Tiến hành khảo sát người dùng để hiểu rõ nhu cầu và mong muốn củahọ đối với một trò chơi Cờ Caro
Đọc tài liệu: Nghiên cứu các tài liệu, sách, bài báo liên quan đến thuật toánGreedy, A*, và phát triển game bằng Python
Tìm hiểu các dự án mã nguồn mở: Tham khảo các dự án mã nguồn mở để hiểurõ hơn về cách triển khai game và thuật toán
Phương pháp xử lý thông tin: Sử dụng các phương pháp thống kê và chọn lọc để phân tích dữ liệu thu
thập được từ khảo sát người dùng. Phân tích các phản hồi và ý kiến từ người chơi để cải thiện và hoàn thiện
game.Phương pháp thực nghiệm:Phát triển và kiểm thử: Xây dựng và hoàn thiện các giao diện và chức năng củagame, sau đó tiến hành kiểm thử để phát hiện và sửa lỗi
Trang 9So sánh và đánh giá: So sánh hiệu suất và hiệu quả của các thuật toán Greedyvà A* trong việc tìm nước đi tối ưu, đánh giá trải nghiệm người dùng qua các chứcnăng khác nhau của game.
CHƯƠNG 2 CƠ SỞ LÝ THUYẾT2.1 Ngôn ngữ lập trình Python
Python là một ngôn ngữ lập trình bậc cao, mạnh mẽ và linh hoạt, được sử dụngrộng rãi trong nhiều lĩnh vực khác nhau như phát triển web, khoa học dữ liệu, trí tuệnhân tạo và phát triển trò chơi Python nổi bật với cú pháp đơn giản, dễ đọc, dễ học, vàcó thư viện phong phú hỗ trợ cho nhiều ứng dụng Một trong những lý do Pythonđược lựa chọn cho đề tài này là nhờ vào khả năng hỗ trợ mạnh mẽ từ cộng đồng và sựđa dạng của các thư viện, giúp tiết kiệm thời gian và công sức trong quá trình pháttriển.[1]
2.2 Visual Studio Code
Visual Studio Code (VS Code) là một trình soạn thảo mã nguồn nhẹ nhưngmạnh mẽ, chạy trên máy tính để bàn và có sẵn cho các hệ điều hành Windows, macOSvà Linux VS Code hỗ trợ tích hợp cho nhiều ngôn ngữ lập trình như JavaScript,TypeScript, và Node.js, cùng với một hệ sinh thái mở rộng phong phú cho các ngônngữ và thời gian chạy khác (như C++, C#, Java, Python, PHP, Go, NET) Điểm mạnhcủa VS Code bao gồm:
Giao diện thân thiện: Dễ sử dụng và tùy chỉnh
Tiện ích mở rộng: Hàng nghìn tiện ích mở rộng có sẵn, cho phép ngườidùng thêm chức năng và hỗ trợ cho các ngôn ngữ lập trình khác nhau
Tích hợp Git: Hỗ trợ tích hợp với Git và các hệ thống kiểm soát phiênbản khác
Gỡ lỗi: Tích hợp sẵn các công cụ gỡ lỗi mạnh mẽ
2.3 Thư viện hỗ trợ cho trò chơi Pygame
Pygame là một thư viện Python phổ biến được sử dụng để phát triển các tròchơi 2D Pygame cung cấp các mô-đun để làm việc với đồ họa, âm thanh, và các yếutố trò chơi khác, giúp quá trình phát triển trò chơi trở nên dễ dàng và hiệu quả hơn.Một số tính năng nổi bật của Pygame bao gồm: [2]
Trang 10 Xử lý đồ họa: Hỗ trợ các hình ảnh, hình vẽ, và văn bản. Âm thanh: Cung cấp các công cụ để phát và kiểm soát âm thanh. Xử lý sự kiện: Quản lý các sự kiện từ bàn phím, chuột, và các thiết bị
đầu vào khác. Hiệu suất cao: Được tối ưu hóa để chạy mượt mà trên nhiều hệ điều
hành
2.4 Thư viện NumPy
NumPy là một thư viện Python mạnh mẽ cho phép xử lý các mảng và ma trận, cũng như các hàm toán học phong phú để thực hiện các phép tính số học trên các tập dữ liệu lớn Trong phát triển game Cờ Caro, NumPy được sử dụng để:
Xử lý dữ liệu: Quản lý và thao tác các bảng dữ liệu và ma trận. Tối ưu hóa thuật toán: Tăng hiệu suất tính toán các thuật toán Greedy và
A*. Phân tích dữ liệu: Hỗ trợ các thao tác phân tích và tính toán dữ liệu hiệu
quả
2.5 Thuật toán Greedy
Thuật toán Greedy đưa ra quyết định dựa trên tiêu chí tối ưu cục bộ tại từngbước đi, mà không quan tâm đến kết quả toàn cục Trong cờ caro, điều này có nghĩa làở mỗi nước đi, thuật toán sẽ chọn nước đi mang lại lợi ích cao nhất ngay tại thời điểmđó
Thuật toán A* là một thuật toán tìm kiếm đường đi dựa trên đánh giá chi phí vàheuristic để tìm ra con đường tối ưu toàn cục Thuật toán này thường được sử dụngtrong các bài toán tìm kiếm đường đi ngắn nhất trên đồ thị, như tìm đường trong mêcung, tìm đường trên bản đồ Trong trò chơi cờ caro, A* có thể được áp dụng để tìmnước đi tối ưu bằng cách xem xét cả lợi ích cục bộ (tấn công và phòng thủ) và chi phíước lượng (heuristic) để đạt được trạng thái thắng lợi
Trang 12CHƯƠNG 3 SẢN PHẨM3.1 Phân tích thuật toán trong game
3.1.1 Nguyên lý hoạt động của Thuật toán Greedy trong cờ caroKhởi tạo bàn cờ: Bàn cờ được biểu diễn dưới dạng ma trận 2D kích thước
19x19, trong đó các ô có thể là 0 (ô trống), 1 (quân của người chơi 1), hoặc -1 (quâncủa người chơi 2)
Hàm đánh giá tiềm năng của một ô trống( evaluate_position )là hàm khởi
tạo và xác định các hướng kiểm tra: Các hướng kiểm tra bao gồm ngang, dọc và haiđường chéo:
[0, 1]: Ngang [1, 0]: Dọc [1, 1]: Chéo trái sang phải [1, -1]: Chéo phải sang tráiĐếm số quân cờ liên tiếp và kiểm tra hai đầu bị chặn: Đối với mỗi hướng,chương trình sẽ kiểm tra theo cả hai chiều (phía trước và phía sau) từ vị trí hiện tại(row, col):
count: Đếm số quân cờ liên tiếp của người chơi (player). blocks: Đếm số hướng bị chặn bởi quân đối phương hoặc ra ngoài bàn
cờ.Tính điểm: Nếu vị trí bị chặn ở cả hai đầu, điểm sẽ bằng 0 Ngược lại, điểm sẽbằng số quân cờ liên tiếp đếm được
Cập nhật max_score nếu score của hướng hiện tại cao hơn và trả về điểm caonhất trong tất cả các hướng đã kiểm tra
Tìm các nước đi tốt nhất( get_best_points ) là hàm duyệt qua toàn bộ bàn cờ,
sử dụng evaluate_position để tính điểm cho mỗi ô trống và tìm các ô có điểm cao nhấtcho cả tấn công và phòng thủ:
max_attack_score: Điểm cao nhất cho tấn công. max_defense_score: Điểm cao nhất cho phòng thủ
Trang 13 best_defense_points: Danh sách các điểm phòng thủ tốt nhất.
Lựa chọn nước đi( get_computer_move_greedy) :
Nếu điểm tấn công cao hơn hoặc bằng điểm phòng thủ, chọn một trongcác ô có điểm tấn công cao nhất
Nếu điểm phòng thủ cao hơn, chọn một trong các ô có điểm phòng thủcao nhất
Trong trường hợp có nhiều ô có điểm tương đương, chọn ngẫu nhiên mộtô trong số đó
3.1.2 Nguyên lý hoạt động của Thuật toán A* trong cờ caroKhởi tạo bàn cờ: Bàn cờ được biểu diễn dưới dạng ma trận 2D kích thước
19x19, trong đó các ô có thể là 0 (ô trống), 1 (quân của người chơi 1), hoặc -1 (quâncủa người chơi 2)
Định nghĩa điểm số cho các trường hợp tấn công và phòng thủ: Attack = [0, 12, 80, 300, 2500, 20000] : Định nghĩa điểm số tấn công
Nếu có không ô liên tiếp là gán giá trị là 0, một ô liên tiếp gán giá trị là12, hai ô liên tiếp gán giá trị 80, ba ô liên tiếp gán giá trị là 300, ba ô liêntiếp và có hai ô trống ở cả hai đầu của hàng thì gán giá trị là 2500, bốn ôliên tiếp gán giá trị là 20000
Defense = [0, 4, 36, 120, 1000, 8748] : Định nghĩa điểm số phòng thủ.Nếu có không ô liên tiếp là gán giá trị là 0, một ô liên tiếp gán giá trị là4, hai ô liên tiếp gán giá trị 36, ba ô liên tiếp gán giá trị là 120, ba ô liêntiếp và có hai ô trống ở cả hai đầu của hàng thì gán giá trị là 1000, bốn ôliên tiếp gán giá trị là 8748
Hàm đánh giá trạng thái là hàm EvaluatePosition được sử dụng để đánh giá
một vị trí cụ thể (ô trống) trên bàn cờ, tính toán điểm cho vị trí này dựa trên các nướctấn công hoặc phòng thủ:
directions: Các hướng kiểm tra (dọc, ngang, chéo chính, chéo phụ). scores: Mảng lưu điểm số cho mỗi hướng
rows, columns: Kích thước bàn cờ
Kiểm tra từng hướng là hàm kiểm tra các hướng từ vị trí (x, y) để đếm số
lượng quân cờ liên tiếp của người chơi và tính toán điểm cho mỗi hướng:
Trang 14 count: Đếm số quân cờ liên tiếp của người chơi.( ban đầu cho count là0 ).
block_open_ends: Đếm số ô trống ở cả hai đầu của hàng quân cờ liêntiếp
Sử dụng mảng Attack hoặc Defense để xác định điểm cho mỗi hướngdựa trên giá trị count
Trả về tổng điểm: Tổng điểm cho vị trí (x, y) là tổng điểm của tất cả các
Lựa chọn nước đi ( CptFindChessAStar ) hàm CptFindChessAStar tìm nước
đi tốt nhất cho máy tính bằng cách sử dụng thuật toán A*: Nếu bàn cờ đầy, trả về None
Nếu là lượt đánh đầu tiên, chọn ngẫu nhiên một ô trong phạm vi 3x3 ởgiữa bàn cờ
Nếu không, thực hiện tìm kiếm thông thường bằng thuật toán A* để tìmnước đi tốt nhất
Trang 153.2 Giao diện sản phẩm
3.2.1 Giao diện chính khi vào game
Đây là giao diện chính khi người dùng vào trò chơi Ở đây người dùng có thểchọn hai người chơi để chơi với bạn bè, chọn chơi với máy để đấu với máy, chức năngtắt hoặc bật âm nhạc nền, chức năng thoát, bấm vào nút i để xem thông tin, bấm vàoavatar bên dưới để chọn tính năng 2 máy đấu với nhau
Hình 3.2.1 Giao diện vào game
Trang 163.2.2 Giao diện hiển thị thông tin
Khi người dùng bấm vào nút i sẽ hiện ra thông tin của những thành viên tạo nêntrò chơi này
Hình 3.2.2 Giao diện thông tin
Trang 173.2.3.Giao diện người chơi với người
Đây là giao diện người đánh với người để chơi với bạn bè Khi bên nào thắng sẽcộng một điểm cho người chơi đó, có chức năng thoát để thoát game, chức năng chơi tiếp để chơi tiếp
Hình 3.2.3 Giao diện người chơi với người
Trang 183.2.4 Giao diện lựa chọn Máy sử dụng thuật toán nào
Người chơi sẽ lựa chọn X hoặc O với lựa chọn X người chơi sẽ được đánhtrước và máy sẽ đánh sau Ngược lại với lựa chọn O người chơi sẽ đánh sau và máy sẽđánh trước
Hình 3.2.4 Giao diện chọn máy sử dụng thuật toán chọn X hoặc O
Trang 193.2.5 Giao diện đánh với máy( thuật toán Greedy )
Khi người dùng chọn đánh với máy bằng thuật toán Greedy thì giao diện sẽ
hiện ra như ảnh.
Hình 3.2.5 Giao diện đánh với máy( thuật toán Greedy )
Trang 203.2.6 Giao diện đánh với máy( thuật toán A* )
Khi người dùng chọn đánh với máy bằng thuật toán A* thì giao diện sẽ hiện ra như ảnh
Hình 3.2.6 Giao diện đánh với máy( thuật toán A* )
Trang 213.2.7 Giao diện lựa chọn thuật toán cho máy đánh với máy
Ở đây người dùng có thể chọn cho 2 máy hai thuật toán khác nhau hoặc giống nhau để xem thuật toán nào khôn hơn giúp cho người dùng có thể quan sát và nghiên cứu về 2 thuật toán ấy
Hình 3.2.7 Giao diện lựa chọn thuật toán cho máy đánh với máy
Trang 223.2.8.Giao diện máy( Greedy ) đánh với máy ( A* )
Hình 3.2.8 Giao diện máy( Greedy ) đánh với máy ( A* )
Trang 233.2.9 Giao diện chức năng đầu hàng
Khi người dùng biết mình không thể thắng được máy thì người dùng có thể đầu hàng để chơi ván mới
Hình 3.2.9 Giao diện chức năng đầu hàng
Trang 243.2.10.Giao diện chức năng thoát game
Khi người chơi không muốn chơi nữa hoặc muốn muốn bắt đầu một game mới, người chơi có thể thoát ra
Hình 3.2.10 Giao diện chức năng thoát game