Hướng dẫn viết game flappy bird

     

Chào hầu hết người! Trong bài hướng dẫn lần này mình vẫn cùng chúng ta tạo ra trò chơi Flappy Bird với pygame. Flappy Bird là một trong những game nhưng hầu như ai ai cũng biết, cách chơi đơn giản và gần như là ai học lập trình game cũng từng thử làm tựa game này. Không nói dài chiếc nữa, bọn họ cùng bước đầu luôn nha!

Kiến thức căn bản

Đầu tiên, các bạn cần phải biết cơ bản về python với pygame. Chúng ta nào chưa mày mò pygame thì có thể xem qua 2 bài bác hướng dẫn cơ bản của bản thân (phần 1, phần 2)hoặc có thể học trên đều nguồn khác nhé. Bài xích này khá dài nên các bạn phải nỗ lực theo dõi. Để bao gồm động lực thì chúng ta cùng coi trước kết quả này làm được trong bài này nhe!

Các chúng ta tải source code không hề thiếu tại đây.

Bạn đang xem: Hướng dẫn viết game flappy bird

Tạo thư mục với file mang lại game

Các bạn hãy tạo folder có kết cấu như sau:

*

flappyBird.py là tệp tin code chính của bọn chúng ta. Folder img chứa gần như hình ảnh trong game.

Các hình hình ảnh mình lấy tại đây và mình có chỉnh lại cho cân xứng với game.

Các hình hình ảnh đã gồm trong phần source code khá đầy đủ rồi. Chúng ta nhớ thiết lập về cùng thêm vào.

Như vậy là chúng ta đã chuẩn bị xong những thứ bắt buộc thiết. Hiện thời các các bạn mở fileflappyBird.py rồi code thôi!

Tạo cửa sổ game với vẽ nền mang đến game

Phần này khá đơn giản dễ dàng nên bản thân đi cấp tốc qua nhe. Mọi thứ vào này bản thân đã reviews ở những bài trước rồi.

À mà vị mình đã code từng bước nên đôi lúc những mẫu code bao gồm sự khác biệt so với đoạn code tương đối đầy đủ nhe!

import pygame, sys, randomfrom pygame.locals import *WINDOWWIDTH = 400WINDOWHEIGHT = 600BACKGROUND = pygame.image.load("img/background.png")pygame.init()FPS = 60fpsClock = pygame.time.Clock()DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))pygame.display.set_caption("Flappy Bird")def main(): while True: for sự kiện 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()

Tạo bé chim và điểu khiển nó

Tạo bé chim cùng vẽ lên cửa ngõ sổỞ đầu đoạn code, họ sẽ tạo một trong những hằng số nhằm tiện cho vấn đề thay đổi, kiểm tra. Các bạn tham khảo sống code tương đối đầy đủ nhe!

BIRDWIDTH = 60BIRDHEIGHT = 45G = 0.5SPEEDFLY = -8BIRDIMG = 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ó lẽ chúng ta cũng đang hiểu vai trò của những biến vào __init__ rồi! Các chúng ta có thể xem hình dưới

*

Các bạn cần chú ý self.speed là vận tốc bay của chim. điều này mình sẽ nói tại phần sau.

Trong hàm main tạo thêm một biến bird và điện thoại tư vấn hàm bird.draw() trong tầm 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)Các chúng ta chạy demo nhe. Con chim đã làm được vẽ lên màn hình. Hiện giờ chúng ta hãy kiếm tìm cách tạo cho con chim rơi xuống nhe.

Chuyển rượu cồn rơi thoải mái của chim

Bây giờ bọn họ hãy code trước rồi mình sẽ phân tích và lý giải sau.

Như bài hướng dẫn trước, để chuyển đổi vị trí của chim thì cần phải có thêm hàm update. Các bạn hãy tạo ra hàm update của class Bird như sau:

def update(self): self.y += self.speed + 0.5*G self.speed += GTrong vòng lặp game các bạn nhớ điện thoại tư vấn hàm bird.update() sau mẫu 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)Chạy thử với xem hiệu quả nhé. Hiện giờ chúng ta cần phải biết những gì đang xảy ra bên phía trong hàm update.

Nhưng trước hết, các bạn phải biết phần nhiều điều cơ phiên bản về chuyển hễ rơi từ do. Thực chất, rơi tự do là chuyển động nhanh dần dần đều theo gia tốc trọng trường. Các bạn phải biết các phương trình của chuyển động rơi từ do y = y0+ v0t + 0.5gt2v = v0+ gt. Nếu không rõ thì các chúng ta có thể tự tò mò nhe, mình ko nói kỹ sinh hoạt đây.

*

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

Chuyển động bay lên lúc Click chuột

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

Bây giờ cần phải thêm một trong những thứ vào hàm update.

def update(self, mouseClick): self.y += self.speed + 0.5*G self.speed += G if mouseClick == True: self.speed = SPEEDFLYCó thêm một tham số là mouseClick, vươn lên là này dùng để kiểm tra câu hỏi Click chuột.

Dòng if được cung cấp khá đối kháng giản. Nếu click chuột thì đặt tốc độ chim là SPEEDFLY.

Bây giờ, bài toán cần có tác dụng là bắt sự kiện nhấn vào và truyền vào hàm update, thêm đông đảo dòng code bên phía trong vòng lặp trò chơi như sau:

while True: mouseClick = False for sự kiện 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 mouseClick để đánh giá sự kiện nhấn vào và truyền vào hàm update. Trong tầm forthì tiến hành việc bắt sự khiếu nại MOUSEBUTTONDOWN, sự kiện này xẩy ra khi nút loài chuột được ấn vào.

Vậy là bọn họ đã xong xong phần của con chim. Trước khi sang phần mới, chúng ta nên chú ý lại đoạn code, nghĩ lại hầu hết dòng code xem bọn chúng có tính năng gì, chuyển động ra sao. Nếu nắm rõ mọi sản phẩm rồi thì bọn họ cùng lịch sự phần tiếp theo, sẽ là tạo các cái cột.

Tạo cột và hoạt động của cột

Tạo cột

Như sẽ biết thì sẽ có được những phần cột trên và mặt dưới. Khi mình kể tới 1 chiếc "cột" thì các bạn hãy đọc là có cả 2 phần và không gian giữa 2 phần nhe!

Bây giờ, chúng ta hãy gõ code trước đi. Mình sẽ giải thích những đoạn code đó sau.

Thêm một số trong những hằng số:

COLUMNWIDTH = 60COLUMNHEIGHT = 500BLANK = 160DISTANCE = 200COLUMNSPEED = 2COLUMNIMG = pygame.image.load("img/column.png")Tạo 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() def draw(self): for i in range(3): DISPLAYSURF.blit(self.surface, (self.ls<0>, self.ls<1> - self.height)) DISPLAYSURF.blit(self.surface, (self.ls<0>, self.ls<1> + self.blank))Trong hàm main làm tựa như như phần bé chim nhe. Tạo thay đổi columns, thêm hàm columns.draw() vào vòng lặp game.

def main(): bird = Bird() columns = Columns() while True: mouseClick = False for sự kiện 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)Rồi bây giờ thì hãy kiểm tra và coi thành quả. Sau đó, mang lại phần khám phá code thôi!

Bây tiếng hãy nhìn lại class Columns, vào hàm __init__ có khởi tạo một vài biến:

self.width là chiều rộng của cột.self.height là độ cao của 1 phần cột.self.blank là độ cao khoảng trống giữa 2 phần cột.self.distance là khoảng cách giữa những cột.self.speed là tốc độ dịch rời của cột (cột sẽ dịch rời sang trái).self.surface là surface của 1 phần cột.self.ls là một trong những list chứa tin tức về vị trí cột với vị trí khoảng trống. Cố kỉnh thể: 1 phần tử trong danh sách chứ thông tin của một cột, thành phần đó có dạng , trong những số đó x là hoành độ của cột, y là tung độ của khoảng tầm trống.

Vòng lặp for trong __init__ dùng để làm 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()Biến x là hoành độ của cột. Cột trước tiên được vẽ cạnh bên lề mặt trái, tức là x = 0. Các cột tiếp theo cách nhau một khoảng tầm bằng self.distance.Biến y là địa chỉ của khoảng tầm trống. đổi mới này nhận cực hiếm random để tạo nên những khoảng không có vị trí khác nhau.

*

Bây tiếng hãy coi hàm draw của class Columns.

def draw(self): for i in range(3): DISPLAYSURF.blit(self.surface, (self.ls<0>, self.ls<1> - self.height)) DISPLAYSURF.blit(self.surface, (self.ls<0>, self.ls<1> + self.blank))Vòng lặp for dùng để làm vẽ 3 cột, từng cột có 2 phần nên tất cả 2 dòng để vẽ phần trên và phần dưới.

Như vậy là chúng ta đã tạo ra được những cột, hiện giờ hãy sang phần tiếp theo sau để mày mò cách cho các chiếc cột di chuyển.

Tạo chuyển động cho cột

Như thường xuyên lệ, bọn họ sẽ thêm hàm update mang lại class Columns và ở vòng lặp game thì điện thoại tư vấn hàm columns.update() sau cái columns.draw(). Ý tưởng là sử dụng vòng lặp for để lặp qua 3 cột, so với mỗi cột thì hoành độ của nó sẽ bớt xuống. Nghe gồm vẻ dễ dàng và đơn giản nhỉ.

def update(self): for i in range(3): self.ls<0> -= self.speedChạy thử nhằm xem hiệu quả nhé. Những chiếc cột đã dịch rời sang trái rồi.

Tuy nhiên, bao gồm một vấn đề tại đây là họ mới chỉ tất cả 3 cột, trong những khi đó game đề xuất phải có nhiều (nếu không muốn nói là vô hạn) cột. Các chúng ta có thể tạo thật nhiều phần tử cho self.ls. Tuy nhiên, vấn đề đó nghe có vẻ không hiệu quả chút nào. Hãy nghĩ ra 1 ý tưởng phát minh mới nào, những cột sẽ dịch chuyển sang trái và khi 1 cột nào đó đi ra khỏi screen thì nó không còn tác dụng gì nữa, chúng ta có thể xoá cái cột kia đi và tạo một chiếc cột khác nối liền theo. Theo vậy thì self.ls vẫn vẫn chỉ gồm 3 phần tử, khi tới những thời điểm thích hợp sẽ tất cả 1 cột bị xoá đi với 1 cột được thêm vào.

*

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

def update(self): for i in range(3): self.ls<0> -= self.speed if self.ls<0><0> mẫu if được chế tạo để kiểm soát xem cột tất cả đi ra ngoài screen hay chưa.

Dòng self.ls.pop(0) nhằm xoá cột ở vị trí đầu tiên.

x là hoành độ cột thêm vào. Cột được chế tạo sẽ giải pháp cột cuối một khoảng chừng bằng self.distance. Do vừa xoá 1 cột rồi yêu cầu self.ls chỉ với 2 cột thôi.

y là tung độ khoảng trống của cột thêm vào, cũng rước giá trị random giống như các cột khác.

Các các bạn hãy chạy thử cùng xem công dụng nhe.

À cơ mà lúc nãy mình code loại cột trước tiên ở liền kề lề bên trái để tiện thể theo dõi thôi. Thực tế, trong game những cột vẫn ở mặt phải màn hình hiển thị rồi mới di chuyển qua. Yêu cầu ở vòng lặp for vào hàm __init__ các bạn sửa lại dòng x=i*self.distance thành x= WINDOWWIDTH +i*self.distance để cột thứ nhất nằm bên cần màn hình

Như vậy là bọn họ đã chấm dứt xong phần cột rồi! các bạn xem lại code để sẵn sàng sang phần tiếp sau nhé!

Xử lý va chạm

Va đụng giữa hai hình chữ nhật

Xử lý va chạm là 1 phần không thể thiếu hụt trong xây dựng game. Vào Flappy Bird sẽ sở hữu được sự va va giữa chim và cột, vày thế bọn họ cần phải ghi nhận rõ khi nào chim đã va chạm tới cột, từ kia viết đa số đoạn code để xử lý. Để cho đơn giản dễ dàng thì hãy coi chim là 1 trong những hình chữ nhật, 1 phần của cột (trên hoặc dưới) là 1 trong những hình chữ nhật. Họ cần viết một hàm để kiểm soát xem nhì hình chữ nhật tất cả va chạm tới nhau xuất xắc không. Hàm cần viết sẽ có 2 tham số truyền vào là 2 list chứa những thông số hình chữ nhật (hoành độ, tung độ, chiều rộng, chiều cao).

def rectCollision(rect1, rect2): if rect1<0> Cách thực hiện của hàm này rất đối chọi giản, truyền 2 "hình chữ nhật" vào hàm, hàm trả về True giả dụ 2 hình chữ nhật va nhau, ngược lại trả về False. Hàm này vận động thế làm sao thì chúng ta tự gọi code rồi khám phá nhe, mình sẽ sở hữu được một bài bác riêng để nói tới xử lý va chạm.

Kiểm tra gameover

Như chúng ta đã biết, khi chim chạm vào cột, chạm đất hoặc đi tương đối cao ra khỏi screen thì gameover. Ở trên họ đã gồm hàm để bình chọn sự va chạm giữa 2 hình chữ nhật rồi, bọn họ sẽ dùng hàm đó trong hàm khám nghiệm gameover. Các bạn thêm hàm isGameOver phía bên dưới hàm rectCollision nhe. Bản thân sẽ giải thích code sau.

def isGameOver(bird, columns): for i in range(3): rectBird = rectColumn1 = <0>, columns.ls<1> - columns.height, columns.width, columns.height> rectColumn2 = <0>, columns.ls<1> + columns.blank, columns.width, columns.height> if rectCollision(rectBird, rectColumn1) == True or rectCollision(rectBird, rectColumn2) == True: return True if bird.y + bird.height WINDOWHEIGHT: return True return FalseTrong hàm này các chúng ta cũng có thể thấy một vòng lặp for dùng để làm chạy qua 3 cột, chim chạm bất kể cột nào cũng gameover. Chúng ta xem các dòng code phía bên trong for nhé. đổi mới rectBird được tạo ra để chứa thông số kỹ thuật hình chữ nhật của chim. Tựa như thế, 2 đổi mới rectColumn1 với rectColumn2 là thông số kỹ thuật 2 hình chữ nhật của cột (mỗi cột gồm phần trên cùng phần dưới). Mẫu if phía bên trong vòng lặp for để chất vấn xem chim bao gồm chạm vào 1 trong những 2 phần cột giỏi không. Hàm rectCollision được dùng để làm kiểm tra sự va đụng giữa chim và một phần cột. Ví như chim đụng vào một trong các 2 phần cột thì hàm isGameOver trả về quý hiếm True.

Dòng if dưới vòng for dùng để kiểm tra thêm trường hòa hợp chim đụng đất hoặc bay quá cao. Loại này cũng dễ dàng và đơn giản thôi!

Vậy là chúng ta đã bao gồm một hàm để tìm hiểu lúc như thế nào thì gameover. Hãy kiểm tra buổi giao lưu của hàm này nhe! chúng ta hãy thêm đoạn code này vào trong vòng lặp game.

if isGameOver(bird, columns) == True: pygame.quit() sys.exit()Đoạn này nhìn vào thì cũng hiểu ngay. Khi bình chọn thấy gameover thì kết thúc game luôn. Chúng ta tự test nhé!

Vậy là họ đã kết thúc phần cách xử lý va đụng rồi. Tiếp theo bọn họ sẽ tìm phương pháp tính điểm trong trò chơi nhe!

Tính điểm

Trong game, nếu con chim đi sang một cột thì sẽ tiến hành cộng thêm điểm. Vậy làm thế nào để biết chim đi sang 1 cột?? trong phần trước, họ đã có hàmrectCollision để kiểm tra sự va đụng của 2 hình chữ nhật. Bởi vì vậy, bạn cũng có thể tận dụng hàm này bằng phương pháp tạo một hình chữ nhật vùng sau cột, tạm gọi là "hình chữ nhật tính điểm", giả dụ chim va vào hình chữ nhật đó thì sẽ thêm vào đó điểm. Các bạn có thể xem hình minh hoạ bên dưới đây.

*

Các các bạn sẽ tạo một class Score như bên dưới. Nhìn nó gồm vẻ phức hợp đấy, bản thân sẽ phân tích và lý giải sau.

class Score(): def __init__(self): self.score = 0 self.addScore = True def draw(self): phông = 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 = <0> + columns.width, columns.ls<1>, 1, columns.blank> rectBird = if rectCollision(rectBird, rectColumn) == True: collision = True break if collision == True: if self.addScore == True: self.score += 1 self.addScore = False else: self.addScore = TrueTrong hàm main, các bạn nhớ chế tạo thêm biến chuyển score và điện thoại tư vấn 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)Xong rồi, bây giờ chúng ta cùng nhìn lại class Score. Vào hàm __init__ bao gồm 2 biến, self.score đó là số điểm, còn trở thành self.addScore dùng làm kiểm tra xem đạt được cộng thêm ưu điểm không.

Tại sao lại sở hữu biến self.addScore và vươn lên là này sử dụng như thế nào?? vào game, khi chim trải qua cột sẽ va vào "hình chữ nhật tính điểm" không ít lần. Mặc dù nhiên, các lần chim qua cột chỉ tính một điểm thôi, chính vì vậy biến này để bọn họ cộng thêm điểm vào lần đụng đầu tiên.

Điểm chỉ được cùng khi self.addScore là True. Ban sơ thì self.addScore = True, khi chim va vào "hình chữ nhật tính điểm" thứ 1 thì sẽ được cộng điểm vàself.addScore nhận giá trị False. Nếu như chim đi qua khỏi "hình chữ nhật tính điểm", tức là không chạm vào nó nữa thìself.addScore nhận cực hiếm True để sẵn sàng cộng điểm đến lần va tiếp theo. Nếu các bạn thấy rối quá thì có thể xem hình bên dưới nhe!

*

Hàm draw vào class Score chỉ dùng để làm vẽ điểm thôi, không tồn tại gì phức hợp nên mình không lý giải hàm này.

Các bạn chú ý hàm update nhé. Trở nên collision để kiểm tra xem chim gồm chạm "hình chữ nhật tính điểm" xuất xắc không. Cũng tương tự như hàm isGameOver, gồm một vòng for để chạy qua 3 cột, thay đổi rectColumn chính là "hình chữ nhật tính điểm", rectBird là hình chữ nhật của chim, vẫn dùng hàm rectCollision để soát sổ va chạm.

Những loại code bên dưới là để cộng thêm điểm cho phát triển thành self.score và điều chỉnh biến self.addScore đến phù hợp. Các dòng code hoạt động theo như phần giải thích ở trên.

Vậy là họ đã gần hoàn chỉnh game Flappy Bird rồi. Chúng ta chạy test để khám nghiệm nhé. Nếu thấy khó khăn để kiểm soát thì hoàn toàn có thể điều chỉnh những hằng số nhé (tăng chiều cao khoảng trống, giảm tốc độ cột ...). Nếu thấy ok rồi thì nên sang phần sau cuối nào!

Tạo những màn cho game và hoàn hảo game

Như các bạn đã thấy thì trò chơi của họ vẫn không hoàn chỉnh. Ví như khi bước đầu game thì cần có 1 màn hình hiển thị bắt đầu, sau khi click chuột thì mới vào chơi. Sau thời điểm gamover thì cũng cần có màn hình gameover rồi có thể cho nghịch lại chẳng hạn. Bây chừ chúng ta cùng tạo các màn như thế nhé.

Chúng ta sẽ tạo nên 3 phần giản thôi: ban đầu game, chơi, gameover. Họ sẽ viết 3 hàm tương xứng là gameStart, gamePlay, gameOver.

gamePlay

Thực chất thì mẫu vòng lặp game bọn họ code trường đoản cú trước cho giờ là của màn game play thôi. Bọn họ sẽ chế tạo hàm gameplay như sau:

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 chỉnh lại hàm main như sau:

def main(): bird = Bird() columns = Columns() score = Score() while True: gamePlay(bird, columns, score)Khi chạy hàm gameplay thì những giá trị của bird, columns, score sẽ được đặt lại bằng việc gọi hàm __init__ với chỗ bé chim thì cho nó cất cánh lên 1 cái. Khi kiểm tra thấy gameOver thì kết thúc hàm.

gameStart

Hàm này thì quá dễ dàng và đơn giản rồi, chỉ việc bố trí những hình ảnh, loại chữ sao cho đẹp mắt thôi. Hình như thì bọn họ chỉ yêu cầu thêm việc bắt sự kiện Click chuột rồi ngừng hàm (chuyển thanh lịch gamePlay).

def gameStart(bird): bird.__init__() font = pygame.font.SysFont("consolas", 60) headingSuface = font.render("FLAPPY BIRD", True, (255, 0, 0)) headingSize = headingSuface.get_size() fonts = pygame.font.SysFont("consolas", 20) commentSuface = font.render("Click lớn 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ũng nhớ gọi hàm này nhe:

def main(): bird = Bird() columns = Columns() score = Score() while True: gameStart(bird) gamePlay(bird, columns, score)gameOverCác các bạn thêm hàm gameOver vào luôn luôn nhe, cũng chỉ là vẽ chữ, vẽ số điểm thôi. Hàm này thì bắt sự kiện dấn phím space để chấm dứt hàm.

Xem thêm: 15 Mẹo Chơi Game Bắn Cá Tăng Xác Suất Trúng Thưởng Cực Cao Thủ

def gameOver(bird, columns, score): fonts = pygame.font.SysFont("consolas", 60) headingSuface = font.render("GAMEOVER", True, (255, 0, 0)) headingSize = headingSuface.get_size() phông = pygame.font.SysFont("consolas", 20) commentSuface = font.render("Press "space" to lớn 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)Xong rồi thì nhớ chỉnh hàm main luôn.

def main(): bird = Bird() columns = Columns() score = Score() while True: gameStart(bird) gamePlay(bird, columns, score) gameOver(bird, columns, score)Thế là chấm dứt rồi. Code của bọn họ đã như là với đoạn code không thiếu rồi. Các bạn chạy thử cùng xem thành quả đó đi!

Kết

Vậy là họ đã ngừng xong trò chơi Flappy Bird với pygame. Các bạn cũng có thể thêm những tính năng vượt trội (thêm điểm cao, thêm huy chương...) cho game thú vui hơn. Bài bác hướng dẫn đến đây là ngừng rồi. Mình vẫn còn ra những bài bác hướng dẫn tiếp theo sau về pygame, các bạn nhớ đón coi nhe! trợ thì biệt và hẹn chạm chán lại!