Trong thế giới lập trình game, Flappy Bird đã trở thành một biểu tượng kinh điển. Bạn muốn tự tay tạo ra một phiên bản Flappy Bird của riêng mình bằng ngôn ngữ Python? Hãy cùng ICANTECH tìm hiểu các bước lập trình Flappy Bird chi tiết dưới đây.
1. Phân tích trò chơi Flappy Bird
Trước khi bắt đầu lập trình flappy bird bằng python , chúng ta cùng phân tích các yếu tố cơ bản của trò chơi này:
- Nhân vật chính là một chú chim và các yếu tố khác bao gồm ống nước, hình nền và sàn.
- Trò chơi có nhiều cặp ống nước. Mỗi cặp ống nước được xếp thẳng hàng và có khoảng trống ở giữa.
- Chú chim cần vượt qua khoảng trống giữa các cặp ống nước. Mỗi lần vượt qua, người chơi sẽ được cộng điểm.
- Nếu chú chim va chạm với ống nước, sàn hoặc bay quá cao, người chơi sẽ thua cuộc.
Với phân tích trò chơi như trên, chúng ta cần thực hiện các bước sau để lập trình Flappy Bird bằng Python:
- Bước 1: Khởi tạo và tạo hình nền trò chơi.
- Bước 2: Lập trình sàn cố định.
- Bước 3: Lập trình chuyển động của nhân vật chim.
- Bước 4: Lập trình các cặp ống nước.
- Bước 5: Xử lý các sự kiện va chạm.
- Bước 6: Thông báo thua cuộc và chơi lại.
- Bước 7: Lập trình tính điểm và cấp độ.
- Bước 8: Thêm âm thanh vào trò chơi.
2. Hướng dẫn lập trình Flappy Bird bằng Python dành cho người mới bắt đầu
2.1. Khởi tạo và tạo hình nền trò chơi
Trước tiên, chúng ta sẽ tạo màn hình trò chơi Flappy Bird với kích thước 400x768. Sau đó, khai báo thời gian và tải hình nền game. Cuối cùng, thay đổi kích thước hình nền để phù hợp với màn hình.
import pygame, sys, random pygame.init() WHITE = (255, 255, 255) screenWidth = 400 screenHeight = 768 screen = pygame.display.set_mode([screenWidth, screenHeight]) pygame.display.set_caption('Flappy Bird') clock = pygame.time.Clock() gameFont = pygame.font.SysFont('Arial', 20) # Tải hình nền bg = pygame.image.load('https://nanado.edu.vn/uploads/images/blog/admin/2024/01/19/huong-dan-cach-lap-trinh-game-flappy-bird-bang-python-1705615881.webp').convert() bg = pygame.transform.scale(bg, (screenWidth, screenHeight)) bg_rect = bg.get_rect() bg_rect.center = (screenWidth/2, screenHeight/2)
Sau khi hoàn thành khởi tạo màn hình, bạn sẽ có một màn hình trò chơi như sau:
2.2. Lập trình sàn cố định
Trong trò chơi Flappy Bird, sàn luôn di chuyển. Chúng ta sẽ vẽ hai hình ảnh sàn lên màn hình trò chơi, một sàn bên phải và một sàn bên trái.
# Vẽ sàn floor = pygame.image.load('assets/flappy-bird/floor_2.png') floor_x = 0 # Sàn di chuyển về bên trái floor_x -= 1 if (floor_x = -screenWidth): floor_x = 0 screen.blit(floor, (floor_x, screenHeight-130)) # Vẽ sàn bên trái screen.blit(floor, (floor_x+screenWidth, screenHeight-130)) # Vẽ sàn bên phải nối theo
2.3. Lập trình chuyển động của nhân vật chim
Sau khi hoàn thành lập trình hình nền, chúng ta sẽ lập trình nhân vật chính của trò chơi - chú chim Flappy. Để điều khiển chú chim, chúng ta sẽ thực hiện các bước sau:
- Tải 3 hình ảnh tương ứng với 3 trạng thái của chim khi vỗ cánh.
- Khai báo tọa độ x của chim và danh sách các trạng thái khi chim vỗ cánh.
- Sau mỗi lần lặp, chim sẽ thay đổi trạng thái hiển thị trên màn hình.
# Vẽ con chim bird_move += gravity bird_rect.centery += bird_move screen.blit(bird, bird_rect) # Tạo chim vỗ cánh bird_down = pygame.image.load('assets/flappy-bird/bird-down.png').convert_alpha() bird_mid = pygame.image.load('assets/flappy-bird/bird-mid.png').convert_alpha() bird_up = pygame.image.load('assets/flappy-bird/bird-up.png').convert_alpha() bird_down = pygame.transform.scale(bird_down, (50, 38)) bird_mid = pygame.transform.scale(bird_mid, (50, 38)) bird_up = pygame.transform.scale(bird_up, (50, 38)) bird_x = 100 bird_index = 0 bird_list = [bird_down, bird_mid, bird_up] bird = bird_list[bird_index] bird_rect = bird.get_rect() bird_rect.center = (bird_x, screenHeight/2) # Tạo timer - sự kiện chim vỗ cánh (đổi trạng thái) bird_flap = pygame.USEREVENT + 1 pygame.time.set_timer(bird_flap, 200) # 0.2 giây sinh 1 # Bird di chuyển gravity = 0.15 bird_move = 0
2.5. Lập trình cặp ống nước
Tiếp theo, chúng ta sẽ lập trình ống nước trong trò chơi. Cần thực hiện các bước sau:
- Vẽ ống nước bên dưới và ống nước bên trên lên màn hình.
- Ống nước bên dưới nằm bên phải màn hình.
- Ống nước bên trên nằm ngược với ống nước bên dưới và cách ống nước bên dưới 300 đơn vị.
- Tạo độ y của ống nước theo giá trị ngẫu nhiên.
# Vẽ ống nước score = 0 for item in pipe_list: item[0] -= 5 pipe_below_rect.midtop = (item[0], item[1]) screen.blit(pipe_below, pipe_below_rect) pipe_above_rect.midbottom = (item[0], item[2]) screen.blit(pipe_above, pipe_above_rect) # Tạo ống nước pipe_above = pygame.image.load('assets/flappy-bird/pipe_above.png') pipe_below = pygame.image.load('assets/flappy-bird/pipe_below.png') pipe_above_rect = pipe_above.get_rect() pipe_below_rect = pipe_below.get_rect() pipe_distance = 300 pipe_below_height = [450, 500, 550, 600] pipe_below_midtop_pos = random.choice(pipe_below_height) pipe_one_list = [screenWidth, pipe_below_midtop_pos, pipe_below_midtop_pos - pipe_distance] pipe_list = [] pipe_list.append(pipe_one_list) # Tạo timer - sự kiện nhân bản ống nước spawn_pipe = pygame.USEREVENT + 2 pygame.time.set_timer(spawn_pipe, 800) # 0.8 giây sinh 1
2.6. Xử lý các sự kiện va chạm
Trong trò chơi Flappy Bird, có nhiều tương tác giữa các nhân vật. Chúng ta cần kiểm tra va chạm giữa chim và ống nước, chim và sàn, chim và biên trên của màn hình.
# Xử lý va chạm if bird_rect.colliderect(pipe_below_rect): game_running = False print('bird va cham pipe_below_rect') if bird_rect.colliderect(pipe_above_rect): game_running = False print('bird va cham pipe_above_rect') if bird_rect.centery > screenHeight-130 or bird_rect.centery 0: game_running = False print('bird va cham san hoac bay cao vuot can tren') # Thông báo game_over if game_running == False: screen.blit(game_over, game_over_rect) hit_sound.play() if item[0] bird_x: score += 1
2.7. Thông báo thua cuộc và chơi lại
Người chơi sẽ thua cuộc trong các trường hợp sau:
- Chim va chạm với ống nước.
- Chim va chạm với sàn.
- Chim va chạm với biên trên màn hình.
# Trạng thái trò chơi game_running = True # Vẽ hình ảnh kết thúc cuộc chơi game_over = pygame.image.load('assets/flappy-bird/game_over2.png') game_over_rect = game_over.get_rect() game_over_rect.center = (screenWidth/2, screenHeight/2) pygame.display.update() clock.tick(120)
Tiếp theo, chúng ta sẽ khai báo biến game_running để xác định liệu người chơi đã thua hay chưa. Khi chơi lại, danh sách ống nước sẽ được làm mớ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: if game_running == True: bird_move = level_bird_move_list[level] # di chuyển lên trên flap_sound.play() else: game_running = True pipe_list.clear() bird_move = 0 bird_rect.center = (bird_x, screenHeight/2) if event.type == bird_flap: bird_index += 1 if bird_index >= 2: bird_index = 0
2.8. Lập trình tính điểm và cấp độ
Để tính điểm và cấp độ trong trò chơi Flappy Bird, chúng ta cần làm những việc sau:
- Khai báo biến score để lưu số điểm trong lượt chơi hiện tại.
- Khai báo biến high_score để lưu số điểm cao nhất trong tất cả lượt chơi.
- Tính điểm dựa trên việc chim vượt qua ống nước hoặc ống nước di chuyển qua tọa độ x của chim.
- Cập nhật điểm cao nhất nếu số điểm hiện tại vượt quá số điểm cao nhất.
# Level level = 0 level_bird_move_list = [-4, -5, -6, -7, -8, -9] # Vẽ số điểm đang chơi score_surface = gameFont.render('Score: {}'.format(score), True, WHITE) score_rect = score_surface.get_rect() score_rect.center = (200, 50) screen.blit(score_surface, score_rect) # Vẽ điểm cao if game_running == False: if score > high_score: high_score = score high_score_surface = gameFont.render('High Score: {}'.format(high_score), True, WHITE) high_score_rect = high_score_surface.get_rect() high_score_rect.center = (200, 100) screen.blit(high_score_surface, high_score_rect) # Vẽ cấp độ level = score // 5 score_surface = gameFont.render('Level: {}'.format(level), True, WHITE) score_rect = score_surface.get_rect() score_rect.center = (50, 50) screen.blit(score_surface, score_rect)
2.9. Thêm âm thanh vào trò chơi
Âm thanh là một yếu tố không thể thiếu trong trò chơi. Để thêm âm thanh vào trò chơi Flappy Bird, ta sẽ tải các file âm thanh và sử dụng chúng trong chương trình.
# Chèn âm thanh flap_sound = pygame.mixer.Sound('assets/flappy-bird/sound/sfx_wing.wav') hit_sound = pygame.mixer.Sound('assets/flappy-bird/sound/sfx_hit.wav') score_sound = pygame.mixer.Sound('assets/flappy-bird/sound/sfx_point.wav')
Chúng ta vui lòng kiểm tra lại các đường dẫn hình ảnh và âm thanh để đảm bảo tính chính xác.
3. Kết luận
Đó là cách lập trình trò chơi Flappy Bird bằng Python chỉ trong 9 bước đơn giản. Chúng ta hy vọng rằng bạn sẽ áp dụng kiến thức trên để sáng tạo ra phiên bản Flappy Bird của riêng bạn. Chúc bạn thành công!
Nếu bạn quan tâm đến lập trình game trên Python, hãy đăng ký khóa học "Lập trình Python Code Combat" tại ICANTECH.
Nguồn ảnh: ICANTECH.