資源簡介 (共48張PPT)Python少兒編程第十一章 一起來創作——Flappy Bird目錄1.1需求分析1.2模塊設計1.2功能實現PART 01需求分析需求分析1小舞和小藍在游戲城中參與了多個游戲,最后他們的賬戶中分別都有了7枚徽章。他們覺得這樣獲得徽章的速度太慢,于是找到游戲城的主人,想給他開發一個新游戲——Flappy Bird。主人非常樂意,并承諾如果游戲測試成功將給他們6枚徽章,這樣他們就可以離開Python編程世界了。游戲功能如下。使用鼠標控制小鳥通過上下管道的間隙,如果小鳥碰到管道或窗口則游戲結束,實時顯示得分(即小鳥通過的管道數),詳細需求如下。(1)單擊鼠標開始游戲和控制小鳥飛行。(2)隨機生成管道位置,實現上下管道間隙的大小不同。(3)移動地面和管道模擬小鳥向前飛行。(4)小鳥和管道的碰撞檢測。(5)小鳥飛行、碰撞和得分時添加音效。(6)顯示游戲得分。PART 02模塊設計模塊設計2根據Flappy Bird游戲需求,可將程序分為5大模塊,分別是資源文件夾模塊、配置文件模塊、類包模塊、游戲包模塊和主模塊,如圖11-1所示。圖11-1 Flappy Bird程序模塊設計模塊設計2(1)資源文件夾模塊用于保存圖片、聲音和字體等資源文件。(2)配置文件模塊用于保存常量和資源路徑。(3)類包模塊包含管道類模塊和小鳥類模塊,實現管道和小鳥的初始化和更新等功能。(4)游戲包模塊包含游戲開始模塊、游戲進行模塊和游戲結束模塊,實現顯示游戲開始界面、操作游戲和顯示游戲結束界面等功能。(5)主模塊實現初始化游戲、加載資源、顯示得分和控制游戲流程等功能,然后循環控制游戲流程。PART 03功能實現創建資源文件夾3.1游戲需要加載圖片、添加音效和顯示得分,因此,須在當前工作目錄的resources文件夾下創建3個文件夾保存相關資源文件。(1)創建名為images的文件夾保存圖片,包括背景、開始游戲、結束游戲、管道、小鳥、地面等圖片。其中,小鳥圖片又包括翅膀處于上、中和下3種形態的圖片,用于模擬小鳥的飛行。(2)創建名為audios的文件夾保存聲音,包括小鳥飛行、死亡、碰撞管道和通過管道得分時的音效。(3)創建名為fonts的文件夾保存字體文件,用于顯示得分。創建配置文件3.2創建配置文件cfg.py,保存常量和資源路徑,實現代碼如下。FPS = 60 #定義FPSSCREENWIDTH = 300 #定義窗口寬SCREENHEIGHT = 500 #定義窗口高PIPE_GAP_SIZE = 100 #定義上下管道間隙大小#定義字典,保存小鳥3種形態圖片路徑BIRD_IMAGE_PATHS = {'up': 'resources/images/bird_up.png','mid': 'resources/images/bird_mid.png','down': 'resources/images/bird_down.png'}創建配置文件3.2#定義背景圖片路徑BACKGROUND_IMAGE_PATHS = 'resources/images/background.png'#定義管道圖片路徑PIPE_IMAGE_PATHS = 'resources/images/pipe.png'#定義字典,保存游戲開始、游戲結束、地面圖片路徑OTHER_IMAGE_PATHS = {'gamestart': 'resources/images/gamestart.png','gameover': 'resources/images/gameover.png','base': 'resources/images/base.png'}創建配置文件3.2#定義字典,保存音效文件路徑AUDIO_PATHS = {'die': 'resources/audios/die.wav','hit': 'resources/audios/hit.wav','point': 'resources/audios/point.wav','wing': 'resources/audios/wing.wav'}#定義字體文件路徑FONT_PATHS = 'resources/fonts/simkai.ttf'創建類包3.3(1)定義管道類Piple繼承pygame.sprite.Sprite類,在有參構造方法中調用父類的構造方法,然后使用傳遞的參數初始化圖片和得分標志等相關變量,實現代碼如下。1.創建管道類import randomimport pygame'''定義Pipe類,繼承pygame.sprite.Sprite類'''class Pipe(pygame.sprite.Sprite):def __init__(self, image, position, **kwargs):pygame.sprite.Sprite.__init__(self) #調用父類構造方法self.image = image #初始化管道圖片self.rect = self.image.get_rect() #獲取圖片的rect#將圖片x和y坐標賦給圖片的左側和頂部位置self.rect.left, self.rect.top = positionself.used_for_score = False #得分標志賦為False創建類包3.3(2)在Pipe類中定義靜態方法randomPipe()生成上下管道初始位置并返回,其中y方向位置隨機生成,實現代碼如下。1.創建管道類'''隨機生成管道初始位置'''@staticmethoddef randomPipe(cfg, image):base_y = 0.79 * cfg.SCREENHEIGHT #定義基準位置#定義y方向位置取值范圍的最大值up_y = int(base_y * 0.6 - cfg.PIPE_GAP_SIZE)#隨機生成y方向位置y = int(base_y * 0.2) + random.randrange(0, up_y)#返回一組上下管道的位置,top表示上管道,bottom表示下管道return {'top': (cfg.SCREENWIDTH + 10, y - image.get_height()),'bottom': (cfg.SCREENWIDTH + 10, y + cfg.PIPE_GAP_SIZE)}創建類包3.3(1)定義小鳥類Bird繼承pygame.sprite.Sprite類,在有參構造方法中調用父類構造方法,然后使用傳遞的參數初始化圖片、y方向運動變量、切換小鳥形態變量等,實現代碼如下。2.創建小鳥類import pygameimport itertools'''定義Bird類,繼承pygame.sprite.Sprite類'''class Bird(pygame.sprite.Sprite):def __init__(self, images, id, position, **kwargs):pygame.sprite.Sprite.__init__(self) #調用父類構造方法self.images = images #初始化小鳥圖片字典#將小鳥圖片字典的值轉換為列表,并獲取索引為id的圖片self.image = list(images.values())[id]self.rect = self.image.get_rect() #獲取當前圖片的rect創建類包3.32.創建小鳥類#將圖片x和y坐標賦給圖片的左側和頂部位置self.rect.left, self.rect.top = position#定義y方向運動變量,包括飛行標志、上升速度和下落速度self.is_flapped = Falseself.up_speed = 9self.down_speed = 0#切換小鳥形態變量,包括圖片索引及其迭代器、索引計數#迭代器包含一個小鳥飛行周期內圖片索引取值self.bird_id = idself.bird_id_cycle = itertools.cycle([0, 1, 2, 1])self.bird_id_change_count = 0創建類包3.3(2)在Bird類中定義update()方法,更新小鳥位置和形態,參數為上下邊界位置和時間間隔(時鐘的間隔時間/1000,用于計算上升和下落速度),返回死亡狀態。該方法實現判斷小鳥飛行狀態(上升或下落),是否碰撞上下邊界而死亡,并模擬小鳥扇動翅膀。2.創建小鳥類'''更新小鳥位置和形態'''def update(self, boundary, time_passed):if self.is_flapped: #如果飛行標志為True即上升self.up_speed -= 60 * time_passed #計算上升速度self.rect.top -= self.up_speed #計算圖片的頂部位置if self.up_speed <= 0: #如果上升速度小于0self.is_flapped = False #設置飛行標志為False即下落self.up_speed = 9 #設置上升速度為9self.down_speed = 0 #設置下落速度為0創建類包3.32.創建小鳥類else:self.down_speed += 40 * time_passed #計算下落速度self.rect.bottom += self.down_speed #計算圖片底部位置'''判斷小鳥是否碰撞上下邊界'''is_dead = False #定義死亡標志,賦初值為False#如果圖片底部位置大于下邊界,死亡標志賦為True#圖片底部值賦為下邊界,保證小鳥停在下邊界位置,不繼續下落if self.rect.bottom > boundary[1]:is_dead = Trueself.rect.bottom = boundary[1]#如果圖片頂部位置小于上邊界,死亡標志賦為True#圖片頂部值賦為上邊界,保證小鳥停在上邊界位置,不繼續上升if self.rect.top < boundary[0]:is_dead = Trueself.rect.top = boundary[0]創建類包3.32.創建小鳥類'''切換小鳥形態模擬扇動翅膀'''self.bird_id_change_count += 1 #索引計數加1#如果圖片索引計數是5的倍數,表示循環5次切換一次小鳥形態if self.bird_id_change_count % 5 == 0:#將迭代器的下一個值賦給圖片索引self.bird_id = next(self.bird_id_cycle)#獲取索引對應的圖片self.image = list(self.images.values())[self.bird_id]self.bird_id_change_count = 0 #索引計數賦為0return is_dead #返回死亡標志創建類包3.3(3)在Bird類中定義setFlapped()方法設置小鳥的飛行模式,在游戲中單擊鼠標時調用,實現代碼如下。2.創建小鳥類'''設置為飛行模式'''def setFlapped(self):if self.is_flapped: #如果飛行標志為True,重新設置上升速度self.up_speed = max(12, self.up_speed+1)else: #如果飛行標志為False,則設置為Trueself.is_flapped = True(4)在Bird類中定義draw()方法繪制小鳥,實現代碼如下。'''繪制小鳥'''def draw(self, screen):screen.blit(self.image, self.rect) #繪制圖片創建游戲包3.41.創建游戲開始模塊在game_package包中創建游戲開始模塊start_game.py,在其中定義startGame()函數顯示開始界面,包括背景、開始圖片、向左移動的地面和在指定范圍內飛行的小鳥,并實現單擊開始游戲。首先計算地面圖片和開始圖片位置,定義小鳥相關變量,創建時鐘對象,然后開始無限循環。循環中,首先,解析資源元組(即加載資源的返回值),將元素分別賦給對應的變量;其次,獲取事件并遍歷,如果為退出事件,則關閉窗口,如果為單擊事件,則返回小鳥位置和索引、地面位置,并退出循環;接著,播放飛行音效,每循環5次通過iterator(迭代器)的next()方法切換小鳥圖片,并模擬小鳥在指定范圍內上下飛行;然后,重新計算小鳥和地面位置,并繪制背景、開始圖片、地面和小鳥;最后,刷新繪圖,以及設置時鐘的時間間隔。實現代碼如下。創建游戲包3.41.創建游戲開始模塊import pygame, sysimport itertoolsimport cfg'''顯示開始界面'''def startGame(screen, resource):'''將resource的元素分別賦給sounds、bird_images、other_images、backgroud_image'''sounds = resource[0]bird_images = resource[2]other_images = resource[3]backgroud_image = resource[4]base_pos = [0, cfg.SCREENHEIGHT*0.93] #計算地面位置創建游戲包3.41.創建游戲開始模塊#計算地面和背景的寬度差base_diff_bg = (other_images['base'].get_width()- backgroud_image.get_width())#計算開始圖片位置x = (cfg.SCREENWIDTH - other_images['gamestart'].get_width()) / 2y = cfg.SCREENHEIGHT * 0.12msg_pos = [x, y]bird_id = 0 #定義小鳥圖片索引bird_id_change_count = 0 #定義切換小鳥形態計數#定義迭代器,包含一個小鳥飛行周期內圖片索引取值bird_id_cycle = itertools.cycle([0, 1, 2, 1])創建游戲包3.41.創建游戲開始模塊#計算小鳥位置x = cfg.SCREENWIDTH * 0.2y=(cfg.SCREENHEIGHT-list(bird_images.values())[0].get_height())/2bird_pos = [x, y]bird_y_shift_count = 0 #定義y坐標偏移計數bird_y_shift_max = 16 #定義y坐標最大偏移計數shift = 1 #定義y坐標偏移量clock = pygame.time.Clock() #創建時鐘創建游戲包3.41.創建游戲開始模塊while True: #無限循環for event in pygame.event.get(): #獲取事件并遍歷if event.type == pygame.QUIT: #如果為退出事件pygame.quit() #退出pygamesys.exit() #退出系統#如果為單擊事件elif event.type == pygame.MOUSEBUTTONDOWN:#返回小鳥位置、地面位置和小鳥圖片索引return {'bird_pos':bird_pos,'base_pos':base_pos,'bird_id': bird_id}sounds['wing'].play() #播放小鳥飛行音效bird_id_change_count += 1 #切換形態計數加1創建游戲包3.41.創建游戲開始模塊#如果切換形態計數是5的倍數,切換小鳥圖片if bird_id_change_count % 5 == 0:bird_id = next(bird_id_cycle)bird_y_shift_count += 1 #y坐標偏移計數加1#如果y坐標偏移計數等于最大值if bird_y_shift_count == bird_y_shift_max:shift = -1 * shift #y坐標偏移取反bird_y_shift_count = 0 #y坐標偏移計數賦0#計算地面x坐標,左移4像素#除以base_diff_bg求余為了保證地面圖片的連續base_pos[0] = -((-base_pos[0] + 4) % base_diff_bg)bird_pos[1] = bird_pos[1] + shift #計算小鳥y坐標screen.blit(backgroud_image, (0, 0)) #繪制背景圖片創建游戲包3.41.創建游戲開始模塊#繪制小鳥圖片screen.blit(list(bird_images.values())[bird_id], bird_pos)#繪制開始圖片screen.blit(other_images['gamestart'], msg_pos)#繪制地面圖片screen.blit(other_images['base'], base_pos)pygame.display.update() #刷新繪圖clock.tick(cfg.FPS) #設置時鐘的時間間隔創建游戲包3.42.創建游戲進行模塊在game_package包中創建游戲進行模塊run_game.py,在其中定義runGame()函數實現游戲中的操作。首先,創建管道精靈組,循環兩次,計算每組上下管道的初始位置,并添加到組中,以及創建小鳥精靈;然后,進入循環,循環標志為True;最后,調用函數顯示結束界面。循環中執行如下操作。(1)解析資源元組,將元素分別賦給對應的變量。(2)獲取事件并遍歷,如果為退出事件,則關閉窗口;如果為單擊事件,則調用Bird的setFlapped()方法,并播放飛行音效。(3)將小鳥精靈和管道精靈組進行碰撞檢測,如果碰撞,則設置循環標志為False,并播放碰撞音效。創建游戲包3.42.創建游戲進行模塊(4)更新小鳥,判斷小鳥是否碰撞上下界限而死亡,如果死亡,則設置循環標志為False,并播放碰撞音效。(5)向左移動管道和地面模擬小鳥向前飛(確保兩者移動速度一致),如果管道右側位置小于小鳥右側位置,且得分標志為False,得分加0.5(由于管道分為上、下兩個管道,通過一組管道會判斷兩次,所以兩次得分相加為1),并將得分標志設為True;如果管道左側位置小于5大于0,且添加管道標志為True,則在管道精靈組中添加一個管道;如果管道右側位置小于0,則從管道精靈組中移除管道。(6)繪制圖形,刷新繪圖,設置時鐘的時間間隔。創建游戲包3.42.創建游戲進行模塊#導入模塊from class_package.pipe import Pipefrom class_package.bird import Birdimport cfgimport pygame, sys'''進入游戲'''def runGame(screen, resource, game_start_info, showScore):'''將resource的元素分別賦給sounds、pipe_images、bird_images、other_images、backgroud_image'''sounds = resource[0]pipe_images = resource[1]bird_images = resource[2]other_images = resource[3]backgroud_image = resource[4]score = 0 #定義得分,初值賦為0創建游戲包3.42.創建游戲進行模塊#獲取游戲開始界面的信息,包括小鳥位置、地面位置和小鳥圖片索引bird_pos,base_pos,bird_id=list(game_start_info.values())base_diff_bg = (other_images['base'].get_width()- backgroud_image.get_width())clock = pygame.time.Clock() #創建時鐘pipe_sprites = pygame.sprite.Group() #創建管道精靈組for i in range(2): #循環兩次pipe_pos = Pipe.randomPipe(cfg, pipe_images.get('top')) #隨機生成管道位置#計算上管道位置,并將管道對象添加到精靈組中pipe_pos_top = (cfg.SCREENWIDTH + i * cfg.SCREENWIDTH / 2,pipe_pos.get('top')[1])pipe_sprites.add(Pipe(pipe_images.get('top'),pipe_pos_top))#計算下管道位置,并將管道對象添加到精靈組中pipe_pos_bottom=(cfg.SCREENWIDTH + i * cfg.SCREENWIDTH / 2,pipe_pos.get('bottom')[1])pipe_sprites.add(Pipe(pipe_images.get('bottom'),pipe_pos_bottom))創建游戲包3.42.創建游戲進行模塊#創建小鳥精靈bird = Bird(bird_images, bird_id, bird_pos)is_add_pipe = True #定義添加管道標志,賦初值為Trueis_game_running = True #定義游戲進行標志,賦初值為Truewhile is_game_running: #循環,直到游戲標志為Falsefor event in pygame.event.get(): #獲取事件并遍歷if event.type == pygame.QUIT: #如果為退出事件pygame.quit() #退出pygamesys.exit() #退出系統#如果為單擊事件elif event.type == pygame.MOUSEBUTTONDOWN:bird.setFlapped() #調用Bird的setFlapped()方法sounds['wing'].play() #播放飛行音效創建游戲包3.42.創建游戲進行模塊'''碰撞檢測'''for pipe in pipe_sprites: #遍歷管道精靈組#如果小鳥精靈和管道精靈組的任一精靈碰撞if pygame.sprite.collide_mask(bird, pipe):is_game_running = False #游戲進行標志設為Falsesounds['hit'].play() #播放碰撞音效return score, bird, pipe_sprites, base_pos'''更新小鳥,判斷小鳥是否死亡'''boundary = [0, base_pos[1]] #定義上下界限#更新小鳥位置和狀態,返回死亡標志is_dead=bird.update(boundary,float(clock.tick(cfg.FPS))/1000)if is_dead: #如果小鳥死亡is_game_running = False #游戲進行標志設為Falsesounds['hit'].play() #播放碰撞音效return score, bird, pipe_sprites, base_pos創建游戲包3.42.創建游戲進行模塊#計算地面x坐標base_pos[0] = -((-base_pos[0] + 4) % base_diff_bg)'''移動管道,模擬小鳥向前飛,并判斷是否從管道精靈組添加和移除管道、以及計算得分'''for pipe in pipe_sprites:pipe.rect.left -= 4 #管道左移4像素#如果管道右側位置小于小鳥右側位置(穿過管道),且得分標志為Falseif (pipe.rect.right < bird.rect.rightand not pipe.used_for_score):pipe.used_for_score = True #得分標志設為Truescore += 0.5 #統計得分sounds['point'].play() #播放得分音效創建游戲包3.42.創建游戲進行模塊#如果管道左側位置小于5大于0,且添加管道標志為Trueif (pipe.rect.left < 5 and pipe.rect.left > 0and is_add_pipe):#隨機生成管道位置,且將上下管道添加到精靈組中pipe_pos = Pipe.randomPipe(cfg, pipe_images.get('top'))pipe_sprites.add(Pipe(pipe_images.get('top'),pipe_pos.get('top')))pipe_sprites.add(Pipe(pipe_images.get('bottom'),pipe_pos.get('bottom')))is_add_pipe = False #添加管道標志設為Falseelif pipe.rect.right < 0: #如果管道右側位置小于0pipe_sprites.remove(pipe) #從管道精靈組中移除管道is_add_pipe = True #添加管道標志設為True創建游戲包3.42.創建游戲進行模塊screen.blit(backgroud_image, (0, 0)) #繪制背景pipe_sprites.draw(screen) #繪制管道screen.blit(other_images['base'], base_pos) #繪制地面showScore(screen, score) #顯示得分bird.draw(screen) #繪制小鳥pygame.display.update() #刷新繪圖clock.tick(cfg.FPS) #設置時鐘的時間間隔創建游戲包3.43.創建游戲結束模塊在game_package包中創建游戲結束模塊end_game.py,在其中定義endGame()函數顯示結束界面,包括背景、結束圖片、地面和下落到地面的小鳥,并實現單擊返回開始界面。首先播放死亡音效和創建時鐘對象,然后開始循環。在循環中,首先,解析資源元組,將元素分別賦給對應的變量;其次,獲取事件并遍歷,如果為退出事件,則關閉窗口,如果為單擊事件,則退出循環;然后,重新繪制背景、地面、管道,調用showScore()方法顯示得分,并設置小鳥飛行的上下界限,調用Bird類的update()和draw()方法更新和繪制小鳥;最后,刷新繪圖,以及設置時鐘的時間間隔。實現代碼如下。創建游戲包3.43.創建游戲結束模塊import pygame, sysimport cfg'''顯示游戲結束界面'''def endGame(screen,resource,showScore,score,bird,pipe_sprites,base_pos):'''將resource的元素分別賦給sounds、other_images、backgroud_image'''sounds = resource[0]other_images = resource[3]backgroud_image = resource[4]sounds['die'].play() #播放死亡音效clock = pygame.time.Clock() #創建時鐘創建游戲包3.43.創建游戲結束模塊while True:for event in pygame.event.get(): #獲取事件并遍歷if event.type == pygame.QUIT: #如果為退出事件pygame.quit() #退出pygamesys.exit() #退出系統#如果為單擊事件elif event.type == pygame.MOUSEBUTTONDOWN:return #返回None,退出循環screen.blit(backgroud_image, (0, 0)) #繪制背景pipe_sprites.draw(screen) #繪制管道screen.blit(other_images['base'], base_pos) #繪制地面創建游戲包3.43.創建游戲結束模塊#計算結束圖片位置x=(cfg.SCREENWIDTH-other_images['gamestart'].get_width())/2y = cfg.SCREENHEIGHT * 0.4msg_pos = [x, y]#繪制結束圖片screen.blit(other_images['gameover'], msg_pos)showScore(screen, score) #顯示得分boundary = [0, base_pos[1]] #定義上下界限#更新小鳥bird.update(boundary,float(clock.tick(cfg.FPS))/1000)bird.draw(screen) #繪制小鳥pygame.display.update() #刷新繪圖clock.tick(cfg.FPS) #設置時鐘的時間間隔創建主模塊3.51.導入模塊主模塊中會調用其他模塊中的類和函數,因此,須首先導入相關模塊。#導入模塊from game_package.run_game import *from game_package.start_game import *from game_package.end_game import *import pygame創建主模塊3.52.定義初始化游戲函數定義initGame()函數初始化pygame和pygame.mixer,設置窗口大小和標題,并返回窗口對象,實現代碼如下。'''游戲初始化'''def initGame():pygame.init() #初始化pygamepygame.mixer.init() #初始化pygame.mixer#設置窗口大小screen=pygame.display.set_mode((cfg.SCREENWIDTH,cfg.SCREENHEIGHT))pygame.display.set_caption('Flappy Bird') #設置窗口標題return screen #返回screen創建主模塊3.53.定義加載資源函數定義loadResource()函數加載圖片和聲音資源,將聲音、管道、小鳥和其他圖片保存在字典中,背景圖片保存在變量中,并返回字典和變量,實現代碼如下。'''加載游戲資源'''def loadResource():sounds = dict() #定義聲音字典#遍歷聲音路徑字典,加載聲音,并保存在聲音字典中for key, value in cfg.AUDIO_PATHS.items():sounds[key] = pygame.mixer.Sound(value)pipe_images = dict() #定義管道圖片字典#加載下管道圖片并添加到字典中pipe_images['bottom'] = pygame.image.load(cfg.PIPE_IMAGE_PATHS)創建主模塊3.53.定義加載資源函數#將下管道圖片旋轉180度作為上管道圖片,并添加到字典中pipe_images['top'] = pygame.transform.rotate(pipe_images['bottom'], 180)bird_images = dict() #定義小鳥圖片字典#遍歷小鳥圖片路徑字典,加載小鳥圖片,并保存在小鳥圖片字典中for key, value in cfg.BIRD_IMAGE_PATHS.items():bird_images[key] = pygame.image.load(value)#加載背景圖片,并保存到變量中backgroud_image = pygame.image.load(cfg.BACKGROUND_IMAGE_PATHS)other_images = dict() #定義其他圖片字典,保存開始、結束、地面圖片#遍歷其他圖片路徑字典,加載其他圖片,并保存在其他圖片字典中for key, value in cfg.OTHER_IMAGE_PATHS.items():other_images[key] = pygame.image.load(value)#返回字典和變量return sounds,pipe_images,bird_images,other_images,backgroud_image創建主模塊3.54.定義顯示得分函數定義showScore()函數顯示得分,在該函數中首先加載字體文件,然后配置顯示的文字,最后獲取文字對象的rect,并設置對象的中心坐標后,繪制文字,實現代碼如下。'''顯示得分'''def showScore(screen, score):#通過字體文件獲得字體對象font = pygame.font.Font(cfg.FONT_PATHS, 25)#配置顯示的文字textSurface=font.render('得分:{}'.format(int(score)),True,(255,0,0))textRect = textSurface.get_rect() #獲取文字對象的rect#設置文字對象的中心坐標textRect.center = (screen.get_width()/2, 20)screen.blit(textSurface, textRect) #繪制文字創建主模塊3.55.定義主函數定義main()函數,在其中調用初始化游戲、加載資源、顯示開始界面、進行游戲和顯示結束界面等函數,完成一次游戲,實現代碼如下。'''主函數'''def main():screen = initGame() #初始化游戲#加載游戲資源,并將返回值賦給resourceresource = loadResource()#顯示游戲開始界面game_start_info = startGame(screen, resource)#進行游戲score, bird, pipe_sprites, base_pos = runGame(screen, resource, game_start_info, showScore)#顯示游戲結束界面endGame(screen, resource, showScore, score, bird, pipe_sprites, base_pos)創建主模塊3.56.運行程序循環調用主函數運行程序,實現代碼如下。while True:main()游戲開始界面、運行界面和結束界面如圖11-2所示。圖11-2 Flappy Bird游戲界面感謝觀看 展開更多...... 收起↑ 資源預覽 縮略圖、資源來源于二一教育資源庫