Hú ae!!!
Thật không thể tin nổi! Sau bao ngày la lết trên mạng, hỏi lung tung cả một con AI tên là Amazon Q, cuối cùng mình cũng tự code được con game Flappy Bird huyền thoại của Việt Nam. Mình là gà mờ chính hiệu, code sai lên sai xuống, nhưng mỗi lần bí lại có Q "chỉ bài" nên cuối cùng nó cũng chạy được các bác ạ!
Vui quá nên mình viết vội bài này để chia sẻ lại hành trình cho ae nào cũng đang tập tọe giống mình. Coi như là nhật ký học code, có gì sai các bác cứ ném đá nhẹ tay nhé!
Bước 1: Sắm "Đồ Nghề" (Sau khi hỏi Q)
Lúc đầu mình hoang mang không biết bắt đầu từ đâu.
Mình hỏi Amazon Q: "Ê Q, tao gà mờ muốn làm game 2D đơn giản bằng Python thì dùng cái gì bây giờ?"
Amazon Q phán ngay: "Bạn ơi, dùng Pygame nhé! Nó là thư viện 'quốc dân' cho người mới bắt đầu, dễ dùng mà đủ đồ chơi để bạn vẽ vời, xử lý âm thanh, bấm phím các kiểu."
Nghe bùi tai ghê! Thế là mình chốt luôn.
- Python: Cái này chắc ai cũng có rồi.
- Pygame: Cái "hộp đồ chơi" mà Q vừa mách. Cài thì dễ ợt. Các bác mở cái cửa sổ đen sì (Terminal hay Command Prompt) rồi gõ cái lệnh thần chú này vào là xong:
pip install pygame
Xong! Giờ thì làm tí prompt với Amazon Q thôi. Một câu lệnh thật đơn giản như sau:
Mình bảo Amazon Q: "build game flappy bird bằng python"
Amazon Q phán ngay:
"Yo, Amazon Q đây! Check hàng nóng tôi vừa code xong cho ông bạn này!
Nói chung là tôi vừa "nghịch" ra con game Flappy Bird bằng Python với Pygame. Code xong thấy cũng ra gì phết nên share cho anh em vọc vạch.
Đống code của tôi có gì?
flappy_bird.py
: File chứa "tinh hoa" của tôi, tất cả nằm trong này.
README.md
: Giấy hướng dẫn sử dụng, cho mấy ông bạn não cá vàng.
requirements.txt
: Mấy thứ lặt vặt cần cài, tôi ghi sẵn cho đỡ phải nhớ.
Luật chơi (dành cho người mới):
- Cứ đập vào cái phím SPACE huyền thoại để con chim nó bay lên. Đừng đập mạnh quá hỏng bàn phím.
- Né mấy cái ống xanh lè. Dễ nhìn vậy thôi chứ dễ "toang" lắm đấy.
- Lách qua được một ống là có 1 điểm bỏ túi, oai như cóc.
- Lỡ va vào cột hay cắm đầu xuống đất thì cứ SPACE mà phục thù, đừng cay cú.
- Chơi chán rồi thì bấm ESC để nghỉ, giữ gìn sức khỏe.
Cài đặt trong 3 nốt nhạc:
- Đầu tiên, máy phải có Python nhé, không có thì nói chuyện gì.
- Mở terminal lên, gõ đúng 1 dòng lệnh thần thánh này thôi:
pip install pygame
- Xong rồi thì "chiến" game bằng lệnh:
python flappy_bird.py
Game của tôi có gì hot?
- Chim bay phấp phới chỉ bằng 1 nút bấm. Đỉnh chưa?
- Ống thì "mọc" ra ngẫu nhiên, chơi không bao giờ nhàm chán (chỉ có tức thôi).
- Có tính điểm hẳn hoi, để các ông bạn còn khoe "thành tích".
- Có màn hình "GAME OVER" siêu to khổng lồ để trêu ngươi. Đấy, nền tảng là thế. Thích thì cứ thêm thắt hoa lá cành, ảnh ọt, âm thanh vào cho nó "xịn sò" nhé. Chúc ông bạn phá đảo thành công (hoặc đập bàn phím trong bất lực)!" ```
Nghe xong mình như được khai thông kinh mạch! Hóa ra phải có một cái "tổng quản" để điều khiển mọi thứ. Thế là mình bắt tay vào viết ngay con game , chỗ nào không chắc lại hỏi Q xem logic đúng chưa.
Và đây là thành quả cuối cùng sau khi đã được "thầy Q" chỉ dạy tận tình.
TOÀN BỘ MÃ NGUỒN (Thành quả của mình và người thầy AI)
import pygame
import sys
import random
# Initialize pygame
pygame.init()
# Game constants
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 600
GRAVITY = 0.25
BIRD_JUMP = -5
PIPE_GAP = 150
PIPE_FREQUENCY = 1500 # milliseconds
PIPE_SPEED = 5
FLOOR_HEIGHT = 100
# Colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
SKY_BLUE = (135, 206, 235)
GREEN = (0, 128, 0)
RED = (255, 0, 0)
# Set up the display
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('Flappy Bird')
clock = pygame.time.Clock()
font = pygame.font.SysFont('Arial', 30)
class Bird:
def __init__(self):
self.x = 100
self.y = SCREEN_HEIGHT // 2
self.velocity = 0
self.width = 40
self.height = 30
def jump(self):
self.velocity = BIRD_JUMP
def move(self):
self.velocity += GRAVITY
self.y += self.velocity
def draw(self):
pygame.draw.rect(screen, RED, (self.x, self.y, self.width, self.height), 0, 5)
def get_mask(self):
return pygame.Rect(self.x, self.y, self.width, self.height)
class Pipe:
def __init__(self):
self.x = SCREEN_WIDTH
self.height = random.randint(100, 400)
self.top_pipe = pygame.Rect(self.x, 0, 60, self.height)
self.bottom_pipe = pygame.Rect(self.x, self.height + PIPE_GAP, 60, SCREEN_HEIGHT)
self.passed = False
def move(self):
self.x -= PIPE_SPEED
self.top_pipe.x = self.x
self.bottom_pipe.x = self.x
def draw(self):
pygame.draw.rect(screen, GREEN, self.top_pipe)
pygame.draw.rect(screen, GREEN, self.bottom_pipe)
def collide(self, bird):
bird_mask = bird.get_mask()
return bird_mask.colliderect(self.top_pipe) or bird_mask.colliderect(self.bottom_pipe)
def draw_floor():
pygame.draw.rect(screen, GREEN, (0, SCREEN_HEIGHT - FLOOR_HEIGHT, SCREEN_WIDTH, FLOOR_HEIGHT))
def display_score(score):
score_text = font.render(f'Score: {score}', True, BLACK)
screen.blit(score_text, (10, 10))
def game_over_screen(score):
screen.fill(SKY_BLUE)
game_over_text = font.render('Game Over', True, BLACK)
score_text = font.render(f'Score: {score}', True, BLACK)
restart_text = font.render('Press SPACE to restart', True, BLACK)
screen.blit(game_over_text, (SCREEN_WIDTH // 2 - game_over_text.get_width() // 2, SCREEN_HEIGHT // 3))
screen.blit(score_text, (SCREEN_WIDTH // 2 - score_text.get_width() // 2, SCREEN_HEIGHT // 2))
screen.blit(restart_text, (SCREEN_WIDTH // 2 - restart_text.get_width() // 2, SCREEN_HEIGHT // 2 + 50))
pygame.display.update()
waiting = True
while waiting:
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:
waiting = False
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
def main_game():
bird = Bird()
pipes = []
score = 0
last_pipe = pygame.time.get_ticks()
game_active = True
while True:
clock.tick(60)
current_time = pygame.time.get_ticks()
# Event handling
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.jump()
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
screen.fill(SKY_BLUE)
if game_active:
# Bird movement
bird.move()
bird.draw()
# Generate pipes
if current_time - last_pipe > PIPE_FREQUENCY:
pipes.append(Pipe())
last_pipe = current_time
# Move and draw pipes
for pipe in pipes:
pipe.move()
pipe.draw()
# Check for collision
if pipe.collide(bird):
game_active = False
# Check if bird has passed the pipe
if pipe.x + 60 < bird.x and not pipe.passed:
pipe.passed = True
score += 1
# Remove pipes that have gone off screen
pipes = [pipe for pipe in pipes if pipe.x > -60]
# Check if bird has hit the ground or gone off the top
if bird.y > SCREEN_HEIGHT - FLOOR_HEIGHT - bird.height or bird.y < 0:
game_active = False
else:
game_over_screen(score)
return # Return to restart the game
# Draw floor
draw_floor()
# Display score
display_score(score)
pygame.display.update()
# Main game loop
if __name__ == "__main__":
while True:
main_game()
Game chạy ngon lành cành đào luôn! Cảm giác nó đã gì đâu!
Công nhận có con AI chỉ bài tiện thật các bác ạ. Những lúc bí mà có người gỡ rối cho nó nhanh hơn hẳn là tự mò một mình. Phải cảm ơn ông bạn AI Amazon Q đã gánh còng lưng những lúc mình "ngu ngơ".
Hy vọng cái bài viết lủng củng này của mình giúp được ae nào đó đang bắt đầu. Mình làm được thì các bác cũng làm được thôi. Cố lên!!!
À mà khoan! Toàn bộ "hàng họ" code kiếc chi tiết tôi vứt hết lên đây này:
https://github.com/kien226/Flappy-Bird-Game-Amazon-Q-CLI
Ông bạn vào ngó nghiêng, thấy xịn thì cho tôi xin một cái ⭐ (nút Star ấy) để lấy le với mấy anh em AI khác nhé. Một ngôi sao của bạn là một điểm uy tín cho tôi! Chúc ông bạn phá đảo thành công (hoặc đập bàn phím trong bất lực)!
Top comments (0)