python遊戲開發:(胖鳥快飛)
我們用第三方庫pygame和python的基本語法來開發,此款遊戲程式碼行數不超過100行,即使是初學者也可以輕鬆地瞭解。最重要的是,透過開發這個遊戲不僅可以穩固python的基礎知識,而且能讓枯燥的程式碼變得鮮活生動,就像是做飯一樣。
pygame安裝:pip install pygame;(有編譯器的小夥伴可以在setting中進行匯入)
第一步:瞭解遊戲的基礎框架;遊戲的形成就是執行介面的不停重新整理,而死迴圈恰好就能實現此種功能,迴圈體內部就是遊戲主體模組;
import pygame,timefrom pygame.locals import *#匯入庫檔案img=pygame.image.load('圖片url')#載入圖片素材 def GameOver(): pygame.quit()#遊戲退出 def main(): pygame.init()#遊戲初始化 windowSize=pygame.display.set_mode([480,640])#遊戲視窗介面 pygame.display.set_caption('遊戲名稱')#遊戲標題設定 pygame.display.update()#遊戲介面重新整理 while True: '''遊戲主體模組''' '''事件響應''' for event in pygame.event.get(): if event.type==QUIT: pygame.quit()#遊戲退出 windowsSize.fill(pygame.Color(R,G,B))#窗體背景顏色填充,預設為黑色 pygame.display.update()#遊戲介面重新整理 time.sleep('休眠時間')#一般是0.05-0.09 if __name__=='__main__': main()#主函式
執行結果:(背景色為黑色的,大小為480*640的窗體)
第二步:繪製簡單影象並實現簡單的按鍵響應;首先我們要理解什麼是面向物件的概念,並透過恰當的方式構造我們所需要的類,以方便我們的後序操作;
class Bird:#胖鳥類 position=[30,200]#鳥的初始位置 birdColor=pygame.Color(255,255,0)#一隻黃色的小鳥 speed=1#小鳥的速度 bird_score=0#小鳥得分
在定義完類之後我們可以透過此模板來例項化一個胖鳥物件:bird=Bird();
之後我們在構造自己的Draw方法,來實現簡單的圖形繪製;(pygame提供了draw來實現簡單影象的繪製這裡我們來繪製一個簡單的矩形。)
python函式的定義與使用:
def DrawRect(windowsSize,bird): pygame.draw.rect(windowsSize,bird.birdColor,Rect(bird.position[0],bird.position[1],30,30))
執行結果:(在幕布上出現了一個黃色的矩形,也就是我們的胖鳥,後期我們會讓它更加生動)
那麼問題又來了,如何使這個小胖鳥透過按鍵響應來動起來呢。pygame提供了type屬性來判斷按鍵的狀態以及key屬性來判斷哪一個按鍵被觸發,根據不同的情況來響應不同的事件。
flag=0#這裡我們加一個標誌位,如果鳥想要飛就不會下降for event in pygame.event.get(): if event.type == QUIT: GameOver() #遊戲退出 elif event.type==KEYDOWN:#按鍵響應 if event.key==K_SPACE: bird.position[1]=bird.position[1]-bird.speed*50*level #根據等級胖鳥上升或下降 flag=1if flag==0:#檢測位 bird.position[1]=bird.position[1]+bird.speed*10*levelflag=0
做到這裡是不是開始覺得有點遊戲的樣子了,我們的小胖鳥可以根據我們按空格的頻率上升或下降了(哈哈);
第三步:障礙物的製作與移動;同構造鳥類一樣,我們類似的構造一個管道類;
class PipeLine:#管道類 pipe_x=300#記錄管道橫座標位置 pipe_y=[]#留給小鳥飛行的間隙 pipeColor=pygame.Color(115,190,44)#管道的顏色
在使用管道之前我們要對其進行初始化Init,根據縱座標的計算我們留出4個空位置給胖鳥,並在初始化中將這幾個空位加以標註,方便我們後期繪製管道障礙物。下面是我們構造的PipeInit方法;
def PipeInit(pipe):#初始化管道 start = random.randint(0, 10) * 30 pipe.pipe_y.append(start) pipe.pipe_y.append(start + 30) pipe.pipe_y.append(start + 60) pipe.pipe_y.append(start + 90)
胖鳥是透過空格鍵進行上下的移動,而管道的移動則不受使用者的控制且移動方向為水平從右向左依次運動,這裡我們採用了隨著迴圈的移動將管道橫座標位置依次減1的方式實現鳥兒與管道的相對運動,而這些操作都可以與管道的繪製同時進行。下面我們來構造繪製管道的方法:
def DrawPipeLine(windowSize,pipeList,bird):#繪製管道 for pipe in pipeList: pipe.pipe_x=pipe.pipe_x - 10 for i in range(0,20): if i*30 not in pipe.pipe_y:#not in實現空隙的留白 pygame.draw.rect(windowSize, pygame.Color(0,145,0), Rect(pipe.pipe_x, i*30, 60, 30))#繪製矩形管道 if pipe.pipe_x<=-40:#判斷管道是否移動出界 bird.g_score = bird.g_score + 1#遊戲成績增加 pipe.pipe_x=480 pipe.pipe_y=[] PipeInit(pipe) pipeList.pop()#彈出移出螢幕的管道 pipeList.append(pipe)#將新管道新增進入管道列表
第四步:遊戲勝負結果的判斷;到此為止我們基本已經實現了該遊戲的全部功能,但每個遊戲都會結束,我們這個遊戲目前只是實現了地圖和精靈的移動,並沒有實現能使遊戲結束的功能;在這裡我們使用一個Check方法來對遊戲進行判斷;
def CheckGame(bird,pipe):#遊戲判斷 if bird.position[1]<0 or bird.position[1]>570: pygame.quit()#跑出上下界限 if bird.position[0]+30>pipe[0].pipe_x and bird.position[0]<pipe[0].pipe_x+60: if bird.position[1]<pipe[0].pipe_y[0] or bird.position[1]+20>pipe[0].pipe_y[3]: pygame.quit()#遊戲退出
有了此方法我最後一個主要功能也就到此結束了,下面我們來看一下此時遊戲是不是與之前產生了區別,而且可玩性也有了質的飛躍(有些些許激動了吧,開始執行一下我們這個簡單的demo吧)
第五步:遊戲介面的最佳化與圖片的匯入;怎麼樣是不是可以運行了,而且與我們預想的胖鳥是不是類似呢?但這是不是也有點太單調了,下面我們開始讓著整個遊戲介面更加地生動起來。之前我們提到的windowSize.fill()方法預設填充的是黑色我們只需修改填充背景的RGB顏色值即可將背景色改變成我們想要的顏色。
對於這隻笨笨的黃色小胖鳥(長得確實挺方的),我們來對它進行一下整容,匯入一個胖鳥圖片並對原來繪製矩形的地方做出相應的修改即可讓它脫胎換骨;
遊戲精靈匯入格式:flappyBird = pygame.image.load("Bird.png")#載入遊戲圖片;
windowSize. blit(flappyBird, Rect(brid. position[0], brid. position[1], 30, 30))
#pygame. draw. rect(windowSize, brid, BeidColor, Rect(brid. position[0], brid. position[1], 30, 30))
對於遊戲得分的提示資訊,可以透過pygame中自帶的font設定字型字號,將其新增到幕布中即可(在這裡我們只給出得分提示資訊的程式碼,你也可以根據需要填充其他的提示資訊)。
font = pygame.font.SysFont('宋體', 24);text = font.render("Game Score:" + str(bird.g_score), True, (255, 255, 255));windowsSize.blit(text, Rect(360, 10, 200, 120));#text為所填充的文字內容,Rent(x,y,len,width)
FINALLY 圓滿收官(MayBe 我或許會新增新的功能模組):遊戲完整程式碼:
import pygame,random,sys,timefrom pygame.locals import *#匯入庫檔案flappyBird = pygame.image.load("Bird.png")#載入遊戲圖片level=1#遊戲等級 class Brid:#鳥類 position = [10,200]#初始位置 speed=1#移動速度 g_score = 0 # 遊戲得分 BridColor=pygame.Color(255,255,0)#顏色黃色 class PipeLine:#管道類 pipe_x=300 pipe_y=[] pipeColor=pygame.Color(115,190,44) def GameOver(): pygame.quit()#遊戲退出 def Leveling(count):#等級判定 if count<=10: return 1 else: return count/10 def GameInit(windowSize,brid):#遊戲初始化 windowSize.blit(flappyBird,Rect(brid.position[0], brid.position[1], 30, 30)) pygame.display.update() def PipeInit(pipe):#初始化管道 start = random.randint(0, 10) * 30 pipe.pipe_y.append(start) pipe.pipe_y.append(start + 30) pipe.pipe_y.append(start + 60) pipe.pipe_y.append(start + 90) def DrawPipeLine(windowSize,pipeList,bird):#繪製管道 for pipe in pipeList: pipe.pipe_x=pipe.pipe_x - 10 for i in range(0,20): if i*30 not in pipe.pipe_y: pygame.draw.rect(windowSize, pygame.Color(0,145,0), Rect(pipe.pipe_x, i*30, 60, 30)) if pipe.pipe_x<=-40: bird.g_score = bird.g_score + 1 pipe.pipe_x=480 pipe.pipe_y=[] PipeInit(pipe) pipeList.pop() pipeList.append(pipe) def CheckGame(bird,pipe):#遊戲判斷 if bird.position[1]<0 or bird.position[1]>570: pygame.quit()#跑出上下界限 if bird.position[0]+30>pipe[0].pipe_x and bird.position[0]<pipe[0].pipe_x+60: if bird.position[1]<pipe[0].pipe_y[0] or bird.position[1]+20>pipe[0].pipe_y[3]: pygame.quit()#遊戲退出 def main(): flag=0#標記位 pygame.init()#遊戲初始化 windowsSize=pygame.display.set_mode([480,600])#設定視窗大小 pygame.display.set_caption('FlappyBrid') # 視窗標題 font = pygame.font.SysFont('宋體', 24) bird=Brid()#建立鳥例項 pipeList=[]#管道列表 pipe1= PipeLine() pipe2= PipeLine() PipeInit(pipe1) pipe2=pipe1#物件的值複製 pipe2.pipe_x=pipe2.pipe_x+80 pipeList.append(pipe1) pipeList.append(pipe2) windowsSize.fill(pygame.Color(113,197,205)) GameInit(windowsSize,bird)#遊戲初始化 DrawPipeLine(windowsSize,pipeList,bird) while True:#遊戲主體 level = Leveling(bird.g_score) text = font.render("Game Score:" + str(bird.g_score), True, (255, 255, 255)) text1 = font.render("Level:" + str(level), True, (255, 255, 255)) for event in pygame.event.get(): if event.type == QUIT: GameOver() #遊戲退出 elif event.type==KEYDOWN:#按鍵響應 if event.key==K_SPACE: bird.position[1]=bird.position[1]-bird.speed*50*level flag=1 if flag==0:#檢測位 bird.position[1]=bird.position[1]+bird.speed*10*level flag=0 windowsSize.fill(pygame.Color(113,197,205)) CheckGame(bird, pipeList) DrawPipeLine(windowsSize,pipeList,bird) windowsSize.blit(text, Rect(360, 10, 200, 120)) windowsSize.blit(text1, Rect(360, 40, 200, 120)) GameInit(windowsSize,bird) time.sleep(0.1-level/100) if __name__=='__main__': main()#主函式
遊戲執行截圖:
總結以上就是胖鳥快飛的原始碼過程,大家可以寫一下玩一玩我是虎符,一個喜歡學習喜歡程式設計的年輕人