1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo dự án lập trình game flappy bird

17 14 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 đề Báo cáo Dự Án Lập Trình Game Flappy Bird
Tác giả Nguyễn Hoàng Nhi, Lê Thị Thảo Nhi, Nguyễn Hoàng Nam
Chuyên ngành Lập Trình Căn Bản
Thể loại Dự án
Định dạng
Số trang 17
Dung lượng 54,78 KB

Nội dung

Trò chơi kết thúc khi con chim va chạm vào bất kỳ vật cản nào, điểm số của người chơi được tính dựa trên số lần vượt qua các ống.Mặc dù đơn giản nhưng Flappy Bird đã tạo ra cơn sốt toàn

Trang 2

DANH SÁCH THÀNH VIÊN

ST

T

1 Nguyễn Hoàng Nhi 31231026989

1 Lên ý tưởng code, viết code cho phần floor và chương trình chính

2 Thuyết trình

3 Viết báo cáo phần giải quyết vấn đề

2 Lê Thị Thảo Nhi 31231026987

1 Lên ý tưởng code, viết code cho phần tạo ống và chuyển động ống

2 Thuyết trình

3 Viết báo cáo phần tìm hiểu thư viện

3 Nguyễn Hoàng Nam 31231025683

1 Lên ý tưởng code, viết code cho phần tạo con chim và chuyển động chim

2 Thuyết trình

3 Viết báo cáo phần giới thiệu

đề tài, kết luận, vẽ sơ đồ thuật toán

Trang 3

MỤC LỤC

1 GIỚI THIỆU ĐỀ TÀI 4

2 TÌM HIỂU THƯ VIỆN 4

2.1 Thư viện PyGame 4

2.2 Thư viện sys 5

2.3 Thư viện random 5

3 GIẢI QUYẾT VẤN ĐỀ 6

3.1 Tạo nền floor và chuyển động của floor 9

3.2 Tạo ống và chuyển động của ống 9

3.3 Tạo chim và chuyển động của chim 10

3.4 Kiểm tra sự va chạm 11

3.5 Hệ thống tính điểm 13

3.6 Chương trình chính 15

4 KẾT LUẬN 16

Trang 4

1 GIỚI THIỆU ĐỀ TÀI

Flappy Bird là một trò chơi điện tử di động đã trở thành hiện tượng toàn cầu trong thời gian ngắn Được tạo ra bởi nhà phát triển trò chơi độc lập người Việt Nam, Nguyễn Hà Đông, trò chơi này đã phát hành vào tháng 5 năm 2013 cho hệ điều hành iOS và sau đó cho Android

Flappy Bird đơn giản nhưng cực kỳ gây nghiện Người chơi điều khiển một con chim nhỏ qua các ống dẫn bằng cách nhấn vào màn hình, và mục tiêu là tránh va chạm vào các ống hoặc bất kỳ vật cản nào khác Trò chơi kết thúc khi con chim va chạm vào bất kỳ vật cản nào, điểm số của người chơi được tính dựa trên số lần vượt qua các ống

Mặc dù đơn giản nhưng Flappy Bird đã tạo ra cơn sốt toàn cầu và thu hút hàng triệu người chơi Đến với dự án lập trình game trong môn Lập trình căn bản này, nhóm chúng em quyết định lựa chọn tạo chương trình cho game “Flappy Bird” dựa trên nền tảng thư viện pygame

Về dự án lập trình game “Flappy Bird”, nhóm chúng em đã tạo ra được một chương trình đáp ứng các yêu cầu cơ bản, người chơi sẽ sử dụng phím cách (Space) trên bàn phím để điều khiển con chim di chuyển lên xuống và vượt qua các chướng ngại vật xuất hiện trên màn hình, cuối cùng hệ thống sẽ ghi nhận tính điểm cho người chơi Tuy nhiên vì giới hạn thời gian chuẩn bị cho dự án cũng như vì khả năng lập trình của các thành viên nên dự án này vẫn chưa hoàn thiện ở phiên bản tốt nhất, cụ thể dự

án vẫn còn thiếu trang màn hình chính bao gồm hướng dẫn trò chơi và nút thoát ra cũng như hệ thống tính điểm vẫn chưa hoàn thiện

2 TÌM HIỂU THƯ VIỆN

2.1 Thư viện PyGame

PyGame 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, cung cấp các công cụ và tính năng cần thiết để tạo ra các trò chơi đồ hoạ 2D đơn giản hoặc phức tạp

Trang 5

PyGame có một số ưu điểm rất nổi bật ví dụ như dễ sử dụng, hỗ trợ đa nền tảng, cung cấp nhiều chức năng về đồ họa và âm thanh, miễn phí và mã nguồn mở cho phép người dùng tự do tải về và sử dụng theo ý muốn

2.2 Thư viện sys

Thư viện sys trong Python cung cấp các chức năng và biến để tương tác với hệ thống hoặc trình thông dịch Python Dưới đây là một số tính năng chính của thư viện sys:

- Thông tin hệ thống: Bằng cách sử dụng sys, bạn có thể truy cập các thông tin về hệ thống như phiên bản Python hiện đang chạy, thông tin về nền tảng và kiến trúc hệ thống

- Tham số dòng lệnh: Thư viện sys cho phép bạn truy cập các tham số được truyền vào từ dòng lệnh khi bạn thực thi một chương trình Python

- Đường dẫn thư mục: Bạn có thể sử dụng sys.path để truy cập và thay đổi danh sách các đường dẫn thư mục được Python sử dụng để tìm kiếm các module và gói

- Kết thúc chương trình: Thư viện sys cung cấp sys.exit() để kết thúc một chương trình Python với một mã trạng thái cụ thể

- Các thông báo và luồng đầu ra: Ta có thể sử dụng sys.stdout và sys.stderr để điều khiển đầu ra chuẩn và đầu ra lỗi của chương trình Python

- Quản lý biến môi trường: sys cho phép truy cập biến môi trường bằng cách sử dụng sys.environ, cho phép bạn đọc và thay đổi các biến môi trường của hệ thống

Thư viện sys là một phần quan trọng của Python và thường được sử dụng trong các ứng dụng liên quan đến quản lý hệ thống, xử lý tham số dòng lệnh và điều khiển luồng dữ liệu trong chương trình Python

2.3 Thư viện random

Thư viện random trong Python cung cấp các chức năng để tạo ra dữ liệu ngẫu nhiên

và thực hiện các hoạt động liên quan đến ngẫu nhiên Dưới đây là một số tính năng chính của thư viện random:

Trang 6

- Tạo số ngẫu nhiên: Thư viện random cho phép bạn tạo ra số ngẫu nhiên, bao gồm các số nguyên và số thực trong một phạm vi nhất định

- Chọn mẫu ngẫu nhiên: Bạn có thể sử dụng random.choice() để chọn một phần tử ngẫu nhiên từ một danh sách hoặc một tuple

- Xáo trộn dữ liệu: random.shuffle() cho phép bạn xáo trộn ngẫu nhiên các phần tử trong một danh sách

- Tạo chuỗi ngẫu nhiên: Thư viện cung cấp random.sample() để tạo ra một mẫu ngẫu nhiên từ một tập hợp các phần tử mà không có sự lặp lại

- Số ngẫu nhiên có phân phối đồng đều: random.uniform() cho phép bạn tạo ra một số thực ngẫu nhiên trong một phạm vi với phân phối đồng đều

- Số nguyên ngẫu nhiên trong một phạm vi: Bạn có thể sử dụng random.randint() để tạo ra một số nguyên ngẫu nhiên trong một phạm vi đã cho

Thư viện random là một công cụ mạnh mẽ để thực hiện các tác vụ liên quan đến ngẫu nhiên trong Python, bao gồm tạo dữ liệu mẫu, kiểm thử và mô phỏng, và được sử dụng rộng rãi trong nhiều ứng dụng, từ trò chơi đến khoa học dữ liệu và máy học

3 GIẢI QUYẾT VẤN ĐỀ

Bài toán đặt ra để tạo được chương trình game Flappy Bird gồm những phần chính sau: Tạo nền floor và chuyển động của floor, tạo ống và chuyển động của ống, tạo con chim và chuyển động của chim, tạo hệ thống tính điểm, kiểm tra sự va chạm giữa ống và chim Sau đây là tóm tắt về quy trình thực hiện trò chơi của nhóm:

Khởi tạo các biến và tải các tài nguyên cần thiết (hình ảnh, âm thanh)

Tạo vòng lặp chính của trò chơi:

Xử lý sự kiện:

- Nếu người chơi nhấn phím SPACE:

+ Nếu trò chơi đang diễn ra:

Trang 7

* Chim bay lên trên

* Phát âm thanh

+ Nếu trò chơi đã kết thúc:

* Bắt đầu trò chơi mới

* Xóa danh sách ống và reset điểm số

- Tạo ống mới mỗi khoảng thời gian

- Xử lý sự kiện birdflap để tạo hiệu ứng hoạt hình cho chim Cập nhật vị trí và hiển thị các đối tượng:

- Nếu trò chơi đang diễn ra:

+ Chim di chuyển xuống dưới do tác động của trọng lực + Chim xoay và hiển thị trên màn hình

+ Di chuyển và hiển thị các ống trên màn hình

+ Tính điểm và hiển thị điểm số

+ Kiểm tra va chạm giữa chim và các ống

- Nếu trò chơi đã kết thúc:

+ Hiển thị màn hình kết thúc trò chơi

+ Cập nhật điểm số cao nhất

+ Hiển thị điểm số và điểm số cao nhất

Di chuyển và hiển thị sàn:

- Di chuyển sàn sang trái để tạo hiệu ứng chạy liên tục

- Vẽ sàn lên màn hình

Trang 8

Cập nhật màn hình:

- Cập nhật màn hình hiển thị với tất cả các thay đổi mới

- Giới hạn FPS của trò chơi

Bắt đầu

Hệ thống giao diện chơi game

Hệ thống tạo chướng ngại vật Kiểm tra ấn phím “Space”

Hệ thống dịch chướng ngại vật từ

phải sang trái

Bird chạm chướng ngại vật

Lưu điểm

Cộng điểm

Chuyển sang giao diện lưu điểm

Bird nhảy lên

Bird rơi xuống đất Kiểm tra Bird chạm chướng ngại vật

YES

NO

Player ấn phím

“Space”

YES

NO Thuật toán hoạt động “chơi game”

Trang 9

3.1 Tạo nền floor và chuyển động của floor

Ý tưởng chính: Tạo hai nền floor và cho chúng di chuyển liên tục từ phải sang trái,

nếu một floor có tọa độ theo trục hoành ở ngoài màn hình trò chơi thì floor còn lại sẽ

tự động được set về tọa độ 0, tiếp nối như vậy để tạo thành vòng lặp chuyển động liên tục

Code:

floor = pygame image load ( 'Picture/floor.png' ) convert ()

floor = pygame transform scale2x ( floor )

floor_x_position = 0

def draw_floor ():

screen blit ( floor ,( floor_x_position , 650 ))

screen blit ( floor ,( floor_x_position +432 , 650 ))

floor_x_position -=

draw_floor ()

if floor_x_position <= - 432 : #Tạo hàm if để khi floor 2 chạy xong thì floor 1 sẽ đổi vị trí ra sau

floor_x_position

3.2 Tạo ống và chuyển động của ống

Ý tưởng chính: Gồm hai bước lớn đó chính là tạo ống và chuyển động cho ống Để

tạo ống, trước tiên nhóm sẽ chèn hình ảnh ống lên và đồng thời tạo ra một list rỗng, list này sau này sẽ được dùng để chứa các ống được tạo ra Sau đó, nhóm sẽ tạo ra một hàm create_pipe để tạo ống Các ống sẽ được tạo ra với chiều cao ngẫu nhiên và đồng thời bọn em sẽ get rect cho các ống đó, tức là bao một hình chữ nhật xung quanh vật thể là cái ống để phục vụ cho mục đích phát hiện sự va chạm giữa con chim và ống Sau khi đã tạo ống xong, nhóm sẽ tạo ra một hàm move_pipe để tạo chuyển động cho ống Với hàm này thì tất cả các ống được tạo ra sẽ di chuyển sang trái 5 đơn vị

Code:

pipe_surface pygame image load ( 'Picture/pipe-green.png' ) convert ()

pipe_surface pygame transform scale2x ( pipe_surface )

pipe_list = []

Trang 10

spawn_pipe pygame USEREVENT

pygame time set_timer ( spawn_pipe , 2000 )

pipe_height = [ 300 , 400 , 500 ]

def create_pipe ():

random_pipe_position random choice ( pipe_height )

bottom_pipe pipe_surface get_rect ( midtop ( 500 , random_pipe_position )) top_pipe pipe_surface get_rect ( midtop ( 500 , random_pipe_position

-650 ))

return bottom_pipe , top_pipe

def move_pipe ( pipes ):

for pipe in pipes :

pipe centerx -=

return pipes

def draw_pipe ( pipes ):

for pipe in pipes :

if pipe bottom >= 600 :

screen blit ( pipe_surface , pipe )

else :

flip_pipe pygame transform flip ( pipe_surface , False , True )

screen blit ( flip_pipe , pipe )

3.3 Tạo chim và chuyển động của chim

Ý tưởng chính: Nhóm sẽ tải lên 3 hình ảnh ở ba trạng thái của chim là bird_down,

bird_mid và bird_up (tức là cánh của chim hướng xuống, ở giữa, và hướng lên) Và khi vào chương trình chính, tụi em sẽ kiểm tra xem chỉ số của hình ảnh chim

(bird_index) có nhỏ hơn 2 không Nếu bird_index nhỏ hơn 2, nghĩa là chúng ta vẫn chưa đạt tới hình ảnh cuối cùng trong loạt hình ảnh của chim, chúng ta tăng giá trị của bird_index lên 1, để chuyển sang hình ảnh tiếp theo trong chuỗi Ngược lại, nếu bird_index đã là 2 (nghĩa là chúng ta đang ở hình ảnh cuối cùng trong loạt), chúng ta đặt bird_index về 0, để quay lại hình ảnh đầu tiên trong chuỗi

Code:

def rotate_bird ( bird1 ):

Trang 11

new_bird pygame transform rotozoom ( bird1 , bird_move * , )

return new_bird

def bird_animation ():

new_bird bird_list [ bird_index ]

new_bird_rect new_bird get_rect ( center ( 100 , bird_rect centery )) return new_bird , new_bird_rect

gravity = 0.15

bird_move = 0

bird_down = pygame transform scale2x ( pygame image load ( 'Picture/yellowbird-downflap.png' ) convert_alpha ())

bird_mid pygame transform scale2x ( pygame image load ( 'Picture/yellowbird-midflap.png' ) convert_alpha ())

bird_up = pygame transform scale2x ( pygame image load ( 'Picture/yellowbird-upflap.png' ) convert_alpha ())

bird_list = [ bird_down , bird_mid , bird_up ]

bird_index

bird bird_list [ bird_index ]

bird_rect = bird get_rect ( center ( 100 , 384 ))

birdflap pygame USEREVENT +1

pygame time set_timer ( birdflap , 700 )

3.4 Kiểm tra sự va chạm

Ý tưởng chính: Tạo khung hình chữ nhật bao xung quanh con chim và các ống, nếu

có sự va chạm giữa hai hình chữ nhật thì game sẽ dừng lại Hoặc nếu con chim bay quá cao hoặc quá thấp chạm vào khung màn hình chính trò chơi thì game cũng sẽ dừng lại

Trang 12

Bird chạm đất

Bird chạm trụ

Trả về kết quả Thua Trả về kết quả chưa Thua

YES

NO

NO

YES

Thuật toán “Kiểm tra thua”: Thuật toán này

sẽ so sánh toạ độ của Bird so với đất và trụ

Nếu như bird chạm 1 trong 2 đối tượng trên

thì sẽ trả về kết quả “Thua” để xử lý phía

sau

Bắt đầu

Kết thúc

Trang 13

def check_collision ( pipes ):

for pipe in pipes :

if bird_rect colliderect ( pipe ):

hit_sound play ()

return False

if bird_rect top <= 75 or bird_rect bottom >= 650 :

return False

return True

3.5 Hệ thống tính điểm

Ý tưởng: Để tạo nên hệ thống tính điểm, nhóm sẽ tạo ra hai hàm, một hàm để hiển

thị điểm theo trạng thái trò chơi (main game hoặc game over), hàm còn lại dùng tính điểm cao nhất

Trang 14

Thuật toán “ Xem điểm”

Bắt đầu

Lấy điểm cao nhất đã lưu lại

So sánh với điểm sau lượt chơi

So sánh điểm

Lưu điểm lại, thay thành điểm cao nhất

Hệ thống tạo giao diện xem điểm

LỚN HƠN

Code:

def display_score ( game_state ):

if game_state == 'main game' :

score_surface game_font render ( str ( int ( score )), True ,( 255 , 255 , 255 )) score_rect = score_surface get_rect ( center ( 216 , 100 ))

screen blit ( score_surface , score_rect )

if game_state == 'game over' :

score_surface game_font render ( f'Score: {int ( score ) } , True ,

( 255 , 255 , 255 ))

score_rect = score_surface get_rect ( center ( 216 , 100 ))

screen blit ( score_surface , score_rect )

Trang 15

high_score_surface game_font render ( f'High Score:

{int ( high_score ) ' True ,( 255 , 255 , 255 ))

high_score_rect high_score_surface get_rect ( center = ( 216 , 630 )) screen blit ( high_score_surface , high_score_rect )

def update_high_score ( score , high_score ):

if score high_score :

high_score = score

return high_score

score = 0

high_score

3.6 Chương trình chính

Ở phần chương trình chính, nhóm sẽ tổng hợp và liên kết các ý tưởng ở trên lại để hoàn thiện chương trình như bên dưới

while True :

for event in pygame event get ():

if event type == pygame QUIT :

pygame quit ()

sys exit ()

if event type == pygame KEYDOWN :

if event key == pygame K_SPACE and game_active :

bird_move = 0

bird_move =

sound play ()

if event key == pygame K_SPACE and game_active == False :

game_active = True

pipe_list clear ()

bird_rect center ( 100 , 384 )

bird_move = 0

score

if event type == spawn_pipe :

pipe_list extend ( create_pipe ())

print ( create_pipe )

if event type == birdflap :

if bird_index < 2

bird_index += 1

Trang 16

else :

bird_index

bird , bird_rect = bird_animation ()

screen blit ( background ,( 0 0 ))

if game_active :

bird_move += gravity

rotated_bird = rotate_bird ( bird )

bird_rect centery += bird_move

screen blit ( rotated_bird , bird_rect )

game_active check_collision ( pipe_list )

pipe_list move_pipe ( pipe_list )

draw_pipe ( pipe_list )

score += 0.01

display_score ( 'main game' )

point_countdown -=

if point_countdown <= 0

point_sound play ()

point_countdown = 200

else :

screen blit ( gameover_screen , gameover_rect )

high_score = update_high_score ( score , high_score )

display_score ( 'game over' )

floor_x_position -=

draw_floor ()

if floor_x_position <= 432 :

floor_x_position

pygame display update ()

clock tick ( 70 )

4 KẾT LUẬN

Cuối cùng, nhóm đã hoàn thành dự án game “Flappy Bird” nhưng vẫn còn một số hạn chế có thể phát triển thêm Trong đó có thể kể đến việc phát triển tạo nên một màn hình chính bao gồm nút Bắt đầu game, Hướng dẫn chơi và Thoát game để tăng

sự tương tác giữa người chơi và trò chơi Ngoài ra, hệ thống tính điểm của chương trình này vẫn chưa hoàn thiện tốt nhất vì vẫn đang tính theo cơ chế chim bay được càng lâu thì điểm càng cao thay vì tính điểm theo số lần vượt qua được ống

Ngày đăng: 22/04/2024, 10:52

TỪ KHÓA LIÊN QUAN

w