1. Trang chủ
  2. » Giáo Dục - Đào 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

32 25 0

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

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Xây Dựng Trò Chơi Rắn Săn Mồi Sử Dụng Thuật Toán Bfs
Tác giả Nguyễn Công Minh, Vũ Văn Định
Trường học Trường Đại Học Điện Lực
Chuyên ngành Nhập Môn Trí Tuệ Nhân Tạo
Thể loại báo cáo chuyên đề
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 32
Dung lượng 1,24 MB

Cấu trúc

  • 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 (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)
  • 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 (0)
    • 3.4. Hoàn thiện trò chơi (26)

Nội dung

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ờidựa trên một ngôn ngữ giao tiếp thông thường và phổ b

CƠ SỞ LÝ THUYẾT

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

Ngày nay, "Trí tuệ nhân tạo" (AI) đã trở nên quen thuộc và được ứng dụng rộng rãi trong nhiều lĩnh vực như y tế, giáo dục, thể thao và công nghiệp Khái niệm AI đã xuất hiện từ nhiều thập kỷ trước và đã được phát triển, hoàn thiện qua thời gian AI không chỉ đơn thuần là công nghệ, mà còn là một phần quan trọng trong cuộc sống hiện đại, giúp cải thiện hiệu suất và chất lượng trong nhiều ngành nghề.

Trí tuệ nhân tạo (AI) là một lĩnh vực trong Khoa học máy tính, nơi máy móc được lập trình để mô phỏng quá trình suy nghĩ và hoạt động của con người AI cho phép máy tính tự học và đưa ra quyết định mà không cần lập trình trước, tương tự như cách bộ não con người hoạt động Các khái niệm về AI đều xoay quanh những đặc điểm chính này.

Hệ thống hành động như người

Con người được xem là tiêu chuẩn để đánh giá trí thông minh của máy tính Theo định nghĩa này, trí tuệ nhân tạo được phát triển để tạo ra các hệ thống có hành vi và hành động tương tự như con người Để đạt được điều này, các hệ thống trí tuệ nhân tạo cần sở hữu những khả năng nhất định.

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 hoạt động thông minh thông qua việc phân tích dữ liệu, tương tự như cách con người suy nghĩ Nghiên cứu trong lĩnh vực này tập trung vào quá trình nhận thức và tư duy của con người, từ đó mô phỏng và phát triển các hệ thống có khả năng tự nhận thức và tư duy Tuy nhiên, đây cũng là một trong những thách thức lớn nhất trong việc phát triển AI.

Hệ thống có khả năng suy nghĩ hợp lý được xây dựng dựa trên việc sử dụng các hệ thống logic, giúp đưa ra những kết quả tối ưu nhất.

Hệ thống hành động hợp lý thường phải đối mặt với những tình huống bất ngờ, nơi mà quyết định không thể chỉ dựa vào các yếu tố chắc chắn mà cần đến phản xạ nhanh chóng Để đạt được kết quả tốt, các hệ thống này có thể áp dụng cả hai phương pháp: suy diễn và phản xạ.

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)

Trí tuệ nhân tạo bao gồm tất cả các hệ thống AI hiện có, từ những công nghệ phức tạp nhất đến những ứng dụng đơn giản Trí tuệ nhân tạo hẹp chỉ có khả năng thực hiện một nhiệm vụ cụ thể một cách tự động, dựa trên các khả năng giống như con người Những cỗ máy này bị giới hạn trong những gì chúng được lập trình để làm, dẫn đến phạm vi năng lực rất hạn chế.

Artificial General Intelligence (AGI - Trí tuệ nhân tạo chung)

Trí tuệ nhân tạo tổng quát (AGI) là khả năng của AI trong việc học hỏi, nhận thức, hiểu biết và hoạt động tương tự như con người Các hệ thống AGI có khả năng phát triển độc lập nhiều kỹ năng, đồng thời hình thành các kết nối và tổng quát hóa kiến thức trên nhiều lĩnh vực khác nhau.

Siêu trí tuệ nhân tạo (ASI) được xem là đỉnh cao của nghiên cứu trí tuệ nhân tạo ASI không chỉ tái tạo trí thông minh đa dạng của con người mà còn vượt trội hơn trong mọi lĩnh vực nhờ vào bộ nhớ lớn hơn, khả năng xử lý và phân tích dữ liệu nhanh chóng, cùng với khả năng ra quyết định xuất sắc.

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

Hệ thống AI cổ điển là những dạng công nghệ lâu đời nhất, nhưng khả năng của chúng rất hạn chế Chúng chỉ mô phỏng phản ứng của tâm trí con người trước các kích thích khác nhau mà không có chức năng lưu trữ bộ nhớ Điều này có nghĩa là những máy này không thể sử dụng kinh nghiệm trước đó để hướng dẫn các hành động hiện tại, dẫn đến việc chúng không có khả năng “học hỏi”.

Limited Memory - AI với trí nhớ giới hạn

AI bộ nhớ hạn chế không chỉ có khả năng phản ứng mà còn có thể học hỏi từ dữ liệu lịch sử để đưa ra quyết định Hầu hết các ứng dụng AI hiện nay, bao gồm chatbot, trợ lý ảo và xe tự lái, đều được điều khiển bởi loại AI này.

Theory of Mind - Lý thuyết về Trí tuệ nhân tạo

AI hiện nay vẫn chỉ là một khái niệm hoặc một dự án đang trong quá trình phát triển Lý thuyết này cho rằng AI sẽ có khả năng hiểu rõ hơn về các thực thể mà nó tương tác, thông qua việc phân biệt nhu cầu, cảm xúc và niềm tin, tức là đạt được sự thấu hiểu về "con người".

Self-Awareness - Tự nhận thức

Công nghệ AI hiện nay có khả năng tự nhận thức, thể hiện ý thức và hành vi tương tự như con người Nó không chỉ có thể bộc lộ cảm xúc mà còn hiểu được cảm xúc của con người Mặc dù đây là một bước tiến quan trọng trong lĩnh vực AI, nhưng công nghệ này vẫn chưa được triển khai thực tế.

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 đang ngày càng trở nên quan trọng, trong đó IBM Watson nổi bật như một hệ thống hàng đầu hỗ trợ chăm sóc sức khỏe Hệ thống này giúp bác sĩ đưa ra quyết định hiệu quả nhờ vào công nghệ máy học và xử lý ngôn ngữ tự nhiên Với khả năng xem xét hồ sơ sức khỏe điện tử và cập nhật thông tin từ các nghiên cứu khoa học, IBM Watson đóng góp vào việc cải thiện chất lượng điều trị cho bệnh nhân.

Tổng quan về đề tài

Trò chơi rắn săn mồi (Snake game) là một tựa game kinh điển quen thuộc với nhiều thế hệ, trong đó người chơi điều khiển con rắn di chuyển để ăn thức ăn Bài viết này sẽ áp dụng thuật toán BFS để phát triển một AI cho trò chơi, giúp con rắn tìm đường đi tốt nhất đến mồi Con rắn có khả năng di chuyển trái, phải, lên, xuống, và cần tránh va chạm với thân mình cũng như các bức tường để đạt được điểm số cao nhất Khi con rắn dài ra, việc điều khiển trở nên khó khăn hơn, đòi hỏi khả năng né tránh các chướng ngại vật Với thuật toán BFS, chúng ta có thể dễ dàng xác định đường đi ngắn nhất từ đầu rắn đến thức ăn, và miễn là có đường đi giữa đầu và đuôi rắn, con rắn có thể tiếp tục di chuyển.

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 biểu tượng của ngành công nghiệp game.

Trò chơi Snake lần đầu xuất hiện vào những năm 1970 trên các máy tính đơn giản như DEC PDP-1, nhưng chỉ là một ví dụ minh họa cho hệ thống máy tính thời kỳ đó Đến thập kỷ 1980, Snake trở nên nổi tiếng khi được tích hợp vào điện thoại di động Nokia 6110 vào năm 1997, biến nó thành một trong những trò chơi di động đầu tiên trên toàn cầu Trong thập kỷ 1990, trò chơi đã được phát triển và cải thiện liên tục trên nhiều hệ thống máy tính và thiết bị di động khác nhau Phiên bản Snake II ra mắt năm 2000 với tính năng gấp đôi, giúp con rắn tăng kích thước mỗi khi ăn mồi Kể từ đó, hàng loạt phiên bản và biến thể của Snake đã ra đời trên nhiều nền tảng, 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 tồn tại dưới nhiều hình thức, bao gồm các phiên bản trên điện thoại di động và trò chơi trực tuyến miễn phí.

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

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ỉ mang lại giải trí mà còn có nhiều ứng dụng hữu ích, như giảm căng thẳng và cải thiện khả năng tập trung Ngoài việc giải trí, trò chơi này còn được sử dụng trong giảng dạy lập trình và các khái niệm khoa học máy tính Việc phát triển phiên bản mới của Snake có thể nâng cao trải nghiệm người chơi thông qua cải tiến đồ họa 3D, chế độ chơi đa người và các cấp độ khó khăn khác nhau Người chơi có thể tùy chỉnh kỹ năng cho con rắn của mình, tạo ra chiến lược riêng và trải nghiệm cá nhân hóa Việc tích hợp trí tuệ nhân tạo giúp tạo ra những thách thức mới, trong khi hệ thống điểm số và xếp hạng trực tuyến khuyến khích sự cạnh tranh Thêm vào đó, việc thiết kế nhiều bản đồ đa dạng và tính năng tương tác với cộng đồng sẽ làm cho trò chơi trở nên hấp dẫn và không bao giờ nhàm chán.

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à một ngôn ngữ lập trình hướng đối tượng bậc cao, nổi bật với tính đa năng và khả năng ứng dụng rộng rãi Với các tính năng ưu việt như tự động tạo kiểu dữ liệu và quản lý bộ nhớ tự động, Python là ngôn ngữ lập trình tổng quát, có thể được sử dụng để phát triển nhiều loại chương trình khác nhau mà không bị giới hạn vào một vấn đề cụ thể nào Sự linh hoạt và thân thiện của Python khiến nó trở thành lựa chọn lý tưởng cho người mới bắt đầu.

Những tính năng chính của Python

Python là một ngôn ngữ lập trình cực kỳ đơn giản và dễ tiếp thu, với các câu lệnh dễ học và dễ hiểu Sự đơn giản này giúp biến những cú pháp code phức tạp trở nên dễ dàng hơn, mang lại giải pháp hiệu quả cho người dùng.

Python là một ngôn ngữ lập trình hoàn toàn miễn phí và mã nguồn mở, cho phép các lập trình viên tự do sử dụng và tùy chỉnh cho mục đích thương mại Với tính linh hoạt này, bạn có thể thay đổi mã nguồn của Python trong bất kỳ ứng dụng phần mềm nào.

Python là một ngôn ngữ lập trình di động, cho phép người dùng dễ dàng chuyển đổi giữa các nền tảng khác nhau Bạn có thể chạy chương trình Python trên bất kỳ nền tảng nào mà không lo ngại về sự thay đổi ảnh hưởng đến hiệu suất.

Python là một ngôn ngữ lập trình cao cấp, cho phép chạy chương trình trên mọi hệ điều hành và mạng Internet mà không cần biên dịch Một trong những ưu điểm nổi bật của Python là khả năng tự động dịch và thực thi mã nguồn, giúp tăng tính linh hoạt và hiệu suất làm việc.

Python là một ngôn ngữ lập trình với cấu trúc đơn giản và rõ ràng, rất dễ học cho người mới bắt đầu Đây là một trong những ngôn ngữ lập trình hàng đầu mà người mới nên tìm hiểu.

Python là một ngôn ngữ lập trình đa năng, có mặt trên tất cả các hệ điều hành phổ biến như Windows, MacOS, MS-DOS và Unix Sự hiện diện này chứng tỏ tính linh hoạt và khả năng tương thích cao của Python trong nhiều môi trường khác nhau.

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ý nhanh chóng là một trong những ưu điểm nổi bật của Python, cho phép ngôn ngữ này phát triển từ những script nhỏ gọn đến các phần mềm phức tạp như Blender 3D.

Cấu trúc của Python tiêu tốn nhiều bộ nhớ, khiến ngôn ngữ này không phát huy hiệu quả tối đa trong môi trường có giới hạn về bộ nhớ.

Python không phải là lựa chọn hàng đầu cho phát triển ứng dụng di động và trò chơi do tiêu tốn nhiều bộ nhớ và có tốc độ xử lý chậm hơn so với các ngôn ngữ lập trình khác Tuy nhiên, Python vẫn được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau như phát triển web, phân tích dữ liệu và trí tuệ nhân tạo.

Phân tích dữ liệu và học máy là các lĩnh vực quan trọng trong khoa học dữ liệu, cho phép các nhà phân tích và chuyên gia thực hiện các phép tính thống kê phức tạp, tạo ra trực quan hóa dữ liệu, xây dựng thuật toán học máy, và thao tác cũng như phân tích dữ liệu một cách hiệu quả.

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 cung cấp nhiều thư viện như TensorFlow và Keras, giúp lập trình viên phân tích dữ liệu và học máy hiệu quả hơn Trong phát triển web, Python thường được sử dụng cho phần back-end, thực hiện các nhiệm vụ như gửi và nhận dữ liệu từ máy chủ, xử lý thông tin, giao tiếp với cơ sở dữ liệu, định tuyến URL và đảm bảo an ninh Các khuôn khổ phổ biến cho phát triển web bằng Python bao gồm Django và Flask.

Tự động hóa và phát triển phần mềm với Python cho phép thực hiện các nhiệm vụ lặp đi lặp lại một cách hiệu quả Việc viết mã để xây dựng quy trình tự động này được gọi là viết script Trong lĩnh vực lập trình, tự động hóa có thể được áp dụng để kiểm tra lỗi trên nhiều tệp, chuyển đổi tệp, thực hiện các phép toán đơn giản và loại bỏ các bản sao trong dữ liệu.

Python là một ngôn ngữ lập trình lý tưởng cho người mới bắt đầu, cho phép tự động hóa các tác vụ đơn giản trên máy tính, như đổi tên tệp, tìm kiếm và tải xuống nội dung trực tuyến, cũng như gửi email hoặc tin nhắn theo lịch trình mong muốn.

Trong phát triển phần mềm, Python hỗ trợ kiểm soát bản dựng, theo dõi lỗi và thử nghiệm Ngôn ngữ này cho phép các nhà phát triển tự động kiểm tra sản phẩm hoặc tính năng mới Các công cụ kiểm thử phần mềm phổ biến bằng Python bao gồm Green và Requestium.

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.

ỨNG DỤNG THUẬT TOÁN BREADTH FIRST SEARCH XÂY DỰNG

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 tìm kiếm đường đi ngắn nhất đến đỉnh kề, việc lưu lại các đỉnh kề là rất quan trọng Điều này giúp ta dễ dàng quay ngược lại từ đỉnh kết thúc đến đỉnh xuất phát, đảm bảo tìm được lộ trình ngắn nhất.

Thuật toán sử dụng cơ chế lưu trữ các đỉnh kề thành một danh sách, trong đó các đỉnh đã được xét sẽ không được xét lại Khi một đỉnh kề được thêm vào danh sách, nó sẽ được đưa vào cuối danh sách, theo cơ chế Queue (hàng đợi) Điều này có nghĩa là phần tử mới sẽ được thêm ở cuối danh sách hàng đợi, trong khi phần tử được lấy ra sẽ là phần tử ở đầu danh sách Điểm nổi bật này giúp phân biệt thuật toán này với các thuật toán khác.

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

1 Chọn nút n đầu tiên của O và xóa n khỏi O

Return: Không có lời giải

Con trỏ ngược là một thành phần quan trọng trong việc mở rộng nút, giúp ghi lại nút cha của nút vừa được mở Nó cho phép tìm lại đường đi về trạng thái xuất phát khi đã đạt được trạng thái đích Trong quá trình 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, trong đó có chứa con trỏ trỏ tới nút cha.

Các cải tiến trong việc kiếm theo chiều rộng có thể làm tăng độ phức tạp tính toán do phải khảo sát nhiều nút hơn, đặc biệt là khi có vòng lặp Để giải quyết vấn đề này, việc sử dụng tập đóng là cần thiết; một trạng thái đã có trong tập đóng hoặc tập biên sẽ không được thêm vào tập biên nữa.

Kiểm tra điều kiện đích trước khi thêm nút vào tập biên O giúp giảm số lượng nút cần duyệt trong thuật toán tổng quát Thay vì kiểm tra khi nút được lấy ra để mở rộng, việc kiểm tra sớm này tối ưu hóa quá trình tìm kiếm.

Tính chất đầy đủ của thuật toán phụ thuộc vào không gian trạng thái: nếu không gian trạng thái hữu hạn, thuật toán được coi là đầy đủ Ngược lại, nếu không gian trạng thái vô hạn, thuật toán không đầy đủ vì có thể di chuyển theo một đường đi không chứa nút đích và có độ sâu vô hạn, dẫn đến việc không thể chuyển sang nhánh khá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 tính toán của thuật toán phụ thuộc vào mức độ rẽ nhánh b và độ sâu lời giải d, với độ phức tạp là O(b^(d+1)) nếu không kiểm tra đích trước khi thêm nút vào tập biên, hoặc O(b^d) nếu có kiểm tra Độ phức tạp này tăng nhanh chóng khi b và d gia tăng.

Độ phức tạp bộ nhớ của thuật toán tìm kiếm theo chiều rộng là O(b d+1), yêu cầu lưu trữ O(b d+1) nút trong tập biê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, cần lưu O(b d) nút.

Ví dụ: Tìm đường đi từ đỉnh 1 đến đỉnh 14?

Hình 2.1 Sơ đồ cây Duyệt các đỉnh: Đỉnh Danh sách kề Danh sách đợi

Bảng 2.1 Duyệt các đỉnh trong sơ đồ cây

Trong ví dụ này, các trạng thái trong danh sách kề được thêm vào cuối hàng đợi, và đỉnh duyệt sẽ lấy trạng thái đầu tiên trong hàng đợi để tiếp tục duyệt Quá trình này diễn ra liên tục cho đến khi tìm thấy đỉnh kết thúc cần tìm hoặc khi hàng đợi trở nên rỗng.

2.1.3 Ưu,nhược điểm Ưu đ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.

Việc duyệt tất cả các đỉnh một cách mù quáng mà không chú ý đến thông tin quan trọng trong từng đỉnh sẽ dẫn đến hiệu suất thấp và việc duyệt qua những đỉ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.

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

Thuật toán có nhược điểm lớn khi chỉ phù hợp với không gian trạng thái nhỏ, do chiếm dụng bộ nhớ cao Việc áp dụng trong bản đồ 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ì bao trùm tất cả hàng xóm Ngoài ra, hiệu suất của nó cũng tương đối chậm hơn so với thuật toá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 đó đưa ô lân cận của “n” vào hàng đợi O Cần có một vòng lặp kiểm tra tập C để xác định xem ô “n” đã được thăm hay chưa nhằm tránh lặp lại, và tiếp tục vòng lặp cho đến khi tìm được thức ăn (G) Cuối cùng, sử 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)

Trong quá trình duyệt các nút, nếu không tìm thấy đường đi từ đầu rắn đến thức ăn, chúng ta sẽ trả về đường đi từ đầu đến đuôi rắn Do con rắn sẽ tăng trưởng trong suốt trò chơi và để tuân thủ quy tắc không đâm vào tường hay cắn vào thân mình, cần bổ sung một số hàm để đảm bảo đường đi của rắn không trùng vào các nút chứa thân rắn và tường.

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

Khởi tạo một hàng đợi trống "queue" để lưu trữ các vị trí cần duyệt trong thuật toán tìm kiếm theo chiều rộng (BFS) Đồng thời, tạo một danh sách "inqueue" nhằm theo dõi trạng thái đã thăm của từng vị trí.

Khởi tạo biến boolean "found" với giá trị "False" để kiểm tra sự tồn tại của đường đi hợp lệ từ thức ăn đến đầu rắn Đầu tiên, đưa vị trí thức ăn ban đầu "pfood" vào hàng đợi.

Khi xét hàng đợi, chúng ta lấy một vị trí từ cuối hàng để kiểm tra, bắt đầu từ vị trí thức ăn ban đầu Để tránh lặp lại, cần kiểm tra xem vị trí này đã có trong danh sách "inqueue" hay chưa Nếu đã có, chúng ta sẽ bỏ qua lần lặp này; nếu chưa, chúng ta sẽ tiến hành duyệt và đưa vị trí vào "inqueue" để đánh dấu rằng đã được duyệt.

Từ vị trí ban đầu, ta sẽ đưa các ô lân cận của ô chứa thức ăn vào hàng đợi để duyệt theo 4 hướng: lên, xuống, trái và phải Ở bước này, cần sử dụng một hàm khác để kiểm tra tính khả thi của bước đi tiếp theo.

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.

Cần kiểm tra xem vị trí di chuyển tiếp theo có bị rắn chiếm giữ hay không, nhằm đảm bảo rằng rắn không va chạm vào thân mình và giảm bớt số vị trí cần xem xét cho thuật toán Nếu vị trí đó không bị rắn chiếm giữ, ta sẽ cập nhật lại khoảng cách tương ứng.

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

XÂY DỰNG VÀ TRIỂN KHAI ỨNG DỤNG

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)

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:

Chỉ số đại diện cho đầu của con rắn có giá trị bằng 0, điều này cho thấy đầu của con rắn nằm ở vị trí đầu tiên trong 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).

SNAKE_BLOCK: Kích thước của một ô hoặc ô trên bảng trò chơi, có giá trị 20 pixel.

Tốc độ di chuyển của con rắn trong trò chơi SNAKE_SPEED được thiết lập là 200 mili giây (0.2 giây) cho mỗi khung hình cập nhật, điều này quyết đị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.

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.

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à

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.

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

Chúng ta đã khám phá cách tạo khung hình với hai đối tượng là con rắn và thức ăn Tiếp theo, chúng ta sẽ bổ sung các hàm để cung cấp hoạt động cho con rắn Để rắn có thể di chuyển đến thức ăn, cần kiểm tra từng hướng đi của 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ó phải là ô trống hay không, cần xác định xem ô đó có nằm trong danh sách các nút chứa thân rắn hay không Nếu ô không có trong danh sách này, nó có thể là ô trống hoặc có thức ăn, cho phép rắn di chuyển vào vị trí đó Nếu ô bị chiếm, rắn sẽ tiếp tục tìm kiếm các vị trí khác cho đến khi tìm được hướng đi khả thi.

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.

Chúng ta kiểm tra tính tự do của một ô trên bảng bằng cách xác định xem chỉ số idx có nằm trong danh sách psnake đến vị trí psize hay không; nếu không có, trả về True, ngược lại trả về False Để thực hiện chuyển động cho con rắn, chúng ta sử dụng hàm make_move.

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

Để kiểm tra đuôi của con rắn, ta cần hoán đổi trạng thái giữa ô chứa thức ăn và ô chứa đuôi rắn, sau đó sử dụng thuật toán BFS để tìm đường đi ngắn nhất đến vị trí đuôi mà không đi qua ô chứa thức ăn.

Dựa trên thuật toán BFS, chúng ta có thể xác định được cả đường đi ngắn nhất và dài nhất Khi con rắn đuổi theo thức ăn, nó nên chọn đường đi ngắn nhất để tiếp cận mục tiêu Ngược lại, khi rắn đuổi theo đuôi của chính nó, lựa chọn đường đi dài nhất trong số các đường đi ngắn nhất sẽ giúp nó có thêm không gian và kéo dài thời gian chơi.

BFS sẽ là hàm chính được sử dụng để xây dựng trò chơi rắn săn mồi, giúp con rắn tìm đường đi ngắn nhất từ thức ăn đến chính nó Thuật toán đảm bảo rằng con rắn không di chuyển vào những ô đã chiếm giữ và tiếp tục di chuyển nếu tồn tại đường đi từ đầu đến đuôi Chúng ta sẽ viết hàm broad_BFS để triển khai thuật toán trên ma trận trò chơi, lưu lại trạng thái duyệt của từng ô, cung cấp thông tin quan trọng cho con rắn trong việc tìm đườ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

Chúng ta tạo một hàng đợi để đẩy ô chứa thức ăn (pfood) vào Danh sách vị trí được xét (inqueue) giúp theo dõi các ô đã được kiểm tra Khi hàng đợi không rỗng, chúng ta sẽ thực hiện vòng lặp Đầu tiên, ta lấy phần tử đầu tiên ra khỏi hàng đợi; nếu phần tử này chưa được xét duyệt, chúng ta sẽ tiếp tục vòng lặp.

Chúng ta sử dụng hàm "for i in range(4):" để kiểm tra chuyển động của con rắn có thể đi lên, xuống, trái hoặc phải Nếu có đường đi đến ô tiếp theo và ô đó chứa đầu con rắn, ta sẽ trả về kết quả tìm được Nếu không, ta tiếp tục kiểm tra các điều kiện khác Nếu ô mới trùng với thân rắn nhưng có thể trở thành thân rắn mới, con rắn được phép di chuyển đến ô đó Nếu ô mới được thêm vào hàng đợi, ta sẽ bổ sung nút mới vào cuối hà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.

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 khi kết thúc vòng lặp đầu tiên, một vòng lặp while mới sẽ được khởi động, hoạt động khi biến game_close có giá trị True, tức là khi trò chơi đã kết thúc và người chơi không thắng Trong vòng lặp này, một số hành động sẽ được thực hiện để hiển thị thông báo và điểm số trên màn hình.

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

Bắt đầu một vòng lặp for để duyệt qua chuỗi các giá trị Chuỗi này được cung cấp bằng cách gọi hàm pygame.event.get(), trả về danh sách các sự kiện đã xảy ra từ lần gọi trước Kiểm tra xem có phím nào đã được nhấn trên bàn phím hay không.

Kiểm tra xem phím nhấn có phải là Q hoặc ESC không Nếu đúng, một khối mã sẽ gán True cho biến game_over và False cho biến game_close, cho thấy 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

Bắt đầu vòng lặp for để duyệt qua chuỗi các giá trị, tương tự như chuỗi giá trị được lấy từ hàm pygame.event.get() Vòng lặp này chủ yếu có nhiệm vụ xử lý các sự kiện từ chuột.

Khi người chơi đóng cửa sổ trò chơi, một đoạn mã sẽ được thực thi, gán giá trị True cho biến game_over, nhằm 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.

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.

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.

Bắt đầu một vòng lặp while trong vòng lặp đầu tiên khi game_close là True, tức là khi trò chơi kết thúc và người chơi đã thua Trong vòng lặp này, một số hành động sẽ được thực hiện để hiển thị thông báo và điểm số lên màn hình.

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

Bắt đầu một vòng lặp for để duyệt qua danh sách các sự kiện bằng cách gọi hàm pygame.event.get(), hàm này sẽ trả về các sự kiện đã xảy ra kể từ lần gọi trước Trong vòng lặp, kiểm tra xem có phím nào trên bàn phím đã được nhấn hay chưa.

Kiểm tra xem phím nhấn có phải là Q hoặc ESC Nếu đúng, thực thi một khối mã gán True cho biến game_over và False cho biến game_close, cho thấy 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

Bắt đầu vòng lặp for để lặp qua chuỗi các giá trị, tương tự như khi gọi hàm pygame.event.get() để lấy chuỗi giá trị Vòng lặp này có nhiệm vụ xử lý các sự kiện từ chuột.

Khi người chơi nhấn đóng cửa sổ trò chơi, một đoạn mã sẽ được thực thi, gán giá trị True cho biến game_over nhằm 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 để xác định đường đi ngắn nhất từ vị trí của rắn đến thức ăn trên bản đồ trò chơi Câu lệnh if sẽ thực hiện khối lệnh khi điều kiện được thỏa mãn Hàm find_safe_way được gọi và kết quả của nó được gán cho biến best_move, giúp tìm ra hướng di chuyển an toàn nhất cho rắn Biến best_move sẽ lưu trữ hướng di chuyển của rắn.

Câu lệnh else thực hiện khối mã khi điều kiện if không đúng, và gọi hàm follow_tail để gán kết quả cho biến best_move Hàm này giúp rắn di chuyển theo đuôi của nó khi không còn đường đến thức ăn.

Hàm any sẽ gán kết quả của các nước đi cho biến best_move Hàm này tìm kiếm động tác cho rắn khi không có cách an toàn hoặc không thể theo đuổi Qua đó, rắn cố gắng tránh va chạm với chính mình hoặc tường biên một cách tối đa.

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 với đối số SNAKE_SPEED để điều khiển thời gian Phương thức tick giúp cập nhật clock và giới hạn số khung hình mỗi giây.

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

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

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:

Thiết kế một AI đơn giản cho 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 Con rắn hoạt động theo quy tắc "Miễn là còn đường đi từ đầu đến đuôi, con rắn có thể tiếp tục di chuyển" AI này phải tuân thủ một số ràng buộc, như không được đâm vào tường, nếu không sẽ thua, và khi ăn thức ăn, chiều dài của con rắn sẽ tăng 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ổ.

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.

Chúng em nhận thức được rằng đề tài vẫn còn nhiều hạn chế và thiếu sót, không chỉ về mặt nội dung mà còn trong quá trình thực hiện Vì vậy, chúng em mong muốn nhận được sự góp ý và đánh giá từ quý thầy cô để có thể hoàn thiện đề tài, bổ sung thêm kiến thức và kinh nghiệm thực tế.

Chúng em xin chân thành cảm ơn !

Ngày đăng: 03/01/2024, 15:10

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

TÀI LIỆU LIÊN QUAN

w