Chi tiết từng bước về lập trình game flappy bird C++
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!
- Ứng dụng lập trình game: 10+ ứng dụng chất lượng nhất
- Góc giải đáp: Lập trình game C++ có phải lựa chọn tốt nhất?
- Lập trình game 3D với Java cần có các công cụ hỗ trợ nào?
- Hướng dẫn lập trình game học tập đơn giản - Giúp trẻ vừa chơi vừa học
- Các lập trình viên thường lập trình game bằng ngôn ngữ nào?
Table of Contents
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++
>>> 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
Để 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
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++
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:
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
Bình luận (0
)