Bao Cao Chuyen de TTNT

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 32

TRƯỜNG ĐẠI HỌC ĐIỆN LỰC

KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO CHUYÊN ĐỀ


MÔN:
NHẬP MÔN TRÍ TUỆ NHÂN TẠO

ĐỀ TÀI:
XÂY DỰNG TRÒ CHƠI RẮN SĂN MỒI
SỬ DỤNG THUẬT TOÁN BFS

Sinh viên thực hiện : NGUYỄN CÔNG MINH

Giảng viên hướng dẫn : VŨ VĂN ĐỊNH

Ngành : CÔNG NGHỆ THÔNG TIN

Chuyên ngành : CÔNG NGHỆ PHẦN MỀM

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

1.1. Tổng quan về trí tuệ nhân tạo


1.1.1. Khái niệm
Ngày nay, cụm từ “Trí tuệ nhân tạo” hay AI không còn quá xa lạ và chúng ta có thể
bắt gặp rất nhiều những ứng dụng của AI trên rất nhiều lĩnh vực trong đời sống như y
tế, giáo dục, thể thao, công nghiệp,… và rất nhiều lĩnh vực khác. Khái niệm Trí tuệ
nhân tạo (Artificial Intelligence) hay AI đã xuất hiện từ nhiều thập kỷ trước và từ đó
cho đến nay khái niệm trí tuệ nhân tạo dần được hoàn thiện hơn. Ta có thể đưa ra khái
niệm về AI như sau:
Trí tuệ nhân tạo hay trí thông minh nhân tạo (Artifical intelligence – viết tắt là AI)
là một ngành thuộc lĩnh vực Khoa học máy tính (Computer science). Là trí thông minh
được thể hiện bằng máy móc được con người lập trình mô phỏng quá trình suy nghĩ và
hoạt động như con người giúp máy tính có thể tự học, tự đưa ra các quyết định mà
không cần lập trình trước hay nói cách khác đây là quá trình mô phỏng bộ não của con
người trên máy tính. Ngoài ra còn nhiều cách đưa ra khái niệm về AI tuy nhiên chúng
đều xoay quanh các đặc điểm sau:
Hệ thống hành động như người
Con người được lấy làm thước đo khi đánh giá mức độ thông minh của máy tính.
Theo cách định nghĩa này, trí tuệ nhân tạo được phát triển nhằm tạo ra các hệ thống có
hành vi hay hành động tương tự con người. Hệ thống trí tuệ nhân tạo cần có những khả
năng sau:
Xử lý ngôn ngữ tự nhiên: để có thể phân tích, hiểu câu hỏi và tổng hợp câu trả lời
dựa trên một ngôn ngữ giao tiếp thông thường và phổ biến nhất hiện nay là tiếng Anh.
Biểu diễn tri thức: phục vụ việc lưu giữ tri thức và thông tin trong hệthống.
Suy diễn: sử dụng những tri thức đã có để đưa ra câu trảlời
Học máy: sử dụng để thích nghi và học hỏi trong các môi trường, hoàn cảnh khác
nhau
Hệ thống có thể suy nghĩ như người
AI hành động một cách thông minh dựa trên quá trình phân tích dữ liệu tương tự
quá trình suy nghĩ của con người. Những nghiên cứu theo hướng này dựa trên việc
nghiên cứu quá trình nhận thức và tư duy của con người, từ đây mô phỏng và tạo ra
những hệ thống có khả năng tự nhận thức, tư duy hay nói cách khác đây là quá trình
mô phỏng bộ não con người. Tuy nhiên đây cũng chính là bước cản lớn nhất khi phát
triểnAI.
Hệ thống có thể suy nghĩ hợp lý
Thực tế cho thấy con người luôn bị chi phối bởi tâm lý, cảm xúc. Do vậy, không
phải lúc nào con người cũng suy nghĩ và hành động theo hướng đạt tới kết quả tốt. Do
4
lOMoAR cPSD| 328 163 18

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

1.2.3. Ứng dụng và đề xuất cải tiến trò chơi


Trò chơi rắn săn mồi (Snake) không chỉ là một trò giải trí đơn thuần, mà còn có
nhiều ứng dụng và lợi ích khác ngoài việc giúp người chơi giải trí. Trò chơi Snake là
một cách tuyệt vời để giải trí và giảm căng thẳng. Người chơi có thể chơi trong thời
gian ngắn để giải toả căng thẳng hoặc giải trí trong những khoảnh khắc trống rảnh.
Chơi Snake yêu cầu sự tập trung và kỹ năng phản xạ, giúp cải thiện khả năng tập trung
và nhanh nhẹn của người chơi. Trong một số trường hợp, các phiên bản của trò chơi
Snake đã được sử dụng để giảng dạy lập trình hoặc làm ví dụ minh họa cho các khái
niệm trong khoa học máy tính. Việc phát triển phiên bản riêng của trò chơi Snake có
thể giúp người học lập trình phát triển kỹ năng lập trình và hiểu rõ về các nguyên tắc
của trò chơi điện tử. Người thiết kế giao diện có thể sử dụng các yếu tố của trò chơi
Snake để thiết kế các yếu tố tương tác trong ứng dụng hoặc trang web, đặc biệt là với
việc sử dụng hình ảnh của con rắn và các mô hình chuyển động. Trò chơi Snake cũng
đã được sử dụng trong lĩnh vực trí tuệ nhân tạo để phát triển các thuật toán về máy học
và học sâu, đặc biệt trong ngữ cảnh của việc học máy tự học (reinforcement learning).
Cải tiến trò chơi rắn săn mồi có thể tạo ra trải nghiệm mới và thú vị cho người chơi.
Chúng ta cải thiện đồ họa và hiệu ứng để tạo ra trải nghiệm hấp dẫn hơn. Sử dụng đồ
họa 3D hoặc các hiệu ứng đặc biệt để làm cho trò chơi trở nên sống động hơn. Thêm
chế độ chơi đa người để người chơi có thể thi đấu với bạn bè hoặc người chơi trực
tuyến khác. Phát triển chế độ chơi đối kháng trực tuyến, trong đó người chơi có thể thi
đấu trực tuyến với người chơi khác từ khắp nơi trên thế giới. Tạo ra nhiều cấp độ khó
khăn và thách thức khác nhau để người chơi không bao giờ cảm thấy chán chường.
Cho phép người chơi chọn các kỹ năng hoặc đặc điểm đặc biệt cho con rắn của họ,
giúp họ tạo ra chiến lược chơi riêng và trải nghiệm cá nhân hóa. Thêm chế độ chơi
theo cấp độ, trong đó người chơi phải hoàn thành các màn chơi với các điều kiện và
thách thức đặc biệt để tiến xa hơn trong trò chơi. Sử dụng trí tuệ nhân tạo để tạo ra một
hệ thống điều khiển cho con rắn không người chơi, giúp tạo ra một trải nghiệm chơi
đầy thách thức. Xây dựng hệ thống điểm số và xếp hạng trực tuyến để khuyến khích
cạnh tranh và sự tham gia của người chơi. Cho phép con rắn tương tác với môi trường
xung quanh, như tránh các chướng ngại vật hoặc tận dụng chúng để đạt được mục tiêu.
Tạo ra nhiều màn chơi và bản đồ đa dạng, mỗi bản đồ có các tính chất và điểm đặc
biệt, giúp người chơi không bao giờ cảm thấy nhàm chán. Tích hợp tính năng tương
tác với cộng đồng, cho phép người chơi chia sẻ thành tích, gợi ý và thậm chí thiết kế
các màn chơi và bản đồ mới.

10
lOMoAR cPSD| 328 163 18

1.3. Các công nghệ áp dụng trong đề tài


1.3.1. Tổng quan về ngôn ngữ lập trình Python
Python là ngôn ngữ lập trình hướng đối tượng bậc cao. Điều đặc biệt ở ngôn ngữ
này là sự đa năng, đa công dụng. Mang các tính năng ưu việt như tạo kiểu dữ liệu tự
động và cơ chế cung cấp bộ nhớ tự động. Python là ngôn ngữ có mục đích chung,
nghĩa là nó có thể được sử dụng để tạo nhiều chương trình khác nhau và không chuyên
biệt cho bất kỳ vấn đề cụ thể nào. Tính linh hoạt này, cùng với sự thân thiện thì Python
cực kỳ phù hợp cho người mới bắt đầu.
Những tính năng chính của Python
Cực kỳ đơn giản và dễ tiếp thu cũng như thực hành: sự đơn giản của ngôn ngữ này
thể hiện ở các câu lệnh dễ học, dễ hiểu. Python biến những “cú pháp code khó nhằn”
trở nên dễ dàng hơn bằng những giải pháp.
Hoàn toàn miễn phí và là mã nguồn mở: nhà lập trình có thể thoải mái di chuyển
Python thậm chí sử dụng nó với mục đích thương mại hóa. Với đặc trưng là một ngôn
ngữ lập trình mã nguồn mở. Bạn hoàn toàn có thể thay đổi các mã nguồn mở của
Python ở bất cứ các ứng dụng phần mềm nào.
Là một ngôn ngữ di động: di động có nghĩa là nó rất dễ di chuyển từ nền tảng này
sang các nền tảng khác. Đồng thời, bạn có thể chạy chương trình của Python ở mọi
nền tảng mà không sợ có bất kỳ những thay đổi nào ảnh hưởng.
Python là ngôn ngữ phiên dịch cao cấp: khi chạy chương trình Python trên bất cứ hệ
điều hành hay mạng Internet nào. Python có thể hoàn toàn tự động dịch và chạy theo
đúng chương trình dữ liệu của máy tính đó.
Ưu điểm của Python
Python có cấu trúc đơn giản, rõ ràng và rất dễ học. Đây được coi là một trong những
ngôn ngữ nên học cho những người mới bắt đầu tiếp cận đến lập trình.
Python có mặt trên tất cả các hệ điều hành phổ biến như: Windows, MacOS, MS-
DOS, Unix,… đây cũng thể hiện được sự đa năng của ngôn ngữ này.
Tương thích với thư viện lớn nhất hiện nay với 400 triệu người sử dụng như data
mining Scikit-learn, Pandas…
Tốc độ xử lý cũng là một trong những lí do tạo nên ưu điểm của Python. Ngôn ngữ
này có thể tạo ra những script siêu nhỏ tới những phần mềm cực lớn như Blender 3D.
Nhược điểm của Python
Các cấu trúc của Python đòi hỏi nhiều không gian bộ nhớ hơn, ngôn ngữ này không
thể phát huy hết tác dụng trong điều kiện bộ nhớ hạn chế.
Python không phải là ngôn ngữ được ưu tiên để phát triển ứng dụng di động hay trò
chơi do tiêu tốn nhiều bộ nhớ hơn và tốc độ xử lý chậm so với ngôn ngữ khác.

11
lOMoAR cPSD| 328 163 18

Ứng dụng của Python


Phân tích dữ liệu và học máy: Trong khoa học dữ liệu, cho phép các nhà phân tích
dữ liệu và các chuyên gia khác sử dụng ngôn ngữ này để thực hiện các phép tính thống
kê phức tạp, tạo trực quan hóa dữ liệu, xây dựng thuật toán học máy, thao tác và phân
tích dữ liệu cũng như hoàn thành các nhiệm vụ khác liên quan đến dữ liệu.
Python có thể xây dựng nhiều dạng trực quan hóa dữ liệu khác nhau, chẳng hạn như
biểu đồ đường và thanh, biểu đồ hình tròn, biểu đồ 3D.
Python cũng có một số thư viện cho phép các lập trình viên viết chương trình để
phân tích dữ liệu và học máy nhanh hơn và hiệu quả hơn, như TensorFlow và Keras.
Phát triển web: Python thường được sử dụng để phát triển back-end của trang web
hoặc ứng dụng những phần mà người dùng không nhìn thấy. Vai trò của Python trong
phát triển web có thể bao gồm gửi dữ liệu đến và đi từ máy chủ, xử lý dữ liệu và giao
tiếp với cơ sở dữ liệu, định tuyến URL và đảm bảo tính bảo mật. Python cung cấp một
số khuôn khổ để phát triển web. Những cái thường được sử dụng bao gồm Django và
Flask.
Tự động hoá và phát triển phần mềm: Python có thể tư động hóa một nhiệm vụ lặp
đi lặp lại. Quá trình viết code được sử dụng để xây dựng các quy trình tự động này
được gọi là viết script. Trong thế giới mã hóa, tự động hóa có thể được sử dụng để
kiểm tra lỗi trên nhiều tệp, chuyển đổi tệp, thực hiện phép toán đơn giản và loại bỏ các
bản sao trong dữ liệu.
Python thậm chí có thể được sử dụng bởi những người mới bắt đầu để tự động hóa
các tác vụ đơn giản trên máy tính—chẳng hạn như đổi tên tệp, tìm và tải xuống nội
dung trực tuyến hoặc gửi email hoặc văn bản theo khoảng thời gian mong muốn.
Trong phát triển phần mềm, Python có thể hỗ trợ các tác vụ như kiểm soát bản
dựng, theo dõi lỗi và thử nghiệm. Với Python, các nhà phát triển phần mềm có thể tự
động kiểm tra các sản phẩm hoặc tính năng mới. Một số công cụ Python được sử dụng
để kiểm thử phần mềm bao gồm Green và Requestium.

1.3.2. Thư viện Pygame


Pygame là một mô-đun Python đa nền tảng được thiết kế để viết trò chơi điện tử.
Nó bao gồm đồ hoạ máy tính và thư viện âm thanh được thiết kế để sử dụng với ngôn
ngữ lập trình Python.
Pygame ban đầu được viết bởi Pete Shinners để thay thế PySDL sau khi quá trình
phát triển của nó bị đình trệ. Đây là một dự án cộng đồng từ năm 2000 và được phát
hành theo phần mềm miễn phí mã nguồn mở GNU Lesser General Public License.
Pygame sử dụng thư viện Simple DirectMedia Layer(SDL), với mục đích cho phép
phát triển trò chơi máy tính trong thời gian thực mà không cần cơ chế bậc
12
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

CHƯƠNG 2: ỨNG DỤNG THUẬT TOÁN BREADTH FIRST SEARCH XÂY


DỰNG SNAKE GAME

2.1. Thuật toán Breadth First Search


2.1.1. Mô tả thuật toán
Đây là thuật toán tìm đường đi từ đỉnh xuất phát đến đỉnh kết thúc bằng các duyệt
theo chiều rộng.
Đây là thuật toán nằm trong nhóm thuật toán tìm kiếm mù, thuật toán không quan
tâm đến trọng số trên đường đi mà chỉ duyệt theo những đỉnh kề liên tiếp nó.
Xuất phát tử một đỉnh và đi tới các đỉnh kề nó, tiếp tục cho đến khi không còn đỉnh
nào để đi.
Trong quá trình đi đến đỉnh kề, tiến hành lưu lại đỉnh kề để khi đi ngược lại từ đỉnh
kết thúc đến đỉnh xuất phát ta có được đường đi ngắn nhất.
Mô tả thuật toán: Các đỉnh đã được xét thì không thể xét lại lần 2 nữa. Cơ chế lưu
lại đỉnh kề sẽ là lưu các đỉnh kề thành 1 danh sách và lấy từ từ danh sách các đỉnh kề
ra để xét, khi mà một đỉnh kề của một đỉnh đang xét được thêm vào danh sách thì nó
sẽ được thêm vào cuối của danh sách hay còn gọi là cơ chế Queue(hàng đợi). Cơ chế
này có nghĩa khi thêm một phần tử thì phần tử đó sẽ được thêm ở cuối danh sách hàng
đợi, còn lấy phần tử ra thì sẽ lấy ra ở đầu danh sách hàng đợi. Đó chính là điểm nổi bật
để phân biệt thuật toán này với các thuật toán khác.
2.1.2. Thuật toán
BFS (Q,S,G,P)
Đầu vào: bài toán tìm kiếm
Đầu ra: trạng thái đích
Khởi tạo: O←S // O được tổ chức như hàng đợi FIFO

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

Hình 2.1 Sơ đồ cây


Duyệt các đỉnh:
Đỉnh Danh sách kề Danh sách đợi
1 2,3,4 2,3,4
2 5,6 3,4,5,6
3 4,5,6
4 7,8,9 5,6,7,8,9
5 6,7,8,9
6 10,11 7,8,9,10,11
7 8,9,10,11
8 12,13 9,10,11,12,13
9 14 10,11,12,13,14
10 11,12,13,14
11 12,13,14
12 13,14
13 14
14 Trạng thái kết thúc
Bảng 2.1 Duyệt các đỉnh trong sơ đồ cây

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

Bảng 2.2 Mô tả quá trình duyệt các nút


Trong trường hợp không tìm đến đường đi từ đầu rắn đến thức ăn, ta trả về đường đi từ
đầu đến đuôi rắn. Ngoài ra, bởi trong quá trình game con rắn sẽ tăng trưởng và quy tắc
trò chơi yêu cầu con rắn không được đâm vào tường và cắn vào thân mình nên ta cần
thêm một số hàm để đường đi của rắn không bị trùng vào nút chứa thân rắn và tường.
Cài đặt BFS
Ta quy ước như sau:
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 khởi tạo một hàng đợi trống “queue” để chứa các vị trí cần duyệt trong BFS.
Khởi tạo một danh sách gọi là “inqueue” để theo dõi xem một vị trí đã được thăm
hay chưa.
Khởi tạo một biến boolean “found” với giá trị “False”. Biến này sẽ được sử dụng để
kiểm tra xem có tìm thấy đường đi hợp lệ từ thức ăn tới đầu rắn hay không.
Đầu tiên ta đưa vị trí thức ăn ban đầu “pfood” vào hàng đợi.
Xét hàng đợi, ta lấy 1 vị trí từ cuối hàng đợi ra để xét, lúc này vị trí đang xét là vị trí
thức ăn ban đầu. Để tránh lặp ta xét vị trí này đã có trong “inqueue” hay chưa. Nếu đã
có ta bỏ qua lần lặp này, nếu không ta bắt đầu duyệt và đưa vị trí vào “inpueue” để
đánh dấu là đã duyệt.
Tiếp theo từ vị trí ban đầu ta đưa vị trí các ô lân cận ô chứa vị trí thức ăn (4 hướng
lên, xuống, trái, phải) vào hàng đợi để duyệt, ở bước này ta cần dùng 1 hàm khác để
kiểm tra xem bước đi tiếp theo có thể thực hiện không.
Nếu bước di chuyển tiếp theo là đầu rắn, ta đặt “found” thành “true” vì đã tìm thấy
một đường đi đến đầu rắn.
Ngoài ra, ta cũng cần kiểm tra xem vị trí di chuyển tiếp theo có bị rắn chiếm giữ
không (đảm bảo đúng logic rắn không được đâm vào thân mình và giảm đi số vị trí cần
xét cho thuật toán). Nếu vị trí không bị rắn chiếm giữ ta cập nhật lại khoảng cách trên
“pboad” và trả lại đường đi “found” cho rắn. Sau đó cứ tiếp tục vòng lặp cho đến khi
tìm được đến đầu rắn.

17
lOMoAR cPSD| 328 163 18

CHƯƠNG 3: XÂY DỰNG VÀ TRIỂN KHAI ỨNG DỤNG

3.1. Xây dựng tròchơi


3.1.1. Xây dựng khung nhìn
Đầu tiên để sử dụng trò chơi ta cần khai báo ba thư viện: pygame, time, rando

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.

Kích thước khung trò chơi:


HEIGHT: Chiều cao của khung trò chơi, có giá trị là 20.
WIDTH: Chiều rộng của khung trò chơi, có giá trị là 20.
FIELD_SIZE: Tổng số ô trên khung trò chơi, tính bằng cách nhân HEIGHT và WIDTH
(20*20 = 400)

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ỳ.

3.1.2. Xây dựng con rắn và thức ăn

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.

Các thông số biểu diễn Rắn:


HEAD: Chỉ số đại diện cho đầu của con rắn. Nó có giá trị là 0, ngụ ý rằng đầu của rắn
nằm ở vị trí đầu tiên trong một cấu trúc dữ liệu biểu thị con rắn.

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.

Cung cấp trạng thái ban đầu cho rắn và mồi.

21
lOMoAR cPSD| 328 163 18

3.1.3. Hiển thị điểm số và thông điệp

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.

3.2. Hoạt động của trò chơi


3.2.1. Di chuyển
Vừa rồi chúng ta đã tìm hiểu cách để tạo nên một khung hình với 2 đối tượng là con
rắn và thức ăn, tiếp theo chúng ta sẽ bổ sung thêm các hàm để cung cấp hoạt động cho
con rắn .

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.

3.2.2. Tìm đường đi


Ta sử dụng hàm virtual_shortest_move() được sử dụng để tìm đường đi tới thức ăn
mà con rắn sẽ thực hiện nếu nó di chuyển. Hàm này sẽ đưa con rắn tới vị trí thức ăn
mà BFS tìm ra. Tại vị trí đó ta lại kiểm tra có tồn tại đường đi từ đầu con rắn tới đuôi
của nó hay không. Đây là hàm quan trọng để thực hiện nhận xét ở đầu bài.

Hàm để kiểm tra đuôi.

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.

3.3. Cài đặt thuậttoánBFS


BFS sẽ là hàm chính ta sẽ sử dụng trong việc xây dựng trò chơi rắn săn mồi. Thuật
toán này sẽ giúp cho con rắn tìm được đường đi ngắn nhất từ thức ăn đến chính con
rắn cùng với việc thỏa mãn những điều kiện mà ta cần đề ra đó là con rắn không thể di
chuyển vào những ô mà thân của nó đã chiếm lấy và con rắn sẽ tiếp tục di chuyển nếu
tồntạiđường đitừđầuconrắnđếnđuôicủanó.Taviếthàmbroad_BFSđểtriểnkhai

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

3.4. Hoàn thiện tròchơi


Định nghĩa một hàm có tên là gameLoop không có tham số. Khởi tạo 2 biến có tên
là game_over và game _close gán cho chúng giá trị Flase.

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.

Xử lý các sự kiện từ bàn phím


Bắt đầu một vòng lặp for lặp qua chuỗi các giá trị. Chuỗi giá trị được cho bằng cách
gọi hàm pygame.event.get(), trả về một danh sách các sử kiện đã xảy ra từ lần gọi cuối
cùng. Kiểm tra xem một phím đã được nhấn trên bàn phím hay chưa.
Kiểm tra xem phím đã được nhấn có phải Q hoặc ESC hay không. Nếu đúng, một
khối mã khác được thực thi. Khối mã này sẽ gán giá trị True cho biến game_over và
giá trị Flase cho biến game_close. Đồng nghĩa với việc người chơi muốn thoát khỏi trò
chơi và kết thúc vòng lặp.
Kiểm tra xem phín đã được nhấn có phải C hay không. Nếu là C, khối mã sẽ gọi lại
hàm gameLoop để chơi lại trò chơi từ đầu.

Xử lý các sự kiện từ chuột


27
lOMoAR cPSD| 328 163 18

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.

Kết quả đạt được sau khi chạy chương trình:

29
lOMoAR cPSD| 328 163 18

Cửa sổ trò chơi ban đầu

Khi rắn dài ra khó quan sát

Thông báo kết thúc trò chơi

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

Tài liệu tham khảo

[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

You might also like