Chi tiết từng bước về lập trình game flappy bird c++

Chi tiết từng bước về lập trình game flappy bird C++ 

Chia sẻ kiến thức 04/03/2023

Game flappy bird c++ là tựa game không còn quá xa lạ với nhiều người, đặc biệt là những bạn tìm hiểu về lập trình. Đây là tựa game khá thú vị khiến nhiều bạn cảm thấy tò mò không biết cách lập trình game flappy bird c++ có khó không? Cách thực hiện ra sao? FUNiX mời các bạn tham khảo bài viết dưới đây để biết thêm chi tiết!

Game flappy bird c++ là tựa game không còn quá xa lạ với nhiều người, đặc biệt là những bạn tìm hiểu về lập trình. Đây là tựa game khá thú vị khiến nhiều bạn cảm thấy tò mò không biết cách lập trình game flappy bird c++ có khó không? Cách thực hiện ra sao? FUNiX mời các bạn tham khảo bài viết dưới đây để biết thêm chi tiết!

1. Tạo thư mục và file cho game khi lập trình game flappy bird c++

Tạo tên file flappyBird.py là file code chính. Thư mục img sẽ chứa những hình ảnh có trong game.

2. Tạo cửa sổ game và nền cho khi lập trình game flappy bird c++

Tạo cửa sổ game và nền cho game flappy birdTạo cửa sổ game và nền cho game flappy bird
Tạo cửa sổ game và nền cho game flappy bird

>>> Xem thêm: 5 Điểm đáng chú ý tại khóa học lập trình trực tuyến FPT – FUNiX

Để tạo cửa sổ game và nền khi lập trình game flappy bird c++, các bạn hãy thực hiện theo đoạn code sau:

import pygame, sys, random

from pygame.locals import *

WINDOWWIDTH = 400

WINDOWHEIGHT = 600

BACKGROUND = pygame.image.load(‘img/background.png’)

pygame.init()

FPS = 60

fpsClock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))

pygame.display.set_caption(‘Flappy Bird’)

def main():

    while True:

        for event in pygame.event.get():

            if event.type == QUIT:

                pygame.quit()

                sys.exit()

        DISPLAYSURF.blit(BACKGROUND, (0, 0))

        pygame.display.update()

        fpsClock.tick(FPS)

if __name__ == ‘__main__’:

    main()

<<< Xem thêm: Sự nghiệp trong C/C++ phủ nhận sự thật về ngôn ngữ lỗi thời

3. Tạo con chim của game khi lập trình game flappy bird c++

  • Tạo hình con chim và vẽ lên cửa sổ

Ở phần đầu đoạn code, các bạn sẽ tạo một số hằng số để có thể tiện cho việc thay đổi, kiểm tra.

BIRDWIDTH = 60

BIRDHEIGHT = 45

G = 0.5

SPEEDFLY = -8

BIRDIMG = pygame.image.load(‘img/bird.png’)

Tạo class Bird như sau:

class Bird():

    def __init__(self):

        self.width = BIRDWIDTH

        self.height = BIRDHEIGHT

        self.x = (WINDOWWIDTH – self.width)/2

        self.y = (WINDOWHEIGHT- self.height)/2

        self.speed = 0

        self.suface = BIRDIMG

    def draw(self):

        DISPLAYSURF.blit(self.suface, (int(self.x), int(self.y)))

Các bạn cần chú ý phần self.speed chính là tốc độ bay của chim. Trong hàm main các bạn tạo thêm 1 biến bird và gọi hàm bird.draw() nằm trong vòng lặp game.

def main():

    bird = Bird()

    while True:

        for event in pygame.event.get():

            if event.type == QUIT:

                pygame.quit()

                sys.exit()

        DISPLAYSURF.blit(BACKGROUND, (0, 0))

        bird.draw()

        pygame.display.update()

        fpsClock.tick(FPS)

<<< Xem thêm: Học lập trình Python để làm gì? Có cần thiết phải học lập trình Python không?

  • Chuyển động rơi tự do của chú chim
Lập trình game flappy bird c++
Tạo chuyển động rơi tự do của chú chim

Để thay đổi vị trí của chú chim thì bạn cần phải có thêm hàm update. Các bạn hãy tạo thêm hàm update của class Bird như sau:

def update(self):

    self.y += self.speed + 0.5*G

    self.speed += G

Trong vòng lặp của game các bạn nhớ gọi hàm bird.update() ở sau dòng bird.draw()

while True:

    for event in pygame.event.get():

        if event.type == QUIT:

            pygame.quit()

            sys.exit()

    DISPLAYSURF.blit(BACKGROUND, (0, 0))

    bird.draw()

    bird.update()

    pygame.display.update()

    fpsClock.tick(FPS)

Trong hàm update các bạn sẽ tính tung độ (self.y) và tốc độ (self.speed) của chú chim ứng với từng khung hình. Như các bạn cũng đã biết, các khung hình này sẽ xuất hiện cách nhau sau một khoảng thời gian xác định. Để đơn giản hơn thì bạn hãy cho những khoảng thời gian đều bằng 1 và khi bạn thay vào phương trình rơi tự do chúng ta sẽ được 2 dòng code trên. Trong đó, điểm G chính là gia tốc trọng trường.

>>> Xem ngay: Lưu ý để học blockchain trực tuyến hiệu quả cao tại FUNiX 

4. Chuyển động bay lên khi bạn Click chuột

Để tạo được các chuyển động bay của chim lên khi Click chuột thì bạn cần phải bắt sự kiện Click chuột của mình và thay đổi tốc độ của chim. Tốc độ bay lên của chim phải có giá trị âm, trong code của các bạn đã một hằng số là SPEEDFLY = -8.

Bây giờ các bạn cần phải thêm một số thứ vào hàm update như sau:

def update(self, mouseClick):

    self.y += self.speed + 0.5*G

    self.speed += G

    if mouseClick == True:

        self.speed = SPEEDFLY

Thêm 1 tham số đó là mouseClick, biến này được dùng để kiểm tra việc Click chuột.

Dòng if sẽ được thêm vào khá đơn giản. Nếu bạn Click chuột thì hãy đặt tốc độ chim là SPEEDFLY.

Bây giờ, việc các bạn cần làm là bắt sự kiện Click chuột và truyền chúng vào hàm update, thêm những dòng code này vào bên trong vòng lặp game như sau:

while True:

    mouseClick = False

    for event in pygame.event.get():

        if event.type == QUIT:

            pygame.quit()

            sys.exit()

        if event.type == MOUSEBUTTONDOWN:

            mouseClick = True

    DISPLAYSURF.blit(BACKGROUND, (0, 0))

    bird.draw()

    bird.update(mouseClick)

    pygame.display.update()

    fpsClock.tick(FPS)

Biến mouse Click được dùng để kiểm tra sự kiện Click chuột và để truyền vào hàm update. Trong vòng for thì các bạn thực hiện việc bắt sự kiện MOUSEBUTTONDOWN, sự kiện này sẽ xảy ra khi nút chuột được bạn ấn vào.

Vậy là các bạn đã hoàn thành xong phần của con chim. 

<<< Xem thêm: Python và C ++: 6 điểm khác biệt bạn cần nắm rõ

5. Tạo cột và tạo sự chuyển động của cột

  • Tạo cột

Như các bạn đã biết thì sẽ có phần cột bên trên và phần bên dưới. Code sẽ như sau:

Thêm một số hằng số như sau:

COLUMNWIDTH = 60

COLUMNHEIGHT = 500

BLANK = 160

DISTANCE = 200

COLUMNSPEED = 2

COLUMNIMG = pygame.image.load(‘img/column.png’)

Tạo thêm class Columns

class Columns():

    def __init__(self):

        self.width = COLUMNWIDTH

        self.height = COLUMNHEIGHT

        self.blank = BLANK

        self.distance = DISTANCE

        self.speed = COLUMNSPEED

        self.surface = COLUMNIMG

        self.ls = []

        for i in range(3):

            x = i*self.distance

            y = random.randrange(60, WINDOWHEIGHT – self.blank – 60, 20)

            self.ls.append([x, y])

    def draw(self):

        for i in range(3):

            DISPLAYSURF.blit(self.surface, (self.ls[i][0], self.ls[i][1] – self.height))

            DISPLAYSURF.blit(self.surface, (self.ls[i][0], self.ls[i][1] + self.blank))

Trong hàm main các bạn làm tương tự như phần con chim. Tạo thêm biến columns, thêm hàm columns.draw() vào trong vòng lặp game.

def main():

    bird = Bird()

    columns = Columns()

    while True:

        mouseClick = False

        for event in pygame.event.get():

            if event.type == QUIT:

                pygame.quit()

                sys.exit()

            if event.type == MOUSEBUTTONDOWN:

                mouseClick = True

        DISPLAYSURF.blit(BACKGROUND, (0, 0))

        columns.draw()

        bird.draw()

        bird.update(mouseClick)

        pygame.display.update()

        fpsClock.tick(FPS)

Bây giờ các bạn hãy nhìn lại class Columns, trong hàm __init__ sẽ có khởi tạo một số biến:

  • self.width đó là chiều rộng của cột.
  • self.height đó là chiều cao của 1 phần cột.
  • self.blank đó là chiều cao khoảng trống giữa 2 phần cột.
  • self.distance đó là khoảng cách giữa các cột.
  • self.speed đó là tốc độ di chuyển của cột (cột sẽ di chuyển sang trái).
  • self.surface đó là surface của 1 phần cột.
  • self.ls đó là một list chứa các thông tin về vị trí cột và vị trí các khoảng trống. Vòng lặp for trong __init__ sẽ dùng để tạo 3 cột đầu tiên.

for i in range(3):

    x = i*self.distance

    y = random.randrange(60, WINDOWHEIGHT – self.blank – 60, 20)

    self.ls.append([x, y])

  • Biến x chính là hoành độ của cột. Cột đầu tiên được các bạn vẽ sát lề bên trái, tức là x = 0. Các cột tiếp theo sẽ cách nhau thêm một khoảng bằng self.distance.
  • Biến y chính là vị trí của khoảng trống. Biến này sẽ nhận giá trị random để các bạn tạo những khoảng trống có vị trí khác nhau.

Bây giờ các bạn hãy xem hàm draw của class Columns.

def draw(self):

    for i in range(3):

        DISPLAYSURF.blit(self.surface, (self.ls[i][0], self.ls[i][1] – self.height))

        DISPLAYSURF.blit(self.surface, (self.ls[i][0], self.ls[i][1] + self.blank))

  • Tạo sự chuyển động cho cột
Tạo sự chuyển động cho cột của game
Tạo sự chuyển động cho cột của game

def update(self):

    for i in range(3):

        self.ls[i][0] -= self.speed

Nếu các bạn có ý tưởng rồi thì bạn thêm code vào hàm update thôi.

def update(self):

    for i in range(3):

        self.ls[i][0] -= self.speed

    if self.ls[0][0] < -self.width:

        self.ls.pop(0)

        x = self.ls[1][0] + self.distance

        y = random.randrange(60, WINDOWHEIGHT – self.blank – 60, 10)

        self.ls.append([x, y])

Dòng if được thêm vào nhằm để kiểm tra xem cột đó có đi ra ngoài màn hình hay chưa.

>>> Xem ngay: FUNiX trở thành đối tác của Liên minh Blockchain Việt Nam

6. Xử lý các va chạm khi lập trình game flappy bird c++

  • Tạo va chạm giữa hai hình chữ nhật

def rectCollision(rect1, rect2):

    if rect1[0] <= rect2[0]+rect2[2] and rect2[0] <= rect1[0]+rect1[2] and rect1[1] <= rect2[1]+rect2[3] and rect2[1] <= rect1[1]+rect1[3]:

        return True

    return False

  • Kiểm tra phần gameover khi lập trình game flappy bird c++

Các bạn sẽ sử dụng code sau:

def isGameOver(bird, columns):

    for i in range(3):

        rectBird = [bird.x, bird.y, bird.width, bird.height]

        rectColumn1 = [columns.ls[i][0], columns.ls[i][1] – columns.height, columns.width, columns.height]

        rectColumn2 = [columns.ls[i][0], columns.ls[i][1] + columns.blank, columns.width, columns.height]

        if rectCollision(rectBird, rectColumn1) == True or rectCollision(rectBird, rectColumn2) == True:

            return True

    if bird.y + bird.height < 0 or bird.y + bird.height > WINDOWHEIGHT:

        return True

    return False

Vậy là các bạn đã có một hàm để biết lúc nào thì là gameover. Các bạn hãy thêm vào đoạn code này vào vòng lặp game.

if isGameOver(bird, columns) == True:

    pygame.quit()

    sys.exit()

Vậy là các bạn đã xong phần xử lý va chạm rồi. Tiếp theo các bạn sẽ tìm cách tính điểm trong game nhe!

<<< Xem thêm: C ++ và C: Bạn nên học ngôn ngữ nào?

7. Tính điểm

Trong game, nếu chú chim đi qua 1 cột thì bạn sẽ được cộng thêm điểm. Vậy làm sao để game biết chim đi qua 1 cột?? Các bạn sẽ thực hiện đoạn code dưới đây:

class Score():

    def __init__(self):

        self.score = 0

        self.addScore = True    

    def draw(self):

        font = pygame.font.SysFont(‘consolas’, 40)

        scoreSuface = font.render(str(self.score), True, (0, 0, 0))

        textSize = scoreSuface.get_size()

        DISPLAYSURF.blit(scoreSuface, (int((WINDOWWIDTH – textSize[0])/2), 100))

   def update(self, bird, columns):

        collision = False

        for i in range(3):

            rectColumn = [columns.ls[i][0] + columns.width, columns.ls[i][1], 1, columns.blank]

            rectBird = [bird.x, bird.y, bird.width, bird.height]

            if rectCollision(rectBird, rectColumn) == True:

                collision = True

                break

        if collision == True:

            if self.addScore == True:

                self.score += 1

            self.addScore = False

        else:

            self.addScore = True

Trong hàm main, các bạn hãy nhớ tạo thêm một biến score và gọi 2 hàm của nó để trong vòng lặp game.

def main():

    bird = Bird()

    columns = Columns()

    score = Score()

    while True:

        mouseClick = False

        for event in pygame.event.get():

            if event.type == QUIT:

                pygame.quit()

                sys.exit()

            if event.type == MOUSEBUTTONDOWN:

                mouseClick = True

        DISPLAYSURF.blit(BACKGROUND, (0, 0))

        columns.draw()

        columns.update()

        bird.draw()

        bird.update(mouseClick)        

        score.draw()

        score.update(bird, columns)

        if isGameOver(bird, columns) == True:

            pygame.quit()

            sys.exit()

        pygame.display.update()

        fpsClock.tick(FPS)

<<< Xem thêm: C ++ và C: Bạn nên học ngôn ngữ nào?

8. Tạo các màn mới cho game và hoàn chỉnh lập trình game flappy bird c++

Tạo các màn mới cho game
Tạo các màn mới cho game

Như các bạn đã thấy thì lập trình game flappy bird c++ của chúng ta vẫn chưa tạo hoàn chỉnh. Bạn hãy làm theo hướng dẫn dưới đây nhé!

  • GamePlay

def gamePlay(bird, columns, score):

    bird.__init__()

    bird.speed = SPEEDFLY

    columns.__init__()

    score.__init__()

    while True:

        mouseClick = False

        for event in pygame.event.get():

            if event.type == QUIT:

                pygame.quit()

                sys.exit()

            if event.type == MOUSEBUTTONDOWN:

                mouseClick = True        

        DISPLAYSURF.blit(BACKGROUND, (0, 0))

        columns.draw()

        columns.update()

        bird.draw()

        bird.update(mouseClick)

        score.draw()

        score.update(bird, columns)

        if isGameOver(bird, columns) == True:

            return

        pygame.display.update()

        fpsClock.tick(FPS)

Các bạn có thể chỉnh lại hàm main như sau:

def main():

    bird = Bird()

    columns = Columns()

    score = Score()

    while True:

        gamePlay(bird, columns, score)

Khi các bạn chạy hàm gamePlay thì những giá trị của bird, columns, score chúng sẽ được đặt lại bằng việc bạn gọi hàm __init__ và chỗ chú chim thì cho nó bay lên 1 cái. Khi các bạn kiểm tra sẽ thấy gameOver thì kết thúc hàm.

  • GameStart

def gameStart(bird):

    bird.__init__()

    font = pygame.font.SysFont(‘consolas’, 60)

    headingSuface = font.render(‘FLAPPY BIRD’, True, (255, 0, 0))

    headingSize = headingSuface.get_size()    

    font = pygame.font.SysFont(‘consolas’, 20)

    commentSuface = font.render(‘Click to start’, True, (0, 0, 0))

    commentSize = commentSuface.get_size()    

    while True:

        for event in pygame.event.get():

            if event.type == QUIT:

                pygame.quit()

                sys.exit()

            if event.type == MOUSEBUTTONDOWN:

                return

        DISPLAYSURF.blit(BACKGROUND, (0, 0))

        bird.draw()

        DISPLAYSURF.blit(headingSuface, (int((WINDOWWIDTH – headingSize[0])/2), 100))

        DISPLAYSURF.blit(commentSuface, (int((WINDOWWIDTH – commentSize[0])/2), 500))

        pygame.display.update()

        fpsClock.tick(FPS)

Trong main các bạn cũng nhớ gọi hàm này nhé:

def main():

    bird = Bird()

    columns = Columns()

    score = Score()

    while True:

        gameStart(bird)

        gamePlay(bird, columns, score)

  • GameOver

def gameOver(bird, columns, score):

    font = pygame.font.SysFont(‘consolas’, 60)

    headingSuface = font.render(‘GAMEOVER’, True, (255, 0, 0))

    headingSize = headingSuface.get_size()    

    font = pygame.font.SysFont(‘consolas’, 20)

    commentSuface = font.render(‘Press “space” to replay’, True, (0, 0, 0))

    commentSize = commentSuface.get_size()

    font = pygame.font.SysFont(‘consolas’, 30)

    scoreSuface = font.render(‘Score: ‘ + str(score.score), True, (0, 0, 0))

    scoreSize = scoreSuface.get_size()

    while True:

        for event in pygame.event.get():

            if event.type == QUIT:

                pygame.quit()

                sys.exit()

            if event.type == KEYUP:

                if event.key == K_SPACE:

                    return        

        DISPLAYSURF.blit(BACKGROUND, (0, 0))

        columns.draw()

        bird.draw()

        DISPLAYSURF.blit(headingSuface, (int((WINDOWWIDTH – headingSize[0])/2), 100))

        DISPLAYSURF.blit(commentSuface, (int((WINDOWWIDTH – commentSize[0])/2), 500))

        DISPLAYSURF.blit(scoreSuface, (int((WINDOWWIDTH – scoreSize[0])/2), 160))

 pygame.display.update()

        fpsClock.tick(FPS)

Thế là xong toàn bộ quá trình lập trình game flappy bird c++, các bạn hãy chạy thử để xem thành quả nhé!

>>> Xem thêm: Tất cả những gì bạn cần biết về công nghệ Blockchain

FUNiX hy vọng với những bước hướng dẫn từ bài viết trên các bạn có thể tự tay lập trình game thành công. Để có thể biết thêm nhiều kiến thức bổ ích các bạn có thể tìm hiểu tại website FUNiX và đăng ký ngay thông tin để được tư vấn nhiều hơn nhé!

>>> Đăng ký khóa học ngôn ngữ lập trình C++ của FUNiX tại đây:

>>> Xem thêm bài viết:

 Top 5+ Ứng dụng game điện thoại và PC hay nhất mọi thời đại

Xu hướng phát triển nghề lập trình Game blockchain

5 Điểm đáng chú ý tại khóa học lập trình trực tuyến FPT – FUNiX

Từ A-Z chương trình học FUNiX – Mô hình đào tạo lập trình trực tuyến số 1 Việt Nam

Lý do phổ biến khiến học viên nước ngoài chọn FUNiX

 

Đào Thị Kim Thảo

ĐĂNG KÝ TƯ VẤN HỌC LẬP TRÌNH TẠI FUNiX

Bình luận (
0
)

Bài liên quan

  • Tầng 0, tòa nhà FPT, 17 Duy Tân, Q. Cầu Giấy, Hà Nội
  • info@funix.edu.vn
  • 0782313602 (Zalo, Viber)        
Chat Button
FUNiX V2 GenAI Chatbot ×

yêu cầu gọi lại