Professional Documents
Culture Documents
Bao Cao Chuyen de TTNT
Bao Cao Chuyen de TTNT
Bao Cao Chuyen de TTNT
ĐỀ TÀI:
XÂY DỰNG TRÒ CHƠI RẮN SĂN MỒI
SỬ DỤNG THUẬT TOÁN BFS
Lớp : D16CNPM7
HÀ NỘI, 12/2023
lOMoAR cPSD| 328 163 18
MỤC LỤC
LỜI MỞ ĐẦU.........................................................................................................................................3
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT......................................................................................................4
1.1. Tổng quan về trí tuệ nhân tạo.........................................................................................................4
1.1.1. Khái niệm.......................................................................................................................................4
1.1.2. Phân loại.........................................................................................................................................5
1.1.3. Ứng dụng của trí tuệ nhân tạo........................................................................................................6
1.1.4. Mặt tích cực và khó khăn của trí tuệ nhân tạo................................................................................8
1.2. Tổng quan về đề tài........................................................................................................................9
1.2.1. Mô tả trò chơi.................................................................................................................................9
1.2.2. Lịch sử hình thành và phát triển của trò chơi.................................................................................9
1.2.3. Ứng dụng và đề xuất cải tiến trò chơi...........................................................................................10
1.3. Các công nghệ áp dụng trong đề tài.............................................................................................11
1.3.1. Tổng quan về ngôn ngữ lập trình Python.....................................................................................11
1.3.2. Thư viện Pygame..........................................................................................................................12
CHƯƠNG 2: ỨNG DỤNG THUẬT TOÁN BREADTH FIRST SEARCH XÂY DỰNG
SNAKE GAME.....................................................................................................................................14
2.1. Thuật toán Breadth First Search...................................................................................................14
2.1.1. Mô tả thuật toán............................................................................................................................14
2.1.2. Thuật toán.....................................................................................................................................14
2.1.3. Ưu,nhược điểm.............................................................................................................................16
2.2. Ứng dụng thuật toán Breadth First Search xây dựng Snake Game..............................................17
2.2.1. Thuật toán BFS trong trò chơi rắn săn mồi..................................................................................17
Áp dụng thuật toán BFS.......................................................................................................................17
CHƯƠNG 3: XÂY DỰNG VÀ TRIỂN KHAI ỨNG DỤNG...........................................................19
3.1. Xây dựng trò chơi.........................................................................................................................19
3.1.1. Xây dựng khung nhìn...................................................................................................................19
3.1.2. Xây dựng con rắn và thức ăn........................................................................................................20
3.1.3. Hiển thị điểm số và thông điệp.....................................................................................................22
3.2. Hoạt động của trò chơi.................................................................................................................22
3.2.1. Di chuyển......................................................................................................................................22
3.2.2. Tìm đường đi................................................................................................................................24
3.3. Áp dụng thuật toán BFS...............................................................................................................25
3.4. Hoàn thiện trò chơi.......................................................................................................................26
KẾTLUẬN............................................................................................................................................31
Tài liệu tham khảo................................................................................................................................32
2
lOMoAR cPSD| 328 163 18
LỜI MỞ ĐẦU
Trí tuệ nhân tạo là một ngành thuộc lĩnh vực khoa học máy tính. Là trí tuệ do con
người lập trình tạo nên với mục tiêu giúp máy tính có thể tự động hoá các hành vi thông
minh như con người. Trí tuệ nhân tạo đã có những bước phát triển lớn, cũng như những
sự đột phá về công nghệ, là ngành đang định hình lại xã hội của chúng ta. Với sự hướng
dẫn của Thầy Vũ Văn Định nhóm em sẽ nghiên cứu và xây dựng trò chơi rắn săn mồi
sử dụng thuật toán tìm kiếm theo chiều rộng (BFS). Trò chơi rắn săn mồi là một trò
chơi cổ điển, phổ biến và dễ cài đặt. Trong trò chơi này đòi hỏi con rắn phải có khả
năng ra quyết định thông minh để tìm kiếm mồi, trong khi đó tránh va chạm với thân
mình và biên của bản đồ, kèm theo đó là sống sót lâu nhất có thể. Đây là một bài toán
thú vị, có thể áp dụng nhiều kỹ thuật và thuật toán khác nhau để giải quyết. Và BFS là
thuật toán tìm kiếm theo chiều rộng nổi tiếng trong lý thuyết đồ thị. Thuật toán này sẽ
duyệt từ gốc và loang dần đến các nút có độ sâu tăng dần. Nó là một thuật toán đơn giản
giúp chúng ta tìm được đường đi ngắn nhất giữa 2 ô trong ma trận. Dựa trên thuật toán
này chúng ta sẽ xây dựng được một AI đơn giản cho Snake game. Từ đó mô tả một
phần ứng dụng của AI trong thực tế.
Do kiến thức và vốn hiểu biết về trí tuệ nhân tạo vẫn còn nhiều hạn chế nên trong đề
tài nghiên cứu vẫn còn nhiều thiếu sót, nhóm em kính mong cô thông cảm và đưa ra
nhận sét về đề tài để nhóm có thể hoàn thiện hơn. Nhóm em xin chân thành cảm ơn!
3
lOMoAR cPSD| 328 163 18
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
vậy những hệ thống được xây dựng để có khả năng lập luận dựa trên việc sử dụng các
hệ thống logic để đưa ra những kết quả tốt nhất.
Hệ thống hành động hợp lý
Đôi khi, ta phải đưa ra những quyết định trong những tình huống bất ngờ chưa có
yếu tố chắc mà chỉ dựa trên phản xạ. Tương tự như vậy, các hệ thống hành động hợp
lý có thể sử dụng cả hai cách tiếp cận dựa trên suy diễn và dựa trên phản xạ để đạt
được kếtquảtốt.
1.1.2. Phân loại
Phân loại AI dựa vào hai yếu tố, từ dó ta có hai cách phân loại sau:
Cách 1: Phân loại dựa trên mức độ thông minh:
Artificial Narrow Intelligence (ANI - Trí tuệ nhân tạo hẹp)
Loại trí tuệ nhân tạo này đại diện cho tất cả các AI hiện có, bao gồm cả những AI
phức tạp nhất và có khả năng nhất từng được tạo ra cho đến nay. Trí tuệ nhân tạo hẹp
đề cập đến các hệ thống AI chỉ có thể thực hiện một nhiệm vụ cụ thể một cách tự động
bằng cách sử dụng các khả năng giống như con người. Những cỗ máy này không thể
làm gì hơn những gì chúng được lập trình để làm, và do đó có một phạm vi năng lực
rất hạn chếhoặchẹp.
Artificial General Intelligence (AGI - Trí tuệ nhân tạo chung)
Trí tuệ nhân tạo tổng quát/ chung là khả năng của một AI có thể học, nhận thức,
hiểu và hoạt động hoàn toàn giống như một con người. Các hệ thống này sẽ có thể xây
dựng độc lập nhiều năng lực và hình thành các kết nối và tổng quát hóa trên các lĩnh
vực.
Artificial Super Intelligence (ASI - Siêu trí tuệ nhân tạo)
Được coi là đỉnh cao của nghiên cứu AI. ASI ngoài việc tái tạo trí thông minh nhiều
mặt của con người, sẽ cực kỳ tốt hơn trong mọi việc vì có bộ nhớ lớn hơn, xử lý và
phân tích dữ liệu nhanh hơn và khả năng ra quyết định.
Cách 2: Phân loại dựa trên khả năng mô phỏng suy, hành động của con người:
Reactive Machines - AI phản ứng
Là những dạng hệ thống AI lâu đời nhất, khả năng cũng cực kỳ hạn chế. Chúng mô
phỏng khả năng phản ứng của tâm trí con người với các loại kích thích khác nhau.
Những máy này không có chức năng dựa trên bộ nhớ. Điều này có nghĩa là những máy
như vậy không thể sử dụng những kinh nghiệm đã đạt được trước đó để thông báo cho
các hành động hiện tại của chúng, tức là những máy này không có khả năng “học hỏi”
Limited Memory - AI với trí nhớ giới hạn
AI có bộ nhớ hạn chế là AI ngoài việc có các khả năng phản ứng thuần túy, còn có
khả năng học hỏi từ dữ liệu lịch sử để đưa ra quyết định. Gần như tất cả các ứng dụng
5
lOMoAR cPSD| 328 163 18
hiện có mà chúng ta biết đều thuộc thể loại AI này. Hầu hết tất cả các ứng dụng AI
ngày nay, từ chatbot và trợ lý ảo cho đến xe tự lái đều được điều khiển bởi AI bộ nhớ
hạn chế.
Theory of Mind - Lý thuyết về Trí tuệ nhân tạo
AI loại này vẫn tồn tại dưới dạng một khái niệm hoặc một công trình đang được tiến
hành. Đây là một lý thuyết mà AI sẽ có thể hiểu rõ hơn về các thực thể mà nó đang
tương tác bằng cách phân biệt nhu cầu, cảm xúc, niềm tin hay nói một cách khác đó là
sự thấu hiểu “con người”.
Self-Awareness - Tự nhận thức
Công nghệ AI này có khả năng tự nhận thức về bản thân, có ý thức và hành xử như
con người. Thậm chí, chúng còn có thể bộc lộ cảm xúc cũng như hiểu được những cảm
xúc của con người. Đây được xem là bước phát triển cao nhất của công nghệ AI tuy
nhiên đến thời điểm hiện tại, công nghệ này vẫn chưa khả thi.
1.1.3. Ứng dụng của trí tuệ nhân tạo
Y tế và chăm sóc sức khoẻ
AI trong ra quyết định lâm sàng: IBM Watson là một trong những hệ thống hàng
đầu hỗ trợ chăm sóc sức khỏe bằng AI, giúp các bác sĩ đưa ra quyết định hiệu quả. Với
khả năng máy học (machine learning) và khả năng xử lý ngôn ngữ tự nhiên, hệ thống
này giúp các bác sĩ xem xét hồ sơ sức khoẻ điện tử của bệnh nhân và cập nhật thông
tin hướng dẫn điều trị từ các công trình nghiên cứuykhoa.
AI trong hồ sơ sức khoẻ điện tử: Hiện nay, EHR đã trở thành một trong những công
việc tiêu tốn nhiều thời gian nhất của nhân viên y tế tại các cơ sở chăm sóc sức khỏe.
Công nghệ AI hứa hẹn có thể giúp các nhà cung cấp dịch vụ chăm sóc sức khỏe thu
thập, lưu trữ, định dạng lại và theo dõi dữ liệu lâm sàng, cũng như các kế hoạch và
đánh giá cá nhân hóa.
AI trong chẩn đoán: Công nghệ AI đã được sử dụng để cải thiện chất lượng chẩn
đoán, đặc biệt là trong X quang. AI dựa trên nguồn dữ liệu 129.450 hình ảnh lâm sàng
để chẩn đoán bệnh ngoài da, kết quả đã chứng minh rằng hệ thống này có thể phânloại
ung thư da ở mức tương đương với các bác sĩ da liễu
AI trong quản lý khám, chữa bệnh: Việc đưa công nghệ AI vào các hệ thống quản lý
chăm sóc sức khỏe có thể giúp xác định các chẩn đoán và điều trị không cần thiết. Do
đó, công nghệ AI y tế không chỉ tập trung vào các tương tác cổ điển giữa bệnh nhân
với nhà cung cấp dịch vụ chăm sóc sức khỏe mà còn có thể được sử dụng trong quản
lý hệ thống y tế cho các tổ chức quymôlớn
Giáo dục
Trí tuệ nhân tạo giúp cá nhân hóa lộ trình học tập: Trí tuệ nhân tạo sẽ tổng hợp dữ
liệu để đề xuất lộ trình học tập rõ ràng, phù hợp với từng học viên. Sự chênh lệch về
6
lOMoAR cPSD| 328 163 18
khả năng tiếp thu, tiềm năng phát triển giữa các học viên sẽ được giải quyết. Giáo dục
được ứng dụng trí tuệ nhân tạo nhằm hướng tới sự tối ưu hóa khả năng tiếp thu, khắc
phục điểm yếu và phát huy thế mạnh riêng của từng người.
Trí tuệ nhân tạo là trợ giảng đa nhiệm: Giáo viên không cần phải 1 mình thực hiện
nhiều tác vụ lặp lại như chấm bài, thống kê điểm, báo cáo giáo án… AI sẽ thiết lập
những công việc này được tự động hóa. Nhờ đó, người dạy có thể tập trung vào
chuyên môn, nâng cao tay nghề và hướng dẫn học sinh sát sao hơn.
Trí tuệ nhân tạo định hướng nghề nghiệp: Bất lợi đối với nền giáo dục của các nước
đang phát triển, học sinh được đào tạo đồng bộ, ít có cơ hội khám phá và thiếu sự định
hướng dựa trên khả năng cá nhân. Trí tuệ nhân tạo sẽ giải quyết thực trạng này bằng
cách tổng hợp, phân tích khả năng, sở thích, tư duy của từng người để định hướng
nghềnghiệp.
An ninh và quân sự
AI trông việc theo dõi và phát hiện: AI có thể được sử dụng để theo dõi hoạt động
quân sự và phát hiện các mối đe dọa an ninh qua các phương tiệntruyềnthông,xã
hội.Máy bay không người lái (drone) quân sự: AI có thể được tích hợp vào máy bay
không người lái để tăng cường năng lực quân sự, khả năng trinh sát. Máy bay không
người lái có nhiệm vụ bay cạnh các tiêm kích chiến đấu và hỗ trợ phi công trongcác
nhiệm vụ bằng cách bổ sung thêm cho họ khả năng giám sát và hỏa lực vốn đã sẵn có.
Xử lí ngôn ngữ tự nhiên
Chatbot: một chatbot thông minh với khả năng hội thoại tự nhiên và mang đến trải
nghiệm tốt cho khách hàng sẽ tạ o ra lợi thế cạnh tranh vượt trội. Một dịch vụ khách
hàng tốt sẽ giúp tạo được ấn tượng tốt làm tiền đề cho việc gia tăng tăng doanh thu.
Dịch thuật tự động: Google có một máy chủ riêng, sử dụng công nghệ AI và có khả
năng lưu trữ một lượng lớn các dữ liệu dịch thuật. Điều quan trọng và đáng chú ý nhất
của Google Dịch là tính năng tích lũy kết quả dịch thuật (bản dịch có sẵn) từ các dịch
giả. AI sẽ tự động chọn lọc các bản dịch sao cho phù hợpnhất.
Giải trí:
Gợi ý nội dung: AI được sử dụng để gợi ý phim, âm nhạc, sách và nội dung giải trí
khác dựa trên quá trình quan sát và tìm hiểu những sở thích cá nhân của người dùng.
Các trò chơi đối kháng với máy (game 1 người chơi):Trong game 1 người, người
chơi sẽ phải chơi với máy, chính là chơi với AI. Nó sẽ phân tích hành vi của người
chơi sau đó tổng hợp dữ liệu, “học” lối chơi và đáp trả họ, quá trình này sẽ diễn ra lặp
đi lặp lại. Chính cách xử lý này đã giúp trí thông minh nhân tạo trong chương trình cờ
vây AlphaGo đã đánh bại Lee Sedol, kì thủ với 18 giải quốc tế về môn cờ này với tỉ số
4-1vào2016
7
lOMoAR cPSD| 328 163 18
AI tìm kiếm và phân tích dữ liệu: Công nghệ AI cho phép xử lý lượng lớn dữ liệu
phức tạp ở tốc độ cao, chẳng hạn như việc phân tích dữ liệu lịch sử để dự báo xu
hướng và hành vi mua hàng của khách hàng trong tương lai. Các công cụ phân tích
văn bản được hỗ trợ bởi AI có thể sàng lọc dữ liệu phi cấu trúc như đánh giá củakhách
hàng và bình luận trên mạng xã hội, để tìm ra thông tin quý giá về ý kiến và sở thích
của người mua. Đồng thời, AI cũng có thể phát hiện các hoạt động gian lận hay bất
thường trong giao dịch tài chính.
Mô phỏng và thử nghiệm sản phẩm: AI có thể giúp các tổ chức thiết kế ra sản
phẩm. Đây là cách nó hoạt động: một nhà thiết kế hoặc một kỹ sư đưa các mục tiêu
thiết kế vào các thuật toán thiết kế tổng quát. Các thuật toán này sau đó khám phá tất
cả các hoán vị có thể có của một giải pháp và tạo ra các phương án thiết kế. Cuối cùng,
nó sử dụng học máy để kiểm tra mỗi lần lặp và cải thiện nó.
1.1.4. Mặt tích cực và khó khăn của trí tuệnhântạo
Trí tuệ nhân tạo (AI) là một lĩnh vực có nhiều mặt tích cực và tiềm năng lớn, nhưng
cũng đối diện với nhiều khó khăn và thách thức.
Mặt tích cực của trí tuệ nhân tạo
Giải quyết vấn đề phức tạp: AI có khả năng xử lí và phân tích dữ liệu phức tạp một
cách nhanh chóng và hiệu quả, giúp giải quyết các vấn đề lớn và phức tạp như phân
tích dữ liệu y tế, dự đoán thời tiết và tối ưu hoá quá trình sản xuất.
Tăng cường năng suất: AI có thể thực hiện các nhiệm vụ lặp đi lặp lại một cách tự
động giúp tang cường năng suất và giảm công việc tay chân cho con người.
Phát triển trí tuệ: Nghiên cứu trong lĩnh vực AI đã giúp con người hiểu rõ hơn về
cách hoạt động của não bộ và học hỏi từ đó.
Ứng dụng trong y tế: AI có tiềm năng lớn trong việc chuẩn đoán bệnh, dự đoán biến
chứng và tạo ra các phương pháo điều trị hiệu quả hơn.
Khó khăn của trí tuệ nhân tạo
Đạo đức và luân lý: Sử dụng AI có thể đặt ra nhiều vấn đề đạo đức và luân lý chẳng
hạn như quyền riêng tư, tự động hoá công việc và tạo ra vũ khí tự động.
Khả năng thất nghiệp: AI có thể thay thế công việc của con người trongnhiều ngành
gây ra tình trạng thất nghiệp và sự bất ổn xãhội.
Rủi ro an ninh: Sử dụng AI để tạo ra phần mềm độc hại hoặc tấn công mạng có thể
gây ra rủi ro an ninh lớn, từ việc đánh cắp dữ liệu cá nhân đến tấn công mạng quốc
gia.Hạn chế trong hiểu biết và tư duy: Hiện tại AI vẫn có hạn chế trong việc hiểu biết
sâu rộng và tư duy đa chiều như con người. Nó có thể gặp khó khăn khi đối mặt với
tình huống mới và phức tạp.
8
lOMoAR cPSD| 328 163 18
Quản lí dữ liệu: AI yêu cầu lượng lớn dữ liệu để huấn luyện và hoạt động hiệu quả.
Việc quản lí và bảo vệ dữ liệu này có thể gây ra nhiều rắc rối về quyền riêng tư và an
ninh.
1.2. Tổng quan về đề tài
1.2.1. Mô tả trò chơi
Snake game, một tựa game kinh điển đã quá phổ biến với nhiều thế hệ. Snakegame
hay còn được gọi là trò chơi rắn săn mồi là một trò chơi mà chúng ta cần khiến con rắn
di chuyển đến chỗ thức ăn. Trong bài bài chúng ta sẽ áp dụng thuật toán BFS để tạo ra
một AI cho trò chơi. Con rắn có thể di chuyển qua trái, phải, lên, xuống. Trong quá
trình di chuyển Thuật toán có thể giúp con rắn tự tìm ra đường đi tốt nhất đến mồi.
Tránh cắn trúng thân mình và đâm vào tường biên rồi đạt số điểm lớn nhất cóthể.
Con rắn sẽ ngày một dài ra đòi hỏi nó phải có khả năng điều khiển để có thể né
tránh các chướng ngại vật kể cả cơ thể của nó. Với thuật toán BFS, ta có thể dễ dàng
tìm đường đi ngắn nhất giữa đầu rắn và thức ăn. Ta có thể trang bị cho con rắn năng
lực điểu khiển cơ thể để tránh vật cản thông qua một nhận xét quan trọng: “ Miễn là
tồn tại đường đi từ đầu rắn đến đuôi rắn, về cơ bản con rắn có thểđitiếp”.
1.2.2. Lịch sử hình thành và phát triển của trò chơi
Trò chơi Snake (hay còn gọi là rắn săn mồi) là một trong những trò chơi điện tử
đầu tiên và đã trở thành một biểu tượng của ngành công nghiệp game
Trò chơi Snake xuất hiện đầu tiên vào những năm 1970 trên các máy tính đơn giản
như DEC PDP-1. Trò chơi này không được phát triển để công bố mà chỉ là một ví dụ
minh họa cho các hệ thống máy tính thời kỳ đó. Đến thập kỷ 1980 game Snake trở nên
phổ biến khi xuất hiện trên các máy chơi game điện tử như Nokia 6110 vào những
năm 1997. Điều này làm cho trò chơi trở nên nổi tiếng trên toàn cầu và trở thành một
trong những trò chơi đầu tiên trên điện thoại di động. Trong thập kỷ 1990, Snake đã
xuất hiện trên nhiều hệ thống máy tính và thiết bị di động khác nhau, và phiên bản của
trò chơi này đã được phát triển và cải thiện liên tục. Nokia Snake (1997): Snake trở
nên phổ biến trên điện thoại di động khi Nokia giới thiệu trò chơi này trên điện thoại di
động Nokia 6110. Snake II (2000): Phiên bản Snake II có thêm tính năng gấp đôi,
khiến con rắn tăng gấp đôi mỗi khi ăn mồi. Nhiều phiên bản và biến thể: Kể từ đó, có
hàng loạt phiên bản và biến thể của trò chơi Snake đã được phát triển trên nhiều nền
tảng và thiết bị khác nhau, từ điện thoại di động đến máy tính cá nhân và các trang
web chơi game trực tuyến. Ngày nay, Snake vẫn còn tồn tại dưới nhiều hình thức khác
nhau. Ngoài các phiên bản trên điện thoại di động, có các phiên bản trò chơi trực tuyến
miễn phí hoặc được tích hợp vào các trình duyệt web.
Snake đã trở thành một phần của ký ức game của nhiều người chơi và vẫn được
kính trọng như một biểu tượng của lịch sử game điện tử.
9
lOMoAR cPSD| 328 163 18
10
lOMoAR cPSD| 328 163 18
11
lOMoAR cPSD| 328 163 18
thấp của ngôn ngữ lập trình C và các dẫn xuất của nó. Điều này dựa trên giả định rằng
các chức năng đắt tiền nhất bên trong trò chơi có thể được trừu tượng hóa khỏi logic trò
chơi, do đó có thể sử dụng ngôn ngữ lập trình bậc cao, chẳng hạn như Python, để cấu
trúc trò chơi.
Các tính năng khác mà SDL không có bao gồm toán học vectơ, phát hiện va chạm,
quản lý độ họa 2d, hỗ trợ MIDI, camera, thao tác mảng pixel, chuyển đổi, lọc, hỗ trợ
phông chữ freetype nâng cao và vẽ.
Các ứng dụng sử dụng pygame có thể chạy trên điện thoại và máy tính
bảng Android với việc sử dụng Bộ phụ pygame cho Android (pgs4a). Âm thanh, rung,
bàn phím và gia tốc kế được hỗ trợ trên Android.
13
lOMoAR cPSD| 328 163 18
While(O ≠ Ø) do
1. Chọn nút n đầu tiên của O và xóa n khỏi O
2. If n∈G, return (đườngđitớin)
3. Thêm P(n) vào cuối O
Return: Không có lời giải
Con trỏ ngược: Khi mở rộng một nút ta cần sử dụng con trỏ ngược để ghi lại nút
cha của nút vừa được mở ra. Con trỏ này được sử dụng để tìm ngược lại đường đi về
trạng thái xuất phát khi tìm được trạng thái đích. Khi ta cài đặt thuật toán, mỗi nút
được biểu diễn bằng một cấu trúc dữ liệu có chứa một con trỏ được trỏ tới nútcha.
Các cải tiến
Tránh xem xét lại các nút mở rộng: Việc xem xét lại các nút đã mở rộng có thể dẫn
tới vòng lặp. Mặc dù vòng lặp không ảnh hưởng tới khả năng tìm ra lời giải của tìm
14
lOMoAR cPSD| 328 163 18
kiếm theo chiều rộng, xong việc có vòng lặp và xem xét lại các nút làm tang độ phức
tạp tính toán do phải khảo sát nhiều nút hơn. Vấn đề này có thể giải quyết bằng cách
sử dụng tập đóng. Một trạng thái đã có mặt trong tập đóng hoặc trong tập biên sẽ
không được thêm vào tậpbiênnữa.
Kiểm tra đích trước khi thêm vào tập biên: Trong thuật toán tổng quát, việc kiểm tra
điều kiện đích được thực hiện khi nút được lấy ra khỏi O để mở rộng. Thay vào đó, ta
có thể kiểm tra trước khi thêm nút vào O. Ưu điểm của cách này là giảm bớt các nút
cần duyệt.
Tính chất
Đầy đủ: nếu không gian trạng thái là hữu hạn thì thuật toán là đầy đủ. Ngược lại ,
nếu không gian trạng thái là vô hạn thì thuật toán là không đầy đủ do có thể di chuyển
theo một đường đi không chứa nút đích và có độ sâu vô hạn (cứ đi theo nhánh không
đúng mãi mà không chuyển sang nhánh khác được).
Tối ưu: không, bởi thuật toán có thể mở rộng những nhánh dẫn tới lời giải không tối
ưu trước, đặc biệt trong trường hợp có nhiều lời giải.
Thời gian (độ phức tạp tính toán): với mức độ rẽ nhánh là b và độ sâu lời giải d,
thuật toán sinh ra O(bd+1) nút trước khi tìm ra lời giải hay O(bd) nút nếu kiểm tra đích
trước khi thêm nút vào tập biên. Độ phức tạp này là lớn và tăng rất nhanh khi b và d
tăng.
Bộ nhớ: thuật toán cần lưu O(b d+1) nút trong tập biên nên sau khi đã mở rộng tất cả
các nút ở độ sâu d. Nếu sử dụng tập các nút đóng thì tập này cần lưu O(b d) nút. Như
vậy độ phức tạp bộ nhớ của tìm kiếm theo chiều rộng là O(bd+1)
Ví dụ: Tìm đường đi từ đỉnh 1 đến đỉnh 14?
15
lOMoAR cPSD| 328 163 18
Trong ví dụ trên, các trạng thái trong danh sách kề sẽ được thêm lần lượt vào cuối
trong danh sách hàng đợi, mỗi lần đỉnh duyệt sẽ lấy ra trạng thái đầu tiên trong danh
sách hàng đợi này để duyệt tiếp theo. Cứ tiếp tục như vậy cho đến khi đi đến đỉnh kết
thúc cần tìm hoặc cho đến khi danh sách hang đợi đã rỗng.
2.1.3. Ưu,nhược điểm
Ưu điểm
Dễ cài đặt.
Nếu số đỉnh là hữu hạn, thuật toán chắc chắn tìm ra kết quả.
16
lOMoAR cPSD| 328 163 18
Nhược điểm
Mang tính chất vét cạn, không nên áp dụng nếu duyệt số đỉnh quá lớn.
Mang tính chất mù quáng, duyệt tất cả đỉnh, không chú ý đến thông tin trong các
đỉnh để duyệt hiệu quả, dẫn đến duyệt qua các đỉnh không cần thiết.
Chiếm thời gian và không gian bộ nhớ khi số đình duyệt nhiều.
2.2. Ứng dụng thuật toán Breadth First Search xây dựng Snake Game
2.2.1. Thuật toán BFS trong trò chơi rắn săn mồi
Ưu điểm: Giúp bài toán không bị sa và các đường dẫn bếtắc.Thuật toán BFS sẽ
giúp tìm đường đi ngắn nhất cho con rắn đến thức ăn bằng cách sử dụng cấu trúc dữ
liệu hàng đợi, là thuật toán đầy đủ và tương đối tối ưu vì sử dụng phương pháp vét
cạn.
Nhược điểm: Thuật toán chỉ thực sự phù hợp nếu không gian trạng thái là nhỏ và
chiếm dụng bộ nhớ là rất lớn vì vậy chỉ có thể thiết lập trò chơi trong bản đồ phạm
vi nhỏ nếu sử dụng trong bản đồ phạm vi lớn có thể dẫn đến tình trạng treo máy.Nếu
mồi ở quá xa thuật toán sẽ không tối ưu vì nó bao trùm tất cả hàng xóm.Nó tương
đối chậm hơn DFS.
2.2.2. Áp dụng thuật toán BFS
Các bước áp dụng thuật toán
Ta quy ước như sau:
S: trạng thái xuất phát (đầu rắn)
G: trạng thái đích (trạng thái thức ăn)
O: tập nút mở (tập biên O)
C: tập các trạng thái đã xét duyệt.
Áp dụng thuật toán
Khởi tạo hàng đợi (Queue), gán S cho O, gán C bằng rỗng
Ta duyệt BFS bắt đầu từ S sau đó đến các ô lân cận xung quanh nó
Xét S, gọi “n” là các ô lân cận của S, lúc này O là các ô “n” lân cận của S, khi xét
xong , ta đưa S vào C(trách lặp).
Nếu 1 ô bên cạnh là thức ăn thì dừng BFS và lưu lại đường đi
Nếu ô “n” bên cạnh là ô trống, đánh dấu là đã thăm và thêm vào tập C, sau đó thêm
ô lân cận của “n” vào hàng đợi O. Ở đây ta cần thêm một vòng lặp xét tập C xem ô “n”
đã được thăm chưa để tránh bị lặp và tiếp tục vòng lặp cho đến khi tìm được thức
ăn(G). Sau đó dùng con trỏ ngược trả lại đường đi cho rắn.
Nút được mở rộng Tập biên O (hàng đợi FIFO)
S
S“n” “n”
G
G Đích 17
lOMoAR cPSD| 328 163 18
17
lOMoAR cPSD| 328 163 18
Sau đó chúng ta sử dụng hàm pygame.init để khởi tạo cửa sổ game. Ở đây chúng tasử
dụng mã màu RGB để tạo màu cho trò chơi.
19
lOMoAR cPSD| 328 163 18
Tiếp đó in cửa sổ ra màn hình. Sử dụng hàm time.clock để xoá màn hình và vẽ lại ô
vuông mới sau mỗi chu kỳ.
Khi đã có một khung hình, chúng ta sẽ tiếp tục sử dụng các hàm để
con rắn và thức ăn lên màn hình.
FOOD: Một hằng số (0) được sử dụng để biểu thị thức ăn trên bảng trò chơi.
UNDEFINED: Một giá trị hằng số được sử dụng để biểu thị các ô không xác định
hoặc trốngtrênbảngtrò chơi.Nóđược tính bằngcách(HEIGHT+1)*(WIDTH+1).
Thức ăn sẽ được gán giá trị nhỏ nhất (0), các ô chưa được duyệt sẽ được gán trạng
thái lớn hơn tổng số ô tồn tại trong ma trận (UNDEFINED), và các ô thuộc thân rắn sẽ
nhận giá trị bằng 2 lần các ô chưa được duyệt (2*UNDEFINED). Điều này sẽ giúp cho
chương trình phân biệt được đâu là ô chứa đường đi.
SNAKE_BLOCK: Kích thước của một ô hoặc ô trên bảng trò chơi, có giá trị 20 pixel.
SNAKE_SPEED: Tốc độ di chuyển của con rắn, có giá trị 200 mili giây (0.2 giây) cho
mỗi khung hình cập nhật. Điều này xác định tốc độ di chuyển của con rắn trên bảng trò
chơi.
Sau khi đã có một con rắn, chúng ta sẽ tiếp tục sử dụng hàm new_food để tạo thức
ăn cho con rắn.
20
lOMoAR cPSD| 328 163 18
Tiếp đến sử dụng hàm draw để vẽ rắn và thức ăn lên màn hình.
21
lOMoAR cPSD| 328 163 18
FONT_STYLE: Kiểu font văn bản được sử dụng, trong trường hợp này là
"bahnschrift" với kích thước 12.
SCORE_FONT: Kiểu font văn bản khác được sử dụng để hiển thị điểm số, trong
trường hợp này là "comicsansms" với kích thước 20.
22
lOMoAR cPSD| 328 163 18
Để con rắn có thể tiến được đến chỗ thức ăn thì ta cần kiểm tra từng hướng đi của
con rắn:
Trái: nếu đầu của con rắn không nằm ở cột đầu tiên của lưới chơi thì cho phép di
chuyển sang trái.
Phải: nếu đầu của con rắn không nằm ở cột cuối cùng của lưới chơi thì cho phép di
chuyển sang phải.
Lên: nếu đầu của con rắn không nằm ở hàng đầu tiên của lưới chơi thì cho phép di
chuyển lên.
Xuống: nếu đầu của con rắn không nằm ở hàng cuối cùng của lưới chơi thì cho phép di
chuyển xuống.
Kiểm tra xem một ô trên bảng có tự do (không bị rắn chiếm) hay không, nếu vị trí
được xét không xuất hiện trong danh sách các nút có chứa thân rắn thì ô đó sẽ là ô
trống hoặc là ô có chứa thức ăn nên con rắn có thể di chuyển vào vị trí đó được. Nếu
không thì con rắn sẽ xét các vị trí khác cho đến khi tìm được hướng đi mà con rắn có
thể di chuyển.
Cuối cùng, ta trả về kết quả kiểm tra xem con rắn có thể di chuyển theo hướng đã
cho hay không.
Sau đó chúng ta kiểm tra xem một ô trên bảng có tự do (không bị rắn chiếm) hay
không, nếu idx không xuất hiện trong danh sách psnake đến vị trí psize thì trả về True
ngược lại trả về False.
23
lOMoAR cPSD| 328 163 18
Để tạo chuyển động cho con rắn chúng ta sử dụng hàm make_move.
24
lOMoAR cPSD| 328 163 18
Để con rắn có thể đuổi theo đuôi, ta hoán đổi trạng thái của ô chứa thức ăn với ô
chứa đuôi rắn và duyệt BFS. Sau đó BFS sẽ tìm đường đi ngắn nhất đến vị trí đuôi mà
không duyệt qua ô chứa thức ăn.
Dựa trên kết quả thuật toán BFS ta có thể tìm được đường đi ngắn nhất và dài nhất.
Ngắn nhất nên là khi con rắn đuổi theo thức ăn, khi nó đuổi theo đuôi của chính nó nó
nên chọn đường đi dài nhất trong các đường đi ngắn nhất. Nhờ đó nó sẽ có thêm
không gian và ở lại trò chơilâuhơn.
25
lOMoAR cPSD| 328 163 18
thuật toán trên ma trận trò chơi và lưu lại trạng thái duyệt của từng ô. Đây sẽ là thông
tin quan trọng để con rắn có thể tìm được đường đi phù hợp.
Trò chơi rắn săn mồi áp dụng thuật toán BFS sẽ sử dụng hàng đợi và xét duyệt từng
trạng thái trong hàng đợi đó.
Các cấu trúc hàm gồm:
pfood: Trạng thái bắt đầu/ đỉnh bắt đầu
psnake: Trạng thái đích/ nút đích
pboard: Các ô trên bảng chơi/ mảng các trạng thái
Ta tạo một hàng đợi (queue) đẩy ô có chứa thức ăn (pfood) vào hàng đợi (queue) đã
được tạo. Ta có danh sách vị trí được xét (inqueue) dùng để theo dõi các ô được xét.
Khi hàng đợi không rỗng ta sẽ cho chạy vòng lặp. Ta lấy phần tử thứ nhất ra khỏi hàng
đợi. Nếu phần tử thứ nhất vẫn chưa được xét duyệt ta sẽ tiếp tục vòng lặp
Ta dùng hàm for i in range(4): để xét chuyển động của con rắn có thể đi tiếp (lên
trên, xuống dưới, sang trái, sang phải). Nếu có đường đi đến ô tiếp theo và ô đó là vị
trí có chứa đầu con rắn thì ta trả về kết quả tìm được đường đi. Nếu không ta sẽ tiếp
tục với các điều kiện tiếp theo. Nếu ô mới trùng với thân rắn và ô mới có thể trở thành
thân rắn mới thì cho phép con rắn di chuyển đến vị trí ô đó. Còn nếu vị trí mới được
thêm vào hàng đợi thì ta bổ sung nút mới vào cuốihàngđợi
26
lOMoAR cPSD| 328 163 18
Gọi hàm initial_game() để thiết lập trạng thái ban đầu trong trò chơi
Bắt đầu vòng lặp while với điều kiện là not game_over, vòng lặp sẽ tiếp tục cho đến
khi game_over trở thành True.
Sau đó bắt đầu một vòng lặp while khác trong vòng lặp đầu tiên. Vòng lặp này sẽ
chạy khi game_close là True, tức là khi trò chơi kết thúc và người chơi đã thua. Và
môt số hành động hiển thị thông báo và điểm số lênmànhình.
Bắt đầu vòng lặp for để lặp qua chuỗi các giá trị. Tương tự như trên chuỗi giá trị
được cho bằng cách gọi lại hàm pygame.event.get(). Nhưng vòng lặp này có trách
nhiệm xử lý các sự kiện từ chuột.
Nếu người chơi đã nhấn đóng cửa sổ trò chơi, một khối mã được thực thi. Khối mã
này gán giá trị True cho biến game_over để kết thúc vòng lặp.
Gọi hàm board_reset để đặt lại bảng trò chơi với rắn và thức ăn ở vị trí mới.
Gọi hàm board_BFS để tìm đường đi ngắn nhất từ rắn đến thức ăn trên bản trò chơi.
Câu lệnh if thực thi khối lệnh khi điều kiện là đúng .Gọi một hàm có tên là
find_safe_way gán kết quả của nó cho biến best_move giúp tìm cách an toàn nhất cho
rắn di chuyển. biến này giúp lưu trữ hướng của động tác.
Câu lệnh else thực thi khối mã khi điều kiện của if là sai, nó gọi đến một hàm khác
có tên là follow_tail và gán kết quả cho biến best_move. Hàm này khiến rắn đi theo
đuôi của nó khi không có đường đi đến thức ăn.
Hàm any possible move gán kết quả của nó cho biến best_move. Hàm tìm hàm tìm
động tác cho rắn khi không có cách an toàn hoặc không thể cho rắn theo đuôi. Với
cách này rắn cố gắng tránh chính nó hoặc tường biên càng nhiều càng tốt.
28
lOMoAR cPSD| 328 163 18
Gọi phương thức fill của đối tượng dis và truyền vào đối số blue để tô nền xanh cho
cửa sổ trò chơi.
Gọi phương thức tick của đối tượng clock, truyền vào đối số SNAKE_SPEED.
Clock dùng để điều khiển thời gian, tick dùng để cập nhật clock và giới hạn số khung
hình trong mỗi giây.
29
lOMoAR cPSD| 328 163 18
30
lOMoAR cPSD| 328 163 18
KẾT LUẬN
Sau quá trình nghiên cứu và xây dựng trò chơi rắn săn mồi, nhóm chúng em xin
được tổng kết một số điều như sau:
Kết quả đạt được
Thiết kế được một AI đơn giản cho trò chơi rắn săn mồi dựa trên thuật toán tìm
kiếm theo chiều rộng. Con rắn tuân theo quy tắc “Miễn là còn đường đi từ đầu rắn tới
đuôi rắn, thì con rắn vẫn có thể tiếp tục đi”. Thoả mãn một số ràng buộc như là đâm
vào than thì thua, ăn đồ ăn chiều dài tang lên một đơn vị.
Sử dụng thuật toán BFS hiệu quả giúp con rắn gần như luôn tìm được đường đi tới
thức ăn hoặc đuôi của mình.
Chương trình thực thi thành công và xuất ra được cửa sổ.
Hạn chế
Thuật toán chỉ thực sự hữu dụng khi cửa sổ khung hình là
nhỏ. Giao diện chưa được thẩm mỹ, phần than rắn khó nhìn.
Do kiến thức lập trình còn hạn chế hầu hết chương trình đều tham khảo dựa trên
chương trình có sẵn.
Chưa đưa ra được hướng phát triển mở rộng cho trò chơi.
Kết luận
Chúng em còn nhiều thiếu sót trong đề tài cũng như trong quá trình thực hiện đề
tài. Từ đó chúng em cũng mong nhân được nhiều ý kiến cũng như đóng góp từ thầy
để có thể hoàn thiện đề tài và bổ sung thêm kiến thức.
Chúng em xin chân thành cảm ơn !
31
lOMoAR cPSD| 328 163 18
[1] PGS.TS Từ Minh Phương, Giáo trình Nhập môn trí tuệ nhân tạo, Nhà xuất bản
Thông tin và truyền thông, xuất bản năm 2014.
[2] Python ( ngôn ngữ lập trình) - Wikipedia
https://vi.wikipedia.org/wiki/Python_(ng%C3%B4n_ng%E1%BB%AF_l
%E1%BA
%ADp_tr%C3%ACnh)
[3] Tạo AI đơn giản cho game rắn với BFS
https://github.com/trituenhantaoio/snake_bfs/blob/master/snake_bfs.p
y
[4] BFS (Breadth first search)
https://vnoi.info/wiki/algo/graph-theory/breadth-first-
search.md
[5] Pygame – Wikipedia Tiếng
Việt
https://vi.wikipedia.org/wiki/Pygam
e
32