Mục tiêu của đề tài
- Tìm hiểu về ngôn ngữ Python và Pygame là một bộ mô-đun Python để xây dựng game
Nâng cao trình độ và khuyến khích sinh viên tự nghiên cứu, học hỏi sẽ giúp phát triển tư duy và khả năng làm việc hiệu quả Bên cạnh đó, rèn luyện kỹ năng thuyết trình là yếu tố quan trọng, tạo nền tảng vững chắc cho sinh viên sau khi tốt nghiệp.
Bố cục đề tài
Ngoài các phần Mở đầu, Kết luận và Tài liệu tham khảo, báo cáo đồ án được bố cục thành ba chương chính sau
- Chương 1: Trình bày tổng quan về công nghệ và cơ sở lý thuyết
- Chương 3: Xây dựng game và Kết quả đạt được
TỔNG QUAN VỀ CÔNG NGHỆ VÀ CƠ SỞ LÝ THUYẾT
Giới thiệu về Python
Python là một ngôn ngữ lập trình bậc cao, đa năng, được phát triển bởi Guido van Rossum và ra mắt lần đầu vào năm 1991 Ngôn ngữ này nổi bật với tính dễ đọc, dễ học và dễ nhớ, giúp người dùng nhanh chóng nắm bắt và áp dụng trong các dự án lập trình.
Python là ngôn ngữ lập trình dễ học với cú pháp rõ ràng, phù hợp cho người mới bắt đầu Nó được sử dụng phổ biến trong phát triển trí tuệ nhân tạo, cho phép viết mã lệnh với số lần gõ phím tối thiểu.
Hình 1.1 Hình ảnh Logo Python
Python là ngôn ngữ lập trình hoàn toàn động, sử dụng cơ chế cấp phát bộ nhớ tự động, tương tự như các ngôn ngữ Perl, Ruby, Scheme, Smalltalk và Tcl Được phát triển trong khuôn khổ một dự án mã nguồn mở, Python được quản lý bởi tổ chức phi lợi nhuận Python Software Foundation.
Python ban đầu được phát triển để hoạt động trên nền tảng Unix, nhưng theo thời gian, nó đã mở rộng và trở thành ngôn ngữ lập trình đa nền tảng, hỗ trợ mọi hệ điều hành từ MS-DOS đến Mac.
Python là một ngôn ngữ lập trình nổi bật, được phát triển với sự đóng góp của nhiều cá nhân, trong đó Guido van Rossum là tác giả chủ yếu Ông đóng vai trò quan trọng trong việc định hình hướng phát triển của Python, góp phần làm cho ngôn ngữ này trở thành một công cụ mạnh mẽ trong lĩnh vực lập trình.
Python luôn được xếp hạng vào những ngôn ngữ lập trình phổ biến nhất.
Sơ lược lịch sử phát triển của Python
Python được Guido van Rossum phát triển vào những năm 1980 tại Trung tâm Toán học – Tin học (CWI) ở Hà Lan, nhằm kế thừa ngôn ngữ ABC, một ngôn ngữ lấy cảm hứng từ SETL Python có khả năng xử lý ngoại lệ và giao tiếp với hệ điều hành Amoeba, và bắt đầu được triển khai vào tháng 12 năm 1989.
Van Rossum đã đảm nhận vai trò nhà phát triển chính của dự án Python cho đến ngày 12 tháng 7 năm 2018, khi ông thông báo sẽ rời bỏ trách nhiệm và danh hiệu "Nhà độc tài nhân từ cho cuộc sống", một danh hiệu được cộng đồng Python trao tặng để ghi nhận sự cống hiến lâu dài của ông trong vai trò quyết định cho dự án.
Vào tháng 7 năm 2018, Van Rossum đã từ chức lãnh đạo trong cộng đồng ngôn ngữ Python sau 30 năm làm việc.
Ưu điểm của Python
• Có cấu trúc code dễ đọc và dễ hiểu, dù là người mới bắt đầu
• Có tính ứng dụng rộng rãi
• Tốc độ xử lý của Python nhanh hơn PHP
• Cho phép các lập trình viên thực hiện sửa lỗi các đoạn mã một cách trực tiếp
• Sở hữu lượng lớn các khối cơ sở dữ liệu, phục vụ hiệu quả cho các chương trình mang tính thương mại
• Nhờ có tính năng đơn giản, nên việc bảo trì các chương trình được tạo ra bởi Python cũng khá đơn giản và nhanh chóng
• Chứa GUI programming hỗ trợ việc hiển thị ảnh minh họa một cách sống động và chân thật
• Khi sử dụng Python, các lập trình viên có thể thoải mải thêm và tùy chỉnh các công cụ, để có thể tối đa hiệu quả trong công việc
Hình 1.2 Các ứng dụng của Python
• Dùng vào việc phát triển trò chơi, nhờ vào các thư viện hỗ trợ, trong đó nổi bật nhất là PyGame
• Xây dựng các chương trình y như mẫu thật một cách nhanh chóng, phục vụ việc trình bày với khách hàng
• Thông qua thư viện Django và Flask để có thể hỗ trợ quá trình lập trình phía máy chủ
• Cung cấp sẵn một thư viện hỗ trợ tối đa công việc trong quá trình phát triển ứng dụng trong lĩnh vực khoa học dữ liệu và học máy
1.1.5 Các thành phần của Python
Ngôn ngữ lập trình, giống như ngôn ngữ tự nhiên, bao gồm nhiều thành phần cấu tạo Trong Python, các thành phần chính bao gồm chú thích (comment), biến (variable), giá trị (value), toán tử (operator) và từ khóa (keyword).
(keyword), và ký hiệu (delimeter)
Các dòng chú thích giúp người viết code dễ dàng hiểu các đoạn mã khác, và chúng không bị dịch bởi trình thông dịch Để tạo một dòng chú thích, chỉ cần thêm dấu # trước dòng đó.
>>># Tac gia Pho Code def main(): print ("Comments example") main()
Tất cả những dòng phía sau dấu # đều không được dịch bởi trình thông dịch
Biến trong Python là tên dùng để lưu trữ giá trị như số hoặc chuỗi ký tự Khác với các ngôn ngữ lập trình như C và Java, Python không yêu cầu khai báo kiểu dữ liệu; trình thông dịch tự động nhận diện kiểu dữ liệu khi bạn gán giá trị cho biến Tên biến trong Python có thể bao gồm chữ cái, chữ số và dấu gạch dưới (_).
15 nhiên tên biến không được phép bắt đầu bằng chữ số, còn lại chữ cái và dấu _ thì được phép
Trên đây là những tên biến hợp lệ
Trên đây là những tên biến không hợp lệ
Tên biến trong Python phân biệt chữ HOA và thường, tức là Price, price, và PRICE là ba biến khác nhau
NUMBER = 12 print (number, Number, NUMBER) Đoạn code trên gán 3 giá trị số vào 3 biến khác nhau
Giá trị là các ký tự đại diện cho một đại lượng gắn liền với một biến nào đó
Trên đây age và nationality là các biến 29 và "Hungarian" là các giá trị
# literals.py name1 = "Jane" age1 = 12
23 print (name1, age1) print (name2, age2)
Nếu chúng ta không gán các giá trị vào biến thì chúng sẽ bị hủy bỏ
Toán tử chính là các phép tính toán
> & | ^ and or not in not in is is not < > !=
Trên đây là danh sách các toán tử trong ngôn ngữ Python Chúng ta sẽ nói chi tiết về các toán tử ở bài sau
Trong các ngôn ngữ lập trình như Pascal và Java, khối lệnh được xác định bằng cặp dấu {} hoặc từ khóa BEGIN–END Ngược lại, Python sử dụng khoảng trắng để xác định khối lệnh, cho phép sử dụng dấu tab hoặc dấu cách Hướng dẫn Python khuyến khích sử dụng 4 dấu cách để đảm bảo tính nhất quán trong mã nguồn.
5 if age > 18: print ("adult person") for i in range(5): print (i)
Trong đoạn code, sau câu lệnh if, các câu lệnh trong khối lệnh phải được thụt vào Để thoát khỏi khối lệnh, cần thụt ra ngoài Nếu câu lệnh for được thụt vào cùng mức với câu lệnh print, thì cả hai nằm trong cùng một khối lệnh.
Trong Python, các ký hiệu bao bọc như cặp dấu ngoặc đơn () rất quan trọng để xác định nội dung cần in ra màn hình Trong Python 2.x, lệnh print không yêu cầu cặp ký tự này, nhưng từ phiên bản 3.x trở đi, print đã trở thành một hàm và do đó bắt buộc phải sử dụng cặp ký tự này để đảm bảo cú pháp chính xác.
Từ khóa trong Python là những từ được sử dụng để thực hiện các lệnh hoặc đại diện cho các thành phần trong ngôn ngữ lập trình này Ví dụ, từ khóa "if" được dùng để thực hiện lệnh so sánh, "for" để bắt đầu vòng lặp, và "and" là tên của toán tử và Quan trọng là bạn không được đặt tên biến hay hàm trùng với các từ khóa này.
This article explores key Python programming concepts, including control flow statements like "if," "elif," and "else," which allow for conditional execution of code It also covers essential keywords such as "def" for defining functions, "class" for creating classes, and "import" for bringing in external modules The use of "try" and "except" for error handling, along with "return" to send back results from functions, is emphasized Additionally, the article touches on loop constructs like "for" and "while," as well as the significance of "yield" in generating iterators Understanding these foundational elements is crucial for effective Python programming.
1.1.6 Cấu trúc cơ bản của Python
• Đặt tên (identifier) trong python
Trong Python, một định danh (identifier) là tên dùng để nhận diện biến, hàm, lớp hoặc đối tượng Định danh bắt đầu bằng một chữ cái (A-Z, a-z) hoặc dấu gạch dưới (_), tiếp theo là 0 hoặc nhiều ký tự, dấu gạch dưới hoặc chữ số (0-9).
Python không cho phép sử dụng ký tự đặc biệt như @, $ và % trong các định danh Ngôn ngữ lập trình này phân biệt chữ hoa và chữ thường, vì vậy UCODE và ucode được coi là hai định danh khác nhau Dưới đây là một số quy tắc nên tuân thủ khi đặt tên định danh trong Python.
Tên có thể là một dãy ký tự hoặc 1 dãy số bắt đầu bằng ký tự hoặc dấu gạch dưới
Không được phép sử dụng ký tự đặc biệt để đặt tên (ngoại trừ dấu gạch dưới)
Ký tự đầu tiên có thể là chữ cái, dấu gạch dưới, nhưng không được sử dụng chữ số làm ký tự đầu tiên
Khi đặt tên không nên đặt trùng với từ khóa trong Python (phần dưới sẽ trình bày về khác từ khóa này)
Tên lớp bắt đầu với một chữ cái hoa Tất cả tên khác bắt đầu với một chữ cái thường
Bắt đầu một định danh với hai dấu gạch dưới chỉ rằng định danh đó thực sự là private
Nếu một định danh kết thúc bằng hai dấu gạch dưới, thì đó là một tên đặc biệt được ngôn ngữ định nghĩa, ví dụ như "init".
• Các từ khoá trong Python
Bảng dưới đây liệt kê các từ khóa trong ngôn ngữ lập trình Python, là những từ được dành riêng và không thể sử dụng làm hằng, biến hay bất kỳ tên định danh nào khác Tất cả các từ khóa trong Python đều được viết bằng chữ thường.
Table 1.1 lists Python keywords, including essential commands such as 'def', 'class', 'import', and control flow statements like 'if', 'for', and 'while' These keywords play a critical role in defining the structure and functionality of Python programs, allowing for the implementation of functions, classes, and exception handling Understanding these keywords is fundamental for effective Python programming and contributes to writing clean, efficient code.
• Dòng lệnh và độ thụt dòng lệnh
Python không sử dụng dấu ngoặc ôm ({}) để xác định các khối mã cho định nghĩa lớp, hàm hoặc điều khiển luồng Thay vào đó, các khối mã được nhận diện thông qua độ thụt dòng, và việc này là bắt buộc trong lập trình Python.
Trong lập trình, số lượng khoảng trống trong độ thụt dòng có thể thay đổi, nhưng tất cả các lệnh trong cùng một khối phải được thụt lề với số khoảng trống giống nhau Ví dụ: khi sử dụng câu lệnh if, nếu điều kiện đúng, sẽ in ra "True", ngược lại sẽ in ra "False".
• Câu lệnh trên nhiều dòng trên Python
Các thành phần của Python
Ngôn ngữ lập trình, giống như ngôn ngữ tự nhiên, bao gồm nhiều thành phần cấu tạo Trong Python, các thành phần chính bao gồm chú thích (comment), biến (variable), giá trị (value), toán tử (operator) và từ khóa (keyword).
(keyword), và ký hiệu (delimeter)
Các dòng chú thích giúp người viết code dễ dàng đọc và hiểu các đoạn mã khác Những chú thích này sẽ không được trình thông dịch xử lý Để tạo một dòng chú thích, chỉ cần thêm dấu # ở phía trước dòng đó.
>>># Tac gia Pho Code def main(): print ("Comments example") main()
Tất cả những dòng phía sau dấu # đều không được dịch bởi trình thông dịch
Biến trong Python là một tên dùng để lưu trữ giá trị như số hoặc chuỗi ký tự Khác với các ngôn ngữ lập trình như C hay Java, Python không yêu cầu khai báo kiểu dữ liệu; trình thông dịch sẽ tự động xác định kiểu dữ liệu khi giá trị được gán cho biến Tên biến trong Python có thể bao gồm chữ cái, chữ số và dấu gạch dưới (_).
15 nhiên tên biến không được phép bắt đầu bằng chữ số, còn lại chữ cái và dấu _ thì được phép
Trên đây là những tên biến hợp lệ
Trên đây là những tên biến không hợp lệ
Tên biến trong Python phân biệt chữ HOA và thường, tức là Price, price, và PRICE là ba biến khác nhau
NUMBER = 12 print (number, Number, NUMBER) Đoạn code trên gán 3 giá trị số vào 3 biến khác nhau
Giá trị là các ký tự đại diện cho một đại lượng gắn liền với một biến nào đó
Trên đây age và nationality là các biến 29 và "Hungarian" là các giá trị
# literals.py name1 = "Jane" age1 = 12
23 print (name1, age1) print (name2, age2)
Nếu chúng ta không gán các giá trị vào biến thì chúng sẽ bị hủy bỏ
Toán tử chính là các phép tính toán
> & | ^ and or not in not in is is not < > !=
Trên đây là danh sách các toán tử trong ngôn ngữ Python Chúng ta sẽ nói chi tiết về các toán tử ở bài sau
Trong các ngôn ngữ lập trình như Pascal và Java, khối lệnh được xác định bằng cặp dấu {} hoặc từ khóa BEGIN–END Tuy nhiên, Python sử dụng khoảng trắng để phân định khối lệnh, cho phép người dùng sử dụng dấu tab hoặc dấu cách Hướng dẫn của Python khuyến khích việc sử dụng 4 dấu cách để đảm bảo tính nhất quán trong mã nguồn.
5 if age > 18: print ("adult person") for i in range(5): print (i)
Trong đoạn code, sau câu lệnh if, khối lệnh phải được thụt vào Để thoát khỏi khối lệnh, cần thụt ra ngoài Nếu câu lệnh for cũng được thụt vào cùng độ dài với câu lệnh print, thì câu lệnh for sẽ nằm trong cùng khối lệnh với câu lệnh print.
Trong Python, các ký hiệu bao bọc như cặp dấu ngoặc đơn () rất quan trọng để xác định nội dung cần in ra màn hình Trong Python 2.x, lệnh print không yêu cầu cặp ký tự này, nhưng từ phiên bản 3.x trở đi, print đã được phát triển thành một hàm và bắt buộc phải sử dụng cặp dấu ngoặc để bao bọc nội dung.
Từ khóa trong Python là những từ được sử dụng để thực hiện các lệnh hoặc đại diện cho các thành phần trong ngôn ngữ lập trình này Ví dụ, từ khóa "if" dùng để thực hiện lệnh so sánh, "for" để bắt đầu vòng lặp, và "and" là toán tử logic Quan trọng là bạn không nên đặt tên biến hoặc hàm trùng với các từ khóa này để tránh gây ra lỗi trong mã nguồn.
The article discusses various Python keywords essential for programming, including control flow statements such as "if," "else," and "elif," as well as loop constructs like "for" and "while." It highlights the significance of keywords like "def" for defining functions, "class" for creating classes, and "import" for including modules Additionally, it covers exception handling with "try," "except," and "finally," as well as the use of "return" to output results from functions Understanding these keywords is crucial for writing effective and efficient Python code.
Cấu trúc cơ bản của Python
• Đặt tên (identifier) trong python
Trong Python, định danh (identifier) là tên dùng để nhận diện biến, hàm, lớp hoặc đối tượng Định danh bắt đầu bằng chữ cái (A-Z, a-z) hoặc dấu gạch dưới (_), tiếp theo là 0 hoặc nhiều ký tự, dấu gạch dưới hoặc số (0-9).
Python không cho phép sử dụng ký tự đặc biệt như @, $ và % trong các định danh Ngôn ngữ lập trình này phân biệt chữ hoa và chữ thường, vì vậy UCODE và ucode được xem là hai định danh khác nhau Để đặt tên các định danh một cách hợp lý, người dùng nên tuân thủ một số qui tắc nhất định.
Tên có thể là một dãy ký tự hoặc 1 dãy số bắt đầu bằng ký tự hoặc dấu gạch dưới
Không được phép sử dụng ký tự đặc biệt để đặt tên (ngoại trừ dấu gạch dưới)
Ký tự đầu tiên có thể là chữ cái, dấu gạch dưới, nhưng không được sử dụng chữ số làm ký tự đầu tiên
Khi đặt tên không nên đặt trùng với từ khóa trong Python (phần dưới sẽ trình bày về khác từ khóa này)
Tên lớp bắt đầu với một chữ cái hoa Tất cả tên khác bắt đầu với một chữ cái thường
Bắt đầu một định danh với hai dấu gạch dưới chỉ rằng định danh đó thực sự là private
Nếu một định danh kết thúc bằng hai dấu gạch dưới, thì đó là một tên đặc biệt được ngôn ngữ định nghĩa, chẳng hạn như "init".
• Các từ khoá trong Python
Bảng dưới đây liệt kê các từ khóa trong ngôn ngữ lập trình Python, những từ này là từ dành riêng và không thể được sử dụng làm hằng, biến hay tên định danh nào khác Tất cả các từ khóa trong Python đều được viết bằng chữ thường.
Table 1.1 lists the keywords in Python, which include essential terms such as 'def', 'class', 'if', 'else', 'for', 'while', 'import', 'try', 'except', 'return', and 'break' These keywords serve as the building blocks for writing Python code, defining functions, control flow, and error handling Understanding these keywords is crucial for effective programming in Python.
• Dòng lệnh và độ thụt dòng lệnh
Python không sử dụng dấu ngoặc ôm ({}) để xác định các khối mã cho định nghĩa lớp, hàm hoặc điều khiển luồng Thay vào đó, các khối mã được nhận diện thông qua độ thụt dòng, và điều này là bắt buộc trong lập trình Python.
Trong lập trình, số lượng khoảng trống trong độ thụt dòng có thể thay đổi, nhưng tất cả các lệnh trong cùng một khối phải được thụt lề với cùng một số lượng khoảng trống Ví dụ: khi sử dụng cấu trúc điều kiện, nếu điều kiện là đúng, lệnh "print 'True'" sẽ được thực thi, ngược lại, lệnh "print 'False'" sẽ được thực hiện.
• Câu lệnh trên nhiều dòng trên Python
Trong Python, các lệnh thường kết thúc bằng một dòng mới, nhưng ngôn ngữ này cũng cho phép sử dụng ký tự để chỉ rõ sự tiếp nối của dòng Ví dụ, bạn có thể viết tổng của các biến như sau: total = item_one + item_two + item_there.
Các lệnh được chứa bên trong các dấu ngoặc [], {}, hoặc () thì không cần sử dụng ký tự / Ví dụ: days = ['Monday', 'Tuesday', 'Wednesday',
Python hỗ trợ ba loại trích dẫn để biểu thị hằng chuỗi: trích dẫn đơn (‘), trích dẫn kép (“) và trích dẫn tam (”’ hoặc “””) Điều quan trọng là các trích dẫn này phải đồng nhất về kiểu mở và đóng.
Quotation marks are used to extend a quoted string across multiple lines The following are all valid quotations: word = 'word', sentence = "This is a sentence.", and paragraph = """This is a paragraph It is made up of multiple lines and sentences."""
Python hỗ trợ hai loại comment: comment đơn dòng và comment đa dòng Comment đơn dòng bắt đầu bằng dấu #, và mọi ký tự sau dấu này cho đến hết dòng sẽ bị bỏ qua bởi trình thông dịch.
# First comment print "Hello, Python!" # second comment
Chương trình trên sẽ cho kết quả:
Bạn cũng có thể gõ một comment trên cùng dòng với một lệnh hoặc biểu thức như sau: name = "Madissetti" # This is again comment
Bạn có thể comment trên nhiều dòng như sau:
Python cũng hỗ trợ kiểu comment thứ hai, đó là kiểu comment đa dòng được cho bên trong các trích dẫn tam, ví dụ:
#single line comment print "Hello Python"
• Sử dụng dòng trống trong lập trình Python
Một dòng chỉ chứa khoảng trắng hoặc một comment sẽ được coi là dòng trống và Python sẽ bỏ qua nó Trong chế độ tương tác của phiên thông dịch, bạn cần nhập một dòng trống để kết thúc một lệnh đa dòng.
• Các lệnh đa dòng trên một dòng đơn trong Python
Dấu chấm phảy “;” cho phép nhiều lệnh xuất hiện trên một dòng duy nhất mà không khởi đầu một khối mã mới Ví dụ: import sys; x = 'foo'; sys.stdout.write(x + 'n').
• Các nhóm lệnh đa dòng (còn được gọi là suite) trong lập trình Python
Trong Python, một nhóm các lệnh đơn tạo thành một khối mã được gọi là suite Các lệnh phức tạp như if, while, def và class yêu cầu một dòng tiêu đề và một suite đi kèm.
Header lines initiate commands with a keyword and conclude with a colon ":", followed by one or more lines that form a suite For example, the structure includes: if expression: suite, elif expression: suite, and else: suite.
• Tham số dòng lệnh trong lập trình Python
Pygame
1.2.1 Giới thiệu về Pygame Đây là thư viện mã nguồn mở trên ngôn ngữ Python dùng để lập trình video games PyGame chứa đầy đủ các công cụ hỗ trợ lập trình game như đồ hoạt, hoạt hình, âm thanh, và sự kiện điều khiển
Đồ hoạ và hoạt hình là hai yếu tố quan trọng trong video games, và PyGame là công cụ lý tưởng giúp lập trình viên tạo ra các nhân vật với hình ảnh sinh động Ngoài ra, PyGame cũng cung cấp các công cụ tích hợp hiệu ứng âm thanh và nhạc nền cho trò chơi, tạo nên trải nghiệm phong phú cho người chơi Cuối cùng, PyGame hỗ trợ hiệu quả việc điều khiển thông qua bàn phím và chuột, nâng cao tính tương tác trong game.
Pygame, được phát triển bởi Pete Shinners, ra đời nhằm thay thế PySDL sau khi dự án này gặp khó khăn trong quá trình phát triển Kể từ năm 2000, Pygame đã trở thành một dự án cộng đồng và được phát hành dưới giấy phép mã nguồn mở GNU Lesser General Public License.
Pygame phiên bản 2 được lên kế hoạch là "Pygame Reloaded" vào năm 2009, nhưng việc phát triển và bảo trì pygame đã hoàn toàn dừng lại cho đến cuối năm
2016 với phiên bản 1.9.1 Sau khi phát hành phiên bản 1.9.5 vào tháng 3 năm 2019, việc phát triển phiên bản 2 mới đang hoạt động theo lộ trình
Pygame 2.0 được phát hành vào ngày 28 tháng 10 năm 2020, nhân ngày sinh nhật thứ 20 của pygame
1.2.3 Kiến trúc và tính năng
Pygame là một thư viện phát triển trò chơi máy tính dựa trên Simple DirectMedia Layer (SDL), cho phép lập trình viên tạo ra trò chơi thời gian thực mà không cần phải sử dụng các cơ chế lập trình phức tạp của ngôn ngữ C Thư viện này giúp trừu tượng hóa các chức năng tốn kém nhất trong trò chơi, cho phép sử dụng ngôn ngữ lập trình bậc cao như Python để xây dựng logic trò chơi một cách hiệu quả.
SDL không hỗ trợ một số tính năng quan trọng như 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 và lọc Ngoài ra, SDL cũng thiếu hỗ trợ cho phông chữ FreeType nâng cao và khả năng vẽ.
Các ứng dụng sử dụng Pygame có khả năng hoạt động trên điện thoại và máy tính bảng Android thông qua Bộ phụ Pygame cho Android (pgs4a) Trên nền tảng Android, các tính năng như âm thanh, rung, bàn phím và gia tốc kế đều được hỗ trợ.
Hình 1.4 Hình minh hoạ một game được lập trình bởi Pygame
PyGame là một thư viện lập trình game dễ học, được viết bằng Python, một ngôn ngữ lập trình thân thiện với người mới bắt đầu Sự đơn giản của Python giúp sinh viên ở mọi độ tuổi và trình độ có thể nhanh chóng nắm bắt và thành thạo PyGame, làm cho nó trở thành lựa chọn lý tưởng cho những ai muốn bắt đầu hành trình lập trình game.
- Mã nguồn mở – PyGame là một dự án mã nguồn mở nên nó có thể được sửa đổi và mở rộng khi cần thiết
- Ứng dụng linh hoạt – PyGame có thể được sử dụng để tạo nhiều dự án từ trò chơi arcade đơn giản đến mô phỏng 3D phức tạp hơn
PyGame là một thư viện mạnh mẽ với nhiều tính năng nổi bật, được hỗ trợ bởi một cộng đồng lớn các nhà phát triển Cộng đồng này không ngừng bổ sung các tính năng mới và cập nhật thường xuyên, giúp PyGame ngày càng hoàn thiện và phổ biến trong việc phát triển game.
THIẾT KẾ GAME
Giới thiệu tổng quan
Flappy Cat là một trò chơi lấy cảm hứng từ Flappy Bird, được phát triển bởi lập trình viên Nguyễn Hà Đông Trò chơi theo phong cách side-scroller, nơi người chơi điều khiển một con mèo để vượt qua các hàng ống màu xanh lá cây mà không va chạm Điểm độc đáo của Flappy Cat là mỗi màn chơi, các cột sẽ di chuyển và tạo ra vị trí ngẫu nhiên khác nhau, mang lại trải nghiệm thú vị cho người chơi.
Hình 2.1.Hình ảnh game Flappy Bird
2.1.2 Thể loại game và yếu tố game Đây là một thể loại game hành động một người mang tính giải trí với chế độ offline tính điểm
Game mang lại nhiều yếu tố như:
✓ Tăng khả năng quan sát và sự nhanh nhẹn
✓ Mang tính giải trí, gắn kết mọi người
✓ Độ khó vừa phải, tính thử thách cao
✓ Tăng thử thách về giới hạn thành công
Với lối chơi game đơn giản bằng các thao tác chạm và luật chơi dễ hiểu game hiện tại đang phát triển tới đối tượng:
✓ Trẻ em từ 5 tuổi trở lên muốn rèn luyện tăng cường sự tỉ mỉ, nhanh nhẹn
✓ Người lớn muốn xả stress hoặc chơi cùng con
Game được phát triển bằng Python, cho phép khả năng mở rộng tốt trên các nền tảng lớn Tuy nhiên, hiện tại, game chủ yếu tập trung vào nền tảng Windows, bao gồm cả laptop và PC.
Kịch bản game
Trò chơi giải trí hành động này sử dụng hình ảnh con mèo dễ thương để tạo cảm hứng cho người chơi Mục tiêu chính là điều khiển mèo vượt qua các cột để ghi điểm, thông qua việc sử dụng chuột hoặc chạm tay Được thiết kế với góc nhìn thứ nhất trong môi trường 2D, trò chơi mang lại trải nghiệm trực quan, kích thích khả năng quan sát của người chơi.
Mục tiêu của trò chơi là điều khiển một chú mèo bay qua các ống Trò chơi sẽ kết thúc nếu chú mèo va chạm với chướng ngại vật Mỗi lần vượt qua một ống, người chơi sẽ tích lũy điểm số.
Người chơi sẽ nhận được một điểm khi 30 mèo vượt qua một cặp ống Trò chơi sử dụng đồ họa tương tự như Super Mario Bros và có hệ thống điều khiển rất đơn giản.
Khi người chơi va chạm với chướng ngại vật, trò chơi sẽ kết thúc và điểm số đạt được sẽ được hiển thị Để bắt đầu một màn chơi mới, người chơi chỉ cần nhấn nút space.
Người chơi sẽ chơi để đạt đến điểm số cao nhất có thể đạt được vì sẽ không có đích đến
Người chơi khi con mèo va chạm với cột hoặc ra khỏi khung màn hình game thì sẽ kết thúc ván chơi => Điểm số
Trong trò chơi Flappy Cat, người chơi sẽ nhận được 1 điểm mỗi khi mèo vượt qua một cột chướng ngại vật Đặc biệt, nếu người chơi chỉ đi qua một nửa cột nhưng vẫn va chạm, trò chơi sẽ kết thúc nhưng điểm số vẫn được tính.
Tất cả các thao tác điều khiển trò chơi đều được thực hiện bởi nút chuột trái của máy tính (PC) hoặc laptop
Người chơi sẽ click chuột trái để con mèo có thể vượt qua các cột chướng ngại vật
Bảng 2.1 Bảng các Elements sử dụng trong game
Background: Ảnh nền của trò chơi
Cat: Hình ảnh con mèo nhân vật chính trong game
Black Cat: Hình ảnh con mèo làm xám màu ở màn hình kết thúc game
Column: Cái cột chướng ngại vật để vượt qua Điểm: Hiện thị số điểm trong ván chơi
Play button: Nhấn nút này để bắt đầu trò chơi
Storyboard
2.3.1 Sơ đồ các màn hình
Hình 2.4.Hình ảnh mô tả thiết kế các cột
• self.width là chiều rộng của cột
• self.height là chiều cao của 1 phần cột
• self.blank là chiều cao khoảng trống giữa 2 phần cột
• self.distance là khoảng cách giữa các cột
• self.speed là tốc độ di chuyển của cột (cột sẽ di chuyển sang trái)
• self.surface là surface của 1 phần cột
Self.ls là một danh sách chứa thông tin về vị trí của các cột và khoảng trống Mỗi phần tử trong danh sách này được biểu diễn dưới dạng [x, y], trong đó x đại diện cho hoành độ của cột và y là tung độ của khoảng trống.
Vòng lặp for trong init dùng để tạo 3 cột đầu tiên for i in range(3): x = WINDOWWIDTH + i*self.distance y = random.randrange(60, WINDOWHEIGHT - self.blank - 60, 20) self.ls.append([x, y])
• Biến x là hoành độ của cột Cột đầu tiên được vẽ sát lề bên trái, tức là x = 0 Các cột tiếp theo cách nhau một khoảng bằng self.distance
• Biến y là vị trí của khoảng trống Biến này nhận giá trị random để tạo những khoảng trống có vị trí khác nhau
2.3.3 Tạo chuyển động cho cột
We will add an update function to the Columns class and call columns.update() in the game loop after the columns.draw() line The idea is to use a for loop to iterate through three columns, decreasing the x-coordinate of each column The update function will look like this: def update(self): for i in range(3): self.ls[i][0] -= self.speed.
Khi các cột di chuyển sang trái và ra khỏi màn hình, chúng ta có thể xoá cột đó để tạo ra cột mới Do đó, self.ls sẽ luôn giữ 3 phần tử, với việc một cột bị xoá và một cột mới được thêm vào tại những thời điểm thích hợp.
Hình 2.5 Hình ảnh mô tả cách sinh cột
In the update function, we iterate three times to adjust the position of elements in the list by decreasing their x-coordinate by the speed value If the first element's x-coordinate goes beyond the left edge of the screen, it is removed from the list Subsequently, a new element is added to the list, positioned at an x-coordinate that is the sum of the second element's x-coordinate and a defined distance, while its y-coordinate is randomly generated within a specified range.
• Dòng if được thêm vào để kiểm tra xem cột có đi ra ngoài màn hình hay chưa
• Dòng self.ls.pop(0) để xoá cột ở vị trí đầu tiên
X là hoành độ của cột được thêm vào, và cột này sẽ cách cột cuối một khoảng bằng self.distance Sau khi xóa một cột, self.ls hiện chỉ còn lại 2 cột.
• y là tung độ khoảng trống của cột thêm vào, cũng lấy giá trị random như những cột khác
2.3.4 Cơ chế xử lý va chạm
Xử lý va chạm là yếu tố quan trọng trong lập trình game, đặc biệt trong Flappy Cat, nơi mèo va chạm với cột Để xác định va chạm, chúng ta coi mèo và cột như hai hình chữ nhật Cần viết một hàm kiểm tra va chạm giữa hai hình chữ nhật, với hai tham số là hai danh sách chứa thông số (hoành độ, tung độ, chiều rộng, chiều cao).
To detect collisions between two rectangles in a programming context, you can use the following function: `def rectCollision(rect1, rect2):` This function checks if the boundaries of the first rectangle (`rect1`) intersect with those of the second rectangle (`rect2`) It evaluates the conditions: if the left side of `rect1` is less than or equal to the right side of `rect2`, and vice versa for the right side of `rect1` and the left side of `rect2`, as well as the top and bottom edges of both rectangles If all these conditions are met, the function returns `True`, indicating a collision; otherwise, it returns `False`.
Ta sẽ chuyền vào 2 “hình chữ nhật” vào hàm, hàm sẽ trả về True nếu 2 hình chữ nhật chạm nhau, ngược lại sẽ trả về False
After handling the collision, we will implement the game over logic We already have a function to check for collisions between two rectangles, which we will utilize in the game over check We will add the isGameOver function as follows: ```pythondef isGameOver(cat, columns): for i in range(3): rectCat = [cat.x, cat.y, cat.width, cat.height] rectColumn1 = [columns.ls[i][0], columns.ls[i][1] - columns.height, columns.width, columns.height] rectColumn2 = [columns.ls[i][0], columns.ls[i][1] + columns.blank, columns.width, columns.height] if rectCollision(rectCat, rectColumn1) or rectCollision(rectCat, rectColumn2): hit_sound.play() return True if cat.y + cat.height < 0 or cat.y + cat.height > WINDOWHEIGHT: die_sound.play() return True return False```This function checks for collisions and determines if the game should end based on the cat's position and interactions with the columns.
Trong hàm này, có một vòng lặp for để kiểm tra va chạm của mèo với ba cột; nếu mèo chạm vào bất kỳ cột nào, trò chơi sẽ kết thúc Biến rectCat lưu trữ thông số hình chữ nhật của mèo, trong khi rectColumn1 và rectColumn2 chứa thông số cho hai phần của cột Dòng if trong vòng lặp kiểm tra xem mèo có va chạm với một trong hai phần của cột hay không, sử dụng hàm rectCollision để xác định sự va chạm Nếu mèo chạm vào cột, hàm isGameOver sẽ trả về giá trị True.
Trong đoạn mã, câu lệnh if nằm trong vòng lặp for được sử dụng để kiểm tra các tình huống khi mèo chạm đất hoặc bay quá cao ra ngoài màn hình Nếu xảy ra một trong hai trường hợp này, mèo sẽ bị coi là đã chết và trò chơi sẽ chuyển sang màn hình game over ngay lập tức.
Trong trò chơi, khi con mèo đi qua một cột, nó sẽ nhận thêm điểm Chúng ta đã có hàm rectCollision để kiểm tra va chạm giữa hai hình chữ nhật Do đó, chúng ta có thể sử dụng hàm này bằng cách tạo một hình chữ nhật phía sau cột, gọi là "hình chữ nhật tính điểm" Nếu mèo chạm vào hình chữ nhật này, điểm số sẽ được cộng thêm.
Hình 2.6 Hình ảnh mô tả cách tính điểm
Create a Score class in Python that initializes a score variable to zero and includes a method to render the score using Pygame The class has an ` init ` method to set up the score and a `draw` method that utilizes Pygame's font rendering capabilities to display the score on the screen.
DISPLAYSURF.blit(scoreSuface, (int((WINDOWWIDTH - textSize[0])/2), 100))
The `update` method checks for collisions between a bird and three columns It initializes a collision flag as false and iterates through each column, creating rectangles for both the bird and the columns If a collision is detected, the flag is set to true, and the loop breaks If a collision occurs, the score is incremented if the `addScore` flag is true, and then the `addScore` flag is toggled to prevent multiple score increments in one update.
Trong hàm init , có hai biến quan trọng: self.score đại diện cho số điểm và self.addScore dùng để xác định liệu có được cộng thêm điểm hay không.
Trong trò chơi, khi mèo di chuyển qua cột, nó sẽ chạm vào "hình chữ nhật tính điểm" nhiều lần, nhưng chỉ nhận 1 điểm cho mỗi lần chạm đầu tiên Biến self.addScore được sử dụng để cộng điểm, với giá trị khởi đầu là True Khi mèo chạm vào "hình chữ nhật tính điểm" lần đầu, điểm sẽ được cộng và self.addScore sẽ trở thành False Khi mèo vượt qua "hình chữ nhật tính điểm" mà không chạm vào nữa, self.addScore sẽ lại trở về True để chuẩn bị cộng điểm cho lần chạm tiếp theo.
Hàm draw trong class Score chỉ dùng để vẽ điểm Biến collision để kiểm tra
Tài nguyên
Hình 2.10.Hình ảnh các vật thể trong game
Hình ảnh với màu sắc sặc sỡ trên nền tối không chỉ làm nổi bật vật thể mà còn kích thích sự chú ý của người chơi Việc sử dụng đa dạng màu sắc trong thiết kế là cần thiết, nhưng cần tránh các cặp màu gây chói như đỏ - xanh và trắng - đỏ để tạo sự hài hòa và dễ chịu cho người xem.
… gây khó chịu cho mắt
Sử dụng các âm thanh nhạc nền, click , âm thanh kèm theo màn thắng , màn thua giúp game sinh động hơn
Hiệu ứng âm thanh sẽ giúp game trở nên hấp dẫn , lôi cuốn hơn đặc biệt với trẻ em nhỏ khi chơi game
Hình 2.11 Hình minh hoạ màu sắc trong game
Bảng 2.2 Bảng âm thanh dùng trong game
STT Tên Tác dụng Nguồn
1 Sneaky-Snitch.mp3 Nhạc nền của game https://www.chosic.com
2 sfx_die.wav Nhạc hiệu ứng chọn nút https://www.sounds- resource.com
3 sfx_hit.wav Nhạc hiệu ứng khi nhận điểm
Nhạc hiệu ứng khi hoàn thành màn chơi
Nhạc hiệu ứng khi kết thúc trò chơi
Kích thước font: 20px, 30px và 60px
Màu chữ: Đen, đỏ, trắng
Hình 2.12 Hình ảnh font Consolas
Hình 2.13 Hình ảnh font Arial
Nguồn: https://fonts.google.com/
XÂY DỰNG GAME VÀ KẾT QUẢ ĐẠT ĐƯỢC
Xây dựng Game
3.1.1.Xây dựng các hình ảnh, vật thể trong game import pygame, sys, random from pygame.locals import *
// Khai báo thư viện được sử dụng trong game
//Tạo cửa sổ của game
CAT1IMG = pygame.image.load('Desktop/Flappy Cat/img/cat1.png')
//Xây dựng con mèo chuyển động trong game
CAT2IMG = pygame.image.load('Desktop/Flappy Cat/img/cat2.png')
//Xây dựng ảnh con mèo màu ở màn game over
BACKGROUND = pygame.image.load('Desktop/Flappy Cat/img/background.jpg')
COLUMNIMG = pygame.image.load('Desktop/Flappy Cat/img/column.png')
//Tạo cột chướng ngại vật trong game
PLAYIMG = pygame.image.load('Desktop/Flappy Cat/img/play.png')
//Tạo nút chơi tại màn hình bắt đầu game pygame.init()
FPS = 60 fpsClock = pygame.time.Clock()
//Khởi tạo pygame và đặt FPS cho game
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT)) pygame.display.set_caption('Flappy Cat')
//Đặt tiêu đề game icon = pygame.image.load('Desktop/Flappy Cat/img/cat1.png') pygame.display.set_icon(icon)
//Tạo icon game main_sound = pygame.mixer.music.load("Desktop/Flappy Cat/music/Sneaky-
Snitch.mp3") pygame.mixer.music.set_volume(0.3) pygame.mixer.music.play()
//Chèn nhạc nền vào game, đặt âm lượng flap_sound = pygame.mixer.Sound('Desktop/Flappy Cat/music/sfx_wing.wav')
//Chèn hiệu ứng âm thanh lúc bay hit_sound = pygame.mixer.Sound('Desktop/Flappy Cat/music/sfx_hit.wav')
//Chèn hiệu ứng âm thanh lúc va chạm score_sound = pygame.mixer.Sound('Desktop/Flappy Cat/music/sfx_point.wav')
//Chèn hiệu ứng âm thanh lúc tính điểm die_sound = pygame.mixer.Sound('Desktop/Flappy Cat/music/sfx_die.wav')
//Chèn hiệu ứng âm thanh lúc chết ra khỏi màn hình game x = 50 y = 50 width = 40 height = 60 vel = 5 run = True
//Khởi động nhạc nền cho game
3.1.2 Xây dựng vật thể mèo, cột class Cat()://Khởi tạo class cho mèo def init (self): self.width = CAT1WIDTH //Chiều rộng của vật self.height = CAT1HEIGHT //Chiều cao của vật self.x = (WINDOWWIDTH - self.width)/2 //Xác định vị trí hoành độ của vật self.y = (WINDOWHEIGHT- self.height)/2 //Xác định vị trí tung độ của vật self.speed = 0 //Tốc độ của vật self.suface = CAT1IMG //Đặt hình ảnh của vật def draw(self):
DISPLAYSURF.blit(self.suface, (int(self.x), int(self.y)))
In the update method, the object's vertical position is adjusted by its speed plus half the gravitational constant, G, while the speed increases by G with each update When a mouse click is detected, the object's speed is set to a predefined constant, SPEEDFLY, triggering a flap sound effect The Columns class initializes with defined width, height, blank space, distance between columns, and movement speed, along with an image for the columns It generates a list of columns, positioning them randomly within the window's height while maintaining a specified distance between each column.
//Xuất hiện random các vị trí , kích thước khác nhau của cột def draw(self): for i in range(3):
DISPLAYSURF.blit(self.surface, (self.ls[i][0], self.ls[i][1] - self.height)) //Vẽ các cột với chiều cao khác nhau
The code snippet utilizes the DISPLAYSURF.blit method to draw columns with varying gaps on the surface In the update function, it continuously refreshes the columns' positions by decrementing their x-coordinates based on the defined speed When a column moves off-screen, it is removed from the list New columns are generated by calculating their x-coordinate based on the distance from the preceding column and randomly determining their y-coordinate within specified bounds, ensuring a dynamic visual effect.
3.1.3 Tạo sự kiện va chạm def rectCollision(rect1, rect2): if rect1[0]