Khi kích hoạt này, bạn có thể cài đặt pygame bằng pip: pip install pygame Sau khi chạy lệnh này, bạn sẽ thấy kết quả trông giống như sau: Output Collecting pygame Using cached pygame-1.
Trang 1TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH
KHOA ĐÀO TẠO CHẤT LƯỢNG CAO NGÀNH: CÔNG NGHỆ THÔNG TIN
o0o BÁO CÁO KẾT THÚC MÔN HỌC
Đề tài: Lập trình game FlappyBird
Nhóm sinh viên thực hiện
- Nguyễn Thị Xuân Mai
- Bùi Hoàng Hưng
- Nguyễn Trần Huỳnh Lê
- Trần Vĩnh Hùng
Giảng viên hướng dẫn
- ThS Nguyễn Đăng Quang
TP Hồ Chí Minh, tháng 1 năm 2022
Trang 2NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
Giáo viên hướng dẫn
Nguyễn Đăng Quang
Trang 3NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN
Giáo viên phản biện
LỜI NÓI ĐẦU
Trang 4Không có sự thành công nào mà không gắn liền với những nỗ lực, cố gắng,
sự hỗ trợ, giúp đỡ dù ít hay nhiều, dù trực tiếp hay gián tiếp Là cả quá trình phấnđấu không ngừng nghỉ bên cạnh những hướng dẫn, chỉ bảo tận tình, gắn bó và tìnhcảm sâu sắc
Để hoàn thành tốt đề tài và bài báo cáo này, chúng em xin gửi lời cảm ơnchân thành đến giảng viên, thầy Nguyễn Đăng Quang, người đã trực tiếp hỗ trợchúng em trong suốt quá trình làm đề tài Chúng em cảm ơn thầy đã đưa ra nhữnglời khuyên từ kinh nghiệm thực tiễn của mình để định hướng cho chúng em đi đúngvới yêu cầu của đề tài đã chọn, luôn giải đáp thắc mắc và đưa ra những góp ý, chỉnhsửa kịp thời giúp chúng em khắc phục nhược điểm và hoàn thành tốt cũng như đúngthời hạn đã đề ra
Chúng em cũng xin gửi lời cảm ơn chân thành các quý thầy cô trong khoaĐào tạo Chất Lượng Cao nói chung và ngành Công Nghệ Thông Tin nói riêng đãtận tình truyền đạt những kiến thức cần thiết giúp chúng em có nền tảng để làm nên
đề tài này, đã tạo điều kiện để chúng em có thể tìm hiểu và thực hiện tốt đề tài
Đề tài và bài báo cáo được chúng em thực hiện với những hạn chế về mặtkiến thức, kĩ thuật và cũng như kinh nghiệm thực tế Do đó, trong quá trình làm nên
đề tài có những thiếu sót là điều không thể tránh khỏi nên chúng em rất mong nhậnđược những ý kiến đóng góp quý báu của thầy để kiến thức của chúng em đượchoàn thiện hơn và chúng em có thể làm tốt hơn nữa trong những lần sau Chúng emxin chân thành cảm ơn
Cuối lời, nhóm em kính chúc thầy dồi dào sức khỏe và thành công hơn nữatrong sự nghiệp trồng người
Tp Hồ Chí Minh, tháng 1 năm 2022
Nhóm sinh viên thực hiện
Trang 5MỤC LỤC
MỤC LỤC HÌNH ẢNH I
PHẦN MỞ ĐẦU 1
1 Lý do chọn đề tài 1
2 Đối tượng nghiên cứu 1
3 Phạm vi nghiên cứu 1
4 Mục tiêu nghiên cứu 1
PHẦN NỘI DUNG 2
CHƯƠNG I LÝ THUYẾT 2
1 Pygame là gì? 2
1.1 Khái niệm Pygame 2
1.2 Mục đích ra đời của Pygame 2
2 Ưu điểm của Pygame 3
3 Làm game với Python & Pygame 3
3.1 Cài đặt và bắt đầu bằng Python 2
3.2 Cài thư viện Pygame 2
3.3 Các lệnh đơn giản với Pygame 2
3.3.1 Chương trình “Hello word” đầu tiên 7
3.3.2 Các lệnh thường dùng trong Pygame 7
CHƯƠNG II ỨNG DỤNG 2
1 Lên ý tưởng 17
2 Phát triển ý tưởng 20
3 Cấu hình và kiểm thử 24
3.1 Chèn Background và sàn của game 11
Trang 63.2 Tạo chim Flappy Bird và hệ thống ống 11
3.3 Xử lý va chạm trong game 11
3.4 Tạo chuyển động cho chim Flappy Bird 11
3.5 Tạo hệ thống tính điểm cho game 11
3.6 Tạo cửa sổ kết thúc 11
3.7 Xử lý âm thanh trong game 11
4 Hướng dẫn sử dụng 24
PHẦN KẾT LUẬN 41
1 Kết quả đạt được 41
2 Thuận lợi 41
3 Khó khăn 41
4 Nhận xét và đánh giá tổng quan 41
5 Đánh giá mức độ hoàn thành của thành viên 41
TÀI LIỆU THAM KHẢO 42
Trang 7MỤC LỤC HÌNH ẢNH CHƯƠNG I: LÝ THUYẾT
Hình 1.1 VXLAN packet format 5
Hình 1.2 Mô hình 3 layer truyền thống 6
Hình 1.3 Mô hình layer 2 mở rộng 7
Hình 1.4 Mô hình Spine-Leaf 8
Hình 1.5 VxLAN flood and learning 10
Hình 1.6 VxLAN Ingress Replication 11
Hình 1.7 VxLAN flow 12
Hình 1.8 Multi DC 13
CHƯƠNG II: ỨNG DỤNG Hình 2.1 Topo MultiDC trên Docker 17
Hình 2.2 Đường truyền trong Mullti-DC 18
Hình 2.3 Gói tin được đóng gói và truyền thông qua VXLAN 18
Hình 2.4 Topo nghiên cứu Cách truyền lưu lượng BUM của VXLAN 19
Hình 2.5 Truyền lưu lượng BUM 21
Hình 2.6 Topo VXLAN xử lý lưu lượng BUM 24
Hình 2.7 Kiểm tra đường truyền trên PC 40
Trang 8DANH MỤC TỪ VIẾT TẮT
Trang 9xa xỉ
Ngày nay, khi smartphone đã quá thông dụng, ta không khó bắt gặp hình ảnhđứa trẻ cầm điện thoại chơi game FlappyBird lại là một game khá dễ thương, chơinhiều thì hại mắt, tốn thời gian, nhưng nếu chơi vào mục đích giải trí thì vô cùng "thư giản " với con game này Game có nội dung phù hợp với nhiều lứa tuổi, nhânviên văn phòng, học sinh, sinh viên, giảng viên như thầy chơi vẫn thấy thích
Bọn em chọn đề tài là game này cũng mong được thể hiện bản thân, tuy đã cũnhưng chắc chắn sẽ có những sáng tạo mới lạ, không giống những Flappy " Chicken
Ngôn ngữ lập trình python nói chung và pygame nói riêng
4 Mục tiêu nghiên cứu
Hiểu rõ hơn về python, trau dồi kĩ năng làm game với thư viện pygame
Trang 10PHẦN NỘI DUNG CHƯƠNG I LÝ THUYẾT
1 Pygame là gì?
1.1 Khái niệm Pygame
PyGame là một thư viện của ngôn ngữ Python Nó được sử dụng để phát triển trò chơi 2-D và là một nền tảng nơi bạn có thể sử dụng một tập hợp các mô-đun Python
để phát triển trò chơi Đây là một nền tảng dễ hiểu và thân thiện với người mới bắt
đầu có thể giúp bạn phát triển trò chơi một cách nhanh chóng.
1.2 Mục đích ra đời của Pygame
Nhằm tạo ra một môi trường lập trình game, thõa sức sáng tạo, kích thích tư duy.Người học lập trình pygame sẽ được nâng cao khả năng tư duy, tạo công ăn việclàm, thõa sức với đam mê và sáng tạo
2 Ưu điểm của Pygame
- Dễ hiểu, dễ học
- Đơn giản, ít tốn thời gian
- Ít lỗi phát sinh
- Khả năng ứng dụng rộng rãi
3 Làm game với python và pygame
3.1 Cài đặt và bắt đầu bằng python
Cài đặt trên window
Có hai phiên bản python 3.7 (mới nhất) và 2.7 Hãy truy cập trang này và tải xuống phiên bản mà bạn muốn
Bạn có thể tải xuống bất kỳ phiên bản nào Tuy nhiên, hầu hết các ứng dụng python gần đây đều có trên python 3 và hỗ trợ python 2 sắp kết thúc Vì những lý do đó, hãy tải xuống python 3 Khi bạn nhấp vào liên kết đó và bạn sẽ được chuyển hướng đến trang bên dưới và tải xuống tệp thực thi tùy thuộc vào máy của bạn
Trang 11Khi bạn nhấp đúp vào đây, một cửa sổ bật lên sẽ hiển thị như bên dưới
Bạn có thể chọn hộp kiểm thứ hai Add Python 3.7 to PATHđể có thể sử dụng trực tiếp mà không cần chỉ định đường dẫn nào Sau khi bạn nhấp vào Cài đặt ngay và bạn sẽ thấy màn hình sau
Trang 12Bây giờ chúng ta có thể kiểm tra phiên bản python bằng cách mở giao diện dòng lệnh Hãy chắc chắn rằng bạn đang kiểm tra với vốn V.
Cài đặt trên Mac Os
Việc cài đặt python trên Mac OS không khác gì ở trên Hãy truy cập trang này và tảixuốngmacOS 64-bit installer
Trang 13Trang tải xuống :
Sau khi bạn tải xuống trình cài đặt, hãy nhấp đúp vào nó và làm theo hướng dẫn nhưbên dưới
Trang 14Khi kích hoạt này, bạn có thể cài đặt pygame bằng pip:
pip install pygame
Sau khi chạy lệnh này, bạn sẽ thấy kết quả trông giống như sau:
Output
Collecting pygame Using cached
pygame-1.9.3-cp35-cp35m-manylinux1_x86_64.whl Installing collected packages: pygame Successfully installed pygame-1.9.3
Nếu bạn đã cài đặt pygame vào hệ thống có sẵn video và âm thanh, bạn có thể xác minh cài đặt của bạn bằng cách chạy lệnh sau, lệnh này sẽ chạy một trò chơi giả trình bày những gì pygame có thể làm với đồ họa và âm thanh:
Trang 15 python -m pygame.examples.aliens
Nếu bạn không muốn mở mẫu hoặc nếu bạn không có AV như một phần cài đặt củabạn , bạn cũng có thể nhập vào console tương tác Python đảm bảo rằng bạn có thể nhập module pygame Đầu tiên, gõ lệnh python để khởi động console :
Nếu bạn gặp sự cố khi cài đặt trên dòng lệnh, bạn có thể xem wiki Bắt
đầu của pygame
Trong các bước sau, ta sẽ giả sử việc sử dụng màn hình để hiển thị giao diện user đồhọa như một phần của hướng dẫn này để xác minh mã của ta
import pygame
Ta cũng có thể tùy chọn thêm một câu lệnh nhập khác bên dưới dòng đầu tiên để thêm một số hằng số và hàm của pygame vào không gian tên chung của file của bạn:
our_game.py
import pygame from pygame.locals import *
Với pygame được nhập vào file chương trình của ta , ta đã sẵn sàng sử dụng nó để tạo mẫu trò chơi
Khởi tạo pygame
Từ đây, ta sẽ khởi tạo các chức năng của pygame bằng hàm init() , viết tắt của “khởitạo”
our_game.py
import pygame from pygame.locals import * pygame.init()
Hàm init() sẽ tự động khởi động tất cả các module pygame mà bạn cần khởi tạo.Bạn cũng có thể khởi tạo từng module của pygame riêng lẻ, như trong:
Trang 16pygame.font.init()
Hàm init() sẽ trả về một bộ giá trị cho bạn nếu bạn muốn Tuple này sẽ hiển thị khởitạo thành công và không thành công Ta có thể thực hiện điều này cho cả lệnh gọi init() và khởi tạo các module cụ thể (sẽ cho ta biết liệu các module này có khả dụng hay không):
i = pygame.init() print(i) f = pygame.font.init() print(f)
Nếu ta chạy đoạn mã trên, ta sẽ nhận được kết quả tương tự như sau:
Output
(6, 0) None
Trong trường hợp này, biến trả về bộ giá trị (6, 0) , cho thấy rằng có 6 lần khởi tạo pygame thành công và 0 lần thất bại Biến f trả về None , cho biết rằng module không khả dụng trong môi trường cụ thể này
Cài đặt bề mặt hiển thị
Từ đây, ta cần cài đặt bề mặt hiển thị trò chơi của bạn Ta sẽ sử
dụng pygame.display.set_mode() để khởi tạo một cửa sổ hoặc màn hình để hiển thị
và chuyển nó vào một biến Vào trong hàm, ta sẽ truyền một đối số cho độ phân giảimàn hình là một cặp số biểu thị chiều rộng và chiều cao trong một bộ giá trị Hãy thêm chức năng này vào chương trình của ta :
Bạn có thể sẽ thường xuyên sử dụng các số nguyên cho độ phân giải trò chơi của bạn , vì vậy có thể bạn cần gán các số đó cho các biến thay vì sử dụng các số lặp đi lặp lại Điều này có thể giúp bạn dễ dàng hơn khi cần sửa đổi chương trình của bạn ,
vì bạn chỉ cần sửa đổi những gì được chuyển cho các biến
Ta sẽ sử dụng biến display_width cho chiều rộng của màn hình trò chơi của ta
và display_height cho chiều cao và chuyển các biến đó vào hàm set_mode() :
Trang 17Ảnh động thường là những thay đổi giữa các khung hình khác nhau theo thời gian Bạn có thể nghĩ đến một cuốn sách lật khi nghĩ về hình ảnh động, vì chúng bao gồmmột loạt các hình ảnh thay đổi dần dần từ trang này sang trang sau Các trang này cung cấp mô phỏng chuyển động khi chúng được lật nhanh chóng, vì nội dung của trang dường như đang chuyển động Trong trò chơi máy tính, khung được sử dụng thay vì trang.
Do khái niệm lật trang hoặc khung, một trong những hàm được dùng để cập nhật hiển thị bề mặt trò chơi được gọi là flip() và có thể được gọi trong file của ta ở trên như sau:
pygame.display.flip()
Hàm flip() cập nhật toàn bộ bề mặt hiển thị lên màn hình
Thường xuyên hơn, hàm update() được sử dụng thay vì hàm flip() vì nó sẽ chỉ cập nhật các phần của màn hình chứ không phải toàn bộ khu vực để tiết kiệm bộ nhớ.Hãy thêm hàm update() vào cuối file our_game.py :
Ta sẽ tạo mộtvòng lặp while sẽ chạy trò chơi Vòng lặp sẽ gọi giá
trị Boolean của True , nghĩa là vòng lặp sẽ lặp mãi mãi trừ khi nó bị gián đoạn.Trong vòng lặp trò chơi chính này của chương trình của ta , ta sẽ xây dựng
một vòng lặp for để lặp qua các sự kiện user trong hàng đợi sự kiện, sẽ được gọi bởihàm pygame.event.get()
Đến đây, ta không có gì trong vòng lặp for , nhưng ta có thể thêm một câu print() đểcho thấy rằng mã đang hoạt động như ta mong đợi Ta sẽ chuyển các sự kiện trong vòng lặp vào câu lệnh dưới dạng print(event)
Hãy thêm hai vòng lặp này và câu print() vào file chương trình của ta :
Trang 18 python our_game.py
Khi ta chạy file , một cửa sổ 800x600 sẽ bật lên Để kiểm tra các sự kiện, bạn có thể
di chuột qua cửa sổ, nhấp vào bên trong cửa sổ và nhấn các phím trên bàn phím Các sự kiện này sẽ in ra cửa sổ console của bạn
Đầu ra bạn nhận được sẽ giống như sau:
Output
<Event(4-MouseMotion {'rel': (616, 355), 'buttons': (0, 0, 0), 'pos': (616, 355)})> <Event(5-MouseButtonDown {'button': 1, 'pos': (616, 355)})>
<Event(6-MouseButtonUp {'button': 1, 'pos': (616, 355)})>
<Event(2-KeyDown {'scancode': 3, 'key': 102, 'unicode': 'f', 'mod': 0})> KeyUp {'scancode': 3, 'key': 102, 'mod': 0})>
<Event(3-Đầu ra này hiển thị các sự kiện user đang diễn ra Những sự kiện này sẽ kiểm soát trò chơi khi chúng được tạo ra bởi user Khi nào bạn chạy hàm pygame.event.get() ,
mã của bạn sẽ tham gia các sự kiện này
Dừng chương trình chạy bằng cách nhấn CTRL + C trong cửa sổ terminal
Đến đây, bạn có thể xóa hoặc comment câu print() vì ta sẽ không cần phải có tất cả kết quả terminal này
Từ đây, ta có thể hoàn thiện mẫu của bạn bằng cách học cách thoát khỏi trò chơi
Bỏ cuộc
Để thoát khỏi chương trình pygame, trước tiên ta có thể hủy khởi tạo các module liên quan, sau đó thoát Python như bình thường
Hàm pygame.quit() sẽ hủy khởi tạo tất cả các module pygame và
hàm quit() Python quit() sẽ thoát khỏi chương trình
Vì user có quyền kiểm soát các chức năng và sự kiện của trò chơi, ta cũng nên biết rằng pygame.QUIT được gửi đến hàng đợi sự kiện khi user yêu cầu tắt chương trìnhbằng cách nhấp vào dấu “X” ở góc trên của cửa sổ trò chơi
Hãy để ta bắt đầu kiểm soát stream chương trình bằng câu lệnh if điều kiện trong vòng lặp for xử lý sự kiện:
our_game.py
import pygame from pygame.locals import * pygame.init() display_width
= 800 display_height = 600 game_display =
pygame.display.set_mode((display_width, display_height))
pygame.display.update() while True: for event in pygame.event.get():
if event.type == QUIT: pygame.quit() quit()
Trong đoạn mã trên, ta nói rằng nếu user đã yêu cầu chương trình tắt, chương trình nên hủy khởi tạo các module pygame.quit() bằng pygame.quit() và thoát khỏi
chương trình bằng lệnh quit()
Vì ta đã nhập pygame.locals ta có thể gợi lên event.type và QUIT như hiện tại (thay
vì với pygame Ở trước chúng)
Trang 19Mặc dù user có thể biết cách nhấp vào “X” ở góc trên của cửa sổ trò chơi, ta có thể cần một số sự kiện user khác kích hoạt yêu cầu thoát khỏi chương trình Ta có thể thực hiện việc này với loại sự kiện KEYDOWN và một hoặc nhiều khóa.
Sự kiện KEYDOWN nghĩa là user đang nhấn một phím trên bàn phím của họ xuống Đối với mục đích của ta , giả sử rằng phím Q (như trong "thoát")
hoặc ESC có thể thoát khỏi chương trình Hãy thêm mã biểu thị điều này trong vònglặp for của ta :
our_game.py
import pygame from pygame.locals import * pygame.init() display_width
= 800 display_height = 600 game_display =
pygame.display.set_mode((display_width, display_height))
pygame.display.update() while True: for event in pygame.event.get():
if event.type == QUIT or ( event.type == KEYDOWN and ( event.key == K_ESCAPE or event.key == K_q )): pygame.quit() quit()
Ta đã thêm các toán tử logic Boolean để chương trình có thể thoát nếu user nhấp vào "X" ở góc trên của cửa sổ trò chơi hoặc nếu user nhấn một phím xuống là phím thoát hoặc phím Q ( lưu ý điều này không phân biệt chữ hoa chữ thường)
Đến đây, nếu bạn chạy chương trình bằng lệnh python our_game.py , bạn có thể kiểm tra chức năng của trò chơi đang chạy và sau đó thoát bằng cách thoát khỏi cửa
sổ với biểu tượng "X" hoặc bằng cách nhấn vào Phím Q hoặc ESC
Cải tiến mã và các bước tiếp theo
Mặc dù chương trình ở trên có đầy đủ chức năng, nhưng ta có thể làm một số điều
để cải thiện mã
Để bắt đầu, ta có thể đặt mã while vòng lặp while vào một định nghĩa hàm thay thế:
def event_handler(): for event in pygame.event.get(): if event.type ==QUIT or ( event.type == KEYDOWN and ( event.key == K_ESCAPE or event.key == K_q )): pygame.quit() quit()
Điều này sẽ làm while vòng một neater bit và ngưng tụ, đặc biệt là khi ta thêm nhiều chức năng hơn để trò chơi của ta
Ngoài ra, để bắt đầu làm cho trò chơi bóng bẩy hơn, ta có thể thêm chú thích vào thanh tiêu đề của cửa sổ (hiện đang đọc pygame window ) Điều này ta có thể làm với dòng sau:
pygame.display.set_caption('Our Game')
Ta có thể đặt chuỗi 'Our Game' ở trên thành bất kỳ thứ gì ta muốn gọi là trò chơi.Ngoài ra, ta có thể di chuyển hàm pygame.display.update() vào vòng lặp trò chơi chính
Bây giờ, mã đầy đủ của ta trông như thế này:
our_game.py