Python có những úng dụng phổ biến như lậptrình web, phát triển trò chơi thông qua thư viện Pygame, khoa học dữ liệu.Trong quá trình tìm hiểu về Python em thấy hứng thú với các ứng dụng g
Trang 1ỦY BAN NHÂN DÂN THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC SÀI GÒN KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO ĐỒ ÁN NGÔN NGỮ LẬP TRÌNH PYTHON
ĐỀ TÀI: Xây dựng game Bơi Mèo
Giảng viên hướng dẫn : Trịnh Tấn Đạt
Sinh viên thực hiện : Đào Thị Nhi
MSSV : 3120410370
Trang 2
NHẬN XÉT ĐÁNH GIÁ CỦA GIẢNG VIÊN
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
….………
Trang 3LỜI CẢM ƠN
Trước hết, em xin gửi lời cảm ơn đối với tất cả các thầy cô giáo trường Đại Học Sài Gòn nói chung và các thầy cô khoa Công Nghệ Thông Tin đã tậntâm truyền đạt kiến thức rất nhiều kiến thức cho em Em xin tỏ lòng biết ơn đến thầy giáo Trịnh Tấn Đạt đã truyền đạt kiến thức chuyên môn vàhỗ trợ cho
em thực hiện đồ án lần này
Trong suốt quá trình hoàn thành đồ án, dù đã cố gắng nhưng vì thời gian có hạn nên sản phẩm chắc chắn sẽ còn những thiếu sót Nên em rất mongnhận được sự góp ý của thầy và các bạn, để em rút ra được kinh nhiệm cho những sản phẩm sau này của em Em xin chân thành cảm ơn !
Trang 4MỤC LỤC
PHẦN I MỞ ĐẦU 1
1 Giới thiệu đề tài 1
2 Lý do chọn đề tài 1
3 Mục đích - mục tiêu của đề tài 1
PHẦN II NỘI DUNG 3
1 Đôi nét về game Bơi Mèo 3
2 Giới thiệu vấn đề 3
3 Luật chơi 3
4 Môi trường cài đặt 3
5 Xây dựng game 3
5.1 Cài đặt Pygame và các biến cho trò chơi 4
5.2 Chèn background, trần và sàn 6
5.3 Tạo mèo 7
5.4 Tạo đá 10
5.5 Tạo xu 12
5.6 Thêm rương xu 12
5.7 Thêm cá 14
5.8 Thêm cá mập 14
5.9 Hàm kiểm tra va chạm 16
5.10 Hàm hiển thị cách tính điểm 16
5.11 Hàm hiển thị điểm 17
5.12 Xử lí tăng tốc độ của game sau một số điểm nhất định 18
5.13 Hàm khi bắt đầu game 18
5.14 Xử lí khi thua 19
6 Một số hình ảnh của game 20
7 Kết luận 23
Trang 5PHẦN I MỞ ĐẦU
1 Giới thiệu đề tài
Xây dựng trò chơi Bơi Mèo bằng ngôn ngữ lập trình Python
2 Lý do chọn đề tài
Hiện nay, ngành Công nghệ thông tin đang ngày càng phát triển nhanhchóng đóng vai trò quan trọng trong phát triển xã hội Nó không chỉ thúc đẩynhanh chóng quá trình tăng trưởng kinh tế, mà còn kéo theo sự biến đổi trongphương thức sáng tạo của cải, trong lối sống và tư duy của con người Côngnghệ thông tin có nhiều ứng dụng trong cuộc sống như trong lĩnh vực kinh tế,quốc phòng, công tác quản lý, giải trí
Python là ngôn ngữ lập trình nguồn mở phổ biến được sử dụng cho cảchương trình độc lập và ứng dụng trong nhiều lĩnh vực khác nhau Nó miễnphí, mạng mẽ và dễ sử dụng Python có những úng dụng phổ biến như lậptrình web, phát triển trò chơi thông qua thư viện Pygame, khoa học dữ liệu.Trong quá trình tìm hiểu về Python em thấy hứng thú với các ứng dụng game được lập trình bằng Python sử dụng thư viện 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 Có rẩt nhiều tựa game đời đầu đã được tạo nên
từ ngôn ngữ Python, nên em đã quyết định sử dụng thư viện Pygame của Python để xây dựng game Bơi Mèo
3 Mục đích - mục tiêu của đề tài.
- Mục đích:
+Nắm chắc được kỹ năng và kiến thức về lập trình
+Tìm hiểu về thư viện Pygame trong ngôn ngữ lập trình Python.+Củng cố, áp dụng, nâng cao kiến thức đã được học
+Nắm bắt được quy trình làm game cơ bản
Trang 6- Mục tiêu:
+Vận dụng được tính chất của lập trình hướng đối tượng
+Sử dụng thư viện Pygame vào việc xây dựng game Bơi Mèo
Trang 7PHẦN II NỘI DUNG
1 Đôi nét về game Bơi Mèo
Bơi Mèo là một game được trình bày theo phong cách scroller (phong cách game với các đối tượng được nhìn thấy ở mặt bên (side-view) và di chuyển từ cạnh trái sang cạnh phải của màn hình), trong đó ngườichơi điều khiển một com mèo, cố gắng vượt qua các chướng ngại vật dướibiển mà không chạm vào chúng Game được em thiết kế dựa trên gameFlappy Bird và cải tiến thêm một số tính năng
side-2 Giới thiệu vấn đề
Yêu cầu chương trình của chúng ta ở đây là làm sao thiết kế được mộtchương trình game gần giống như Flappy Bird trên dựa vào các phương pháplập trình đã học Cụ thể là sử dụng phương pháp lập trình Python đang học kếthợp với các mẫu thiết kế và các giải thuật toán học
3 Luật chơi
- Mục tiêu của Bơi Mèo là ăn càng nhiều xu càng tốt bằng cách điều
khiển chú mèo vượt qua các chướng ngại vật dưới biển
- Các chướng ngại vật sẽ di chuyển từ trái sang phải, chú mèo sẽ rơi tự
do theo trọng lực của trái đất, người chơi nhấn và giữ phím SPACE để giúpchú mèo bơi lên, nếu chạm vào chướng ngại vật hoặc rơi xuống đất hoặc bơiquá cao, người chơi phải chơi lại từ đầu
4 Môi trường cài đặt
- Visual Studio Code (64 bit)
- Điều đầu tiên cần làm để lập trình trò chơi trong Python là cài đặt đun Pygame Để thực hiện cài cho mô-đun này, có thể nhập câu lệnh như sautrong cdm: pip install pygame
mô-5 Xây dựng game
Trang 85.1 Cài đặt Pygame và các biến cho trò chơi
Khai báo thư viện pygame, randint.
Hàm init() khởi tạo tất cả các mô-đun Pygame đã được nhập (trả về một
bộ giá trị cho biết việc thành công và thất bại của quá trình khởi tạo)
Thêm font chữ vào game.
Khởi tạo biến
Trang 9#v trí cá ị
fish1_x_x rock1_1_x =
fish1_x rock1_1_x rock1_x = + - 200
fish2_x fish1_x = + 300
fish3_x rock1_1_x rock2_x = + + 160
fish4_x rock1_1_x rock2_x = + + 160
fish5_x rock1_1_x rock3_x = + + 440
fish6_x rock1_1_x rock4_x = + + 250
coin11_x coin10_x = ; coin12_x coin11_x coin_kc = +
Trang 10Thêm âm thanh
#Chèn âm thanh
bongbong_sound= pygame mixer Sound ( 'sound\boi.wav')
death_sound= pygame mixer Sound ( 'sound\death.wav' )
score_sound= pygame mixer Sound ( 'sound\coin.ogg' )
Khởi tạo màn hình game
#Tiêu đè và Icon game
pygame display set_caption ( 'B i Mèo' ơ )
icon= pygame image load ( 'img/catout.jpg')
pygame display set_icon (icon)
#C a s game ử ổ
screen= pygame display set_mode (( 432 , 768 ))
Sử dụng pygame.display.set_caption() để đặt tiêu đề cho cửa sổ game
Sử dụng pygame.display.set_icon() để cài đặt icon cho cửa sổ game
Để tạo cửa số game, ta dùng pygame.display.set_mode() và truyền vàomột tuple là chiều rộng và dài của cửa sổ game, nó trả về dạng surface, dùngbiến screen để lưu lại
Vòng lặp while
running=True
a_key_down=False
while running:
for event in pygame event get ():
if event type== pygame QUIT:
running = False
Cho vòng lặp for nếu event.type = QUIT là người chơi nhấn nút thoát,
sẽ gán running = False và vòng lặp while sẽ kết thúc
pygame.display.update(): dùng để vẽ lại màn hình game để lưu các thayđổi trong vòng lặp while
5.2 Chèn background, trần và sàn
bg= pygame image load ( 'img\bg.jpg')
bg = pygame transform scale ( bg ,( 432 , 790 ))
bg_x=
top= pygame image load ( 'img/top.jpg')
top = pygame transform scale ( top ,( 432 , 150 ))
Trang 11fl = pygame transform scale ( fl ,( 432 , 200 ))
top_x=
fl_x=
Tải ảnh background, trần và sàn của trò chơi lưu vào biến bg, top và fl
Sử dụng pygame.transform.scale() để tăng kích thước của hình bằngcửa sổ game Biến fl_x, top_x, bg_x là giá trị tọa độ x ban đầu củabackground, trần và sàn
Thêm background, trần và floor vào cửa sổ game trong vòng lặp while
top1 screen = blit ( top,( fl_x ,- 20 ))
top2 screen = blit ( top,(fl_x + 430 ,- 20 ))
if top_x==- 432 :
top_x= 0
Sử dụng hàm blit() để chèn một surface này lên một surface khác, tham
số truyền vào là surface muốn chèn, sau đó là một tuple chứa vị trí muốnchèn
Để cho sàn chuyển động về bên trái, mỗi vòng lặp while vị trí tọa độ xcủa sàn fl_x sẽ giảm đi một v_fl (là vận tốc của sàn) Tuy nhiên đến một lúcnào đó sàn sẽ biến mất nên ta phải thêm sàn thứ 2 vào sau sàn thứ nhất vị trítọa độ x là fl_x+432 trong đó 432 là chiều ngang của cửa sổ game Lệnh if là
để kiểm tra nếu sàn thứ nhất chạy hết chiều ngang màn hình thì đặt lại tọa độ
x của sàn để sàn thứ nhất nối sau sàn thứ 2 Background và trần cũng tương tựvậy
Trang 125.3 Tạo mèo
#Đ a cat vào ư
cat_out= pygame image load ( r'img \c atout.jpg')
cat_out= pygame transform scale (cat_out,( 95 , 80 ))
cat_mid1= pygame image load ( r'img \c atmid1.jpg')
cat_mid1 = pygame transform scale ( cat_mid1 ,( 95 , 80 ))
cat_mid2= pygame image load ( r'img \c atmid2.jpg')
cat_mid2 = pygame transform scale ( cat_mid2 ,( 95 , 80 ))
cat_in= pygame image load ( 'img \c atin.jpg')
cat_in = pygame transform scale ( cat_in ,( 95 , 80 ))
cat_list =[ cat_out , cat_mid1 , cat_mid2 , cat_in ]
cat_index=
cat=cat_list cat_index [ ]
cat_hcn cat = get_rect (center=( x_cat y_cat , ))
Lần lượt tải các ảnh của con mèo và gán vào biến
Tạo một list chứa các biến vừa tạo, tạo biến cat_index để chứa vị trí cácbiến trong cat_list, giá trị mặc định là 0
Gán biến cat là một biến trong list
Tạo biến cat_hcn để lưu vị trí của của mèo
Hàm xử lý cho mèo đạp chân
#Hàm mèo b i ơ
def cat_animation ():
new_cat cat_list cat_index = [ ]
new_cat_rect = new_cat get_rect (center= ( x_cat y_cat , ))
return new_cat, new_cat_rect
Hàm trả về một biến cat mới và một biến cat_hcn
Tạo timer cho mèo
#T o time cho mèo ạ
cat_sim = pygame USEREVENT
pygame time set_timer ( cat_sim , 300 )
Khi mèo bơi thì chân sẽ liên tục đập, trạng thái liên tục thay đổi, để môphỏng điều này, ta sẽ tạo ta sự kiện mới tên là cat_sim, sau đó set_timer cho
nó để sau 300 mili giây sự kiện này sẽ được thêm và hàng đợi sự kiện củapygame một lần
Xử lí sự kiện đạp chân
Trang 13cat, cat_rect = cat_animation ()
Trong vòng lặp for xử lý sự kiện cat_sim do người dùng tạo ra, ta sẽthay đổi ảnh của mèo liên tục để tạo hiệu ứng chuyển động đạp chân Bằngcách sử dụng lệnh if để cho biến cat_index thay đổi giá trị từ 0 đến 3 để duyệthết list cat_list đã tạo từ trước Nếu đã duyệt hết thì gán lại giá trị cat_index =
0 để duyệt lại từ đầu
Trong vòng lặp while
Xử lý sự kiện người chơi ấn và giữ nút SPACE
for event in pygame event get ():
if event type== pygame KEYDOWN:
if event.key== pygame K_SPACE and game_play:
if event type == pygame KEYUP:
if event.key == pygame K_SPACE and game_play :
Nếu người dùng nhấn và giữ nút SPACE và biến game_play = True thì
ta sẽ gán a_key_down=True, gọi biến âm thanh bơi để mỗi lần nhấn phímSPACE sẽ phát ra tiếng bơi Ra khỏi vòng lặp for ta dùng lệnh if kiểm tra, nếua_key_down = True, tạm ngưng chuyển động của mèo ( cat_movement = 0 )
và sau đó lấy tọa độ y của mèo trừ 3.5, mèo sẽ bơi lên trên
Trang 14Nếu người dùng nhấn nút SPACE và biến game_play = False thì ta sẽgán lại biến game_play = True để người chơi bắt đầu ván mới Và đặt lại giátrị cat_movement =0, cat_hcn về lại vị trí ban đầu, điểm=0.
Nếu người dùng thả nút SPACE thì đặt lại giá trị cat_movement =0,a_key_down=False
Đưa mèo vào
Câu lệnh cuối là với mỗi vòng lặp while cập nhật vị trí cat_hcn, trong
đó centery là lấy vị trí tọa độ y của cat cộng với cat_movement
5.4 Tạo đá
#Đ a đá vào ư
rock1_img= pygame image load ( r'img \r ock1.jpg')
rock1_d_img= pygame image load ( r'img \r ock1_d.jpg')
rock2_img= pygame image load ( r'img \r ock2.jpg')
rock2_d_img= pygame image load ( r'img \r ock2_d.jpg')
rock3_img= pygame image load ( r'img \r ock1.jpg')
rock3_d_img= pygame image load ( r'img \r ock1_d.jpg')
rock4_img= pygame image load ( r'img \r ock2.jpg')
rock4_d_img= pygame image load ( r'img \r ock2_d.jpg')
Tải hình ảnh đá và đá đối diện lưu vào biến
Trang 15rock4 screen = blit ( rock4_img,( rock4_x ,- 190 ))
rock5_img = pygame transform scale ( rock4_img,( 160 , 200 ))
rock5 screen = blit ( rock5_img,( rock5_x ,- 40 ))
rock3_d_img = pygame transform scale ( rock3_d_img ,( 100 , 400 ))
rock3_d screen = blit ( rock3_d_img ,( rock3_x , 570 ))
rock4_d_img = pygame transform scale ( rock4_d_img ,( 60 , rock2_height )) rock4_d screen = blit ( rock4_d_img ,( rock4_x + 200 , 550 ))
rock5_d_img = pygame transform scale ( rock1_d_img ,( 160 , 290 ))
rock5_d screen = blit ( rock5_d_img ,( rock5_x + 200 , 570 ))
Ép đá theo kích thước chiều dài đã cho khai báo từ trước, chiều rộng đátùy ý Chèn đá vào màn hình game ở vị trí tọa độ x cho trước và tọa độ y tùychỉnh
Ép đá đối diện tương tự như trên
Trang 16Đá di chuyển đến một lúc sẽ không còn trên màn hình, nên ta sẽ tạo đámới khi đá cũ biến mất khỏi màn hình (rock_x < - 500) Đá mới sẽ thêm vào
vị trí tọa độ x = rock1_1_x
5.5 Tạo xu
#thêm coin
coin_img= pygame image load ( r'img/coin.jpg')
coin_img = pygame transform scale ( coin_img ,( 50 , 50 ))
Tải hình ảnh xu và lưu vào biến, ép kích thước xu rộng=50, dài=50
Trong vòng lặp while
#đ a coin vào ư
coin1_x-=rock_velocity
coin1 screen = blit ( coin_img,(coin1_x coin_y)) ,
if cat_hcn colliderect (coin1):
coin1_x rock1_1_x rock1_x = + + 250
score+= 1 ; score_sound play ()
if coin1_x<- 50 :
coin1_x rock1_1_x = + rock1_x + 250
Cho coin di chuyển sang trái bằng cách trừ đi vận tốc di chuyển của đá,bởi vì coin và đá di chuyển bằng nhau Gán coin vào màn hình với tọa độ x và
y cho trước
Kiểm tra va chạm giữa coin và mèo
Sử dụng hàm colliderect() để kiểm tra va chạm giữa hai hình chữ nhật.Nếu có va chạm thì di chuyển coin đến vị trí tiếp theo Biến điểm cộng thêm
1, gọi âm thanh score_sound
Nếu không va chạm thì cũng chuyển xu đến vị trí sẽ xuất hiện tiếp theo.Các đồng xu khác cũng tương tự như vậy
5.6 Thêm rương xu
def ruong_animation ():
new_ruong ruong_list ruong_index = [ ]
Trang 17#thêm r ươ ng
ruong1_img= pygame image load ( r'img/ruong1.jpg')
ruong1_img = pygame transform scale ( ruong1_img ,( 80 , 60 ))
ruong2_img= pygame image load ( r'img/ruong.jpg')
ruong2_img = pygame transform scale ( ruong2_img ,( 80 , 60 ))
ruong_list =[ ruong1_img ruong2_img , ]
ruong_index=
ruong ruong_list ruong_index = [ ]
#t o time cho r ạ ươ ng
ruong_sim = pygame USEREVENT
pygame time set_timer ( ruong_sim , 500 )
for event in pygame event get ():
ruong1_x rock2_x coin_kc = + *
if cat_hcn colliderect (ruong1):
ruong1_x rock1_1_x = + rock2_x coin_kc + * 13
score+= 10 ; score_sound play ()
Gọi hàm ruong_animation() để tạo hiệu ứng cho rương Gán rương vàomàn hình theo vị trí cho trước Để rương di chuyển sang trái bằng cách lấy vịtrí rương trừ cho vận tốc bằng vận tốc di chuyển của đá
Kiểm tra nếu rương đi ra khỏi khung hình (ruong_x<-100), đặt lại vị tríban đầu của rương
Kiểm tra mèo có đụng vào rương bằng hàm colliderect(), nếu đụng vàothì gán vị trí rương bằng vị trí sẽ xuất hiện tiếp theo Tăng biến điểm thêm 10
Trang 18Các rương khác cũng tương tự vậy.
5.7 Thêm cá
fisha_img= pygame image load ( r'img \f ish.jpg')
fisha_img= pygame transform scale (fisha_img,( 70 , 70 ))
Tải hình ảnh cá lưu vào biến
Trong vòng lặp while
fish1=screen blit ( fish_img ,( fish1_x + 10 , fish1_y + 10 ))
fish2 screen = blit ( fish_img,(fish2_x + 10 , fish2_y + 10 ))
fish3 screen = blit ( fish_img,(fish3_x + 10 , fish3_y + 10 ))
fish4 screen = blit ( fish_img,(fish4_x + 10 , fish4_y + 10 ))
fish5 screen = blit ( fish_img,(fish5_x + 10 , fish5_y + 10 ))
fish6 screen = blit ( fish_img,(fish6_x + 10 , fish6_y + 10 ))
Thêm cá vào màn hình ở vị trí cho trước
fish6_x rock1_1_x rock4_x = + + 200
Kiểm tra nếu cá đi ra khỏi khung hình (fish_x<-100), đặt lại vị trí banđầu của cá
5.8 Thêm cá mập