
現在用Python來制作遊戲越來越友善,雖然某些方面有所限制。但是利用Pygame工具包基本能制作所有的2D遊戲
在制作的同時對遊戲的了解也會更加深刻,因為本質上都是對圖檔的定位和圖檔碰撞的判斷,進而以此為原理衍生出各種各樣的遊戲類型
本文推薦的這款遊戲名叫flappy bird(中文名:撲扇的小鳥),是由越南獨立開發者daoDong Nguyen開發的手機遊戲,這個遊戲最大的特點就是通關難如登天。因為不斷的嗝屁,迅速的restart,激起了求勝的欲望,類似的遊戲如跳一跳就是這種類型
但是當自己親手用pygame來制作這款遊戲時候,這個遊戲最大的特點便簡單如弟弟,因為不僅是用上帝視角來看這款遊戲,還可以修改遊戲中小鳥的圖檔和背景音樂,隻需要六步就可以開發出一款《撲扇的XXX》
1.設定視窗背景
設定背景,并将背景圖檔放置視窗上。并通過輪詢時間來擷取對電腦的操控
if __name__ == '__main__':
"""主程式"""
pygame.init() # 初始化pygame
size = width, height = 400, 650 # 設定視窗
screen = pygame.display.set_mode(size) # 顯示視窗
background = pygame.image.load("assets/background.png") # 加載背景圖檔
while True:
# 輪詢事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.blit(background,(0,0))
pygame.quit()
2.定義小鳥類
屬性:設定小鳥的皮膚,坐标,降落速度,生命狀态
方法:更新小鳥坐标位置
class Bird(object):
"""定義一個鳥類"""
def __init__(self):
"""定義初始化方法"""
self.birdRect = pygame.Rect(65, 50, 50, 50) # 鳥的矩形
# 定義鳥的3種狀态清單
self.birdStatus = [pygame.image.load("assets/1.png"),
pygame.image.load("assets/2.png"),
pygame.image.load("assets/dead.png")]
self.status = 0 # 預設飛行狀态
self.birdX = 120 # 鳥所在X軸坐标,即是向右飛行的速度
self.birdY = 350 # 鳥所在Y軸坐标,即上下飛行高度
self.jump = False # 預設情況小鳥自動降落
self.jumpSpeed = 10 # 跳躍高度
self.gravity = 5 # 重力
self.dead = False # 預設小鳥生命狀态為活着
def birdUpdate(self):
if self.jump:
# 小鳥跳躍
self.jumpSpeed -= 1 # 速度遞減,上升越來越慢
self.birdY -= self.jumpSpeed # 鳥Y軸坐标減小,小鳥上升
else:
# 小鳥墜落
self.gravity += 0.2 # 重力遞增,下降越來越快
self.birdY += self.gravity # 鳥Y軸坐标增加,小鳥下降
self.birdRect[1] = self.birdY # 更改Y軸位置
3.定義管道類
屬性:x軸坐标,上管道和下管道的管道皮膚
方法:更新管道坐标位置
class Pipeline(object):
"""定義一個管道類"""
def __init__(self):
"""定義初始化方法"""
self.wallx = 400 # 管道所在X軸坐标
self.pineUp = pygame.image.load("assets/top.png")
self.pineDown = pygame.image.load("assets/bottom.png")
def updatePipeline(self):
""""管道移動方法"""
self.wallx -= 50 # 管道X軸坐标遞減,即管道向左移動
# 當管道運作到一定位置,即小鳥飛越管道,分數加1,并且重置管道
if self.wallx < -80:
global score
score += 1
self.wallx = 400
4.建立地圖
這一部分代碼顯示遊戲中的背景圖檔,小鳥圖檔、管道圖檔以及顯示文字
def createMap():
"""定義建立地圖的方法"""
screen.fill((255, 255, 255)) # 填充顔色
screen.blit(background, (0, 0)) # 填入到背景
# 顯示管道
screen.blit(Pipeline.pineUp, (Pipeline.wallx, -300)) # 上管道坐标位置
screen.blit(Pipeline.pineDown, (Pipeline.wallx, 500)) # 下管道坐标位置
Pipeline.updatePipeline() # 管道移動
# 顯示小鳥
if Bird.dead: # 撞管道狀态
Bird.status = 2
elif Bird.jump: # 起飛狀态
Bird.status = 1
screen.blit(Bird.birdStatus[Bird.status], (Bird.birdX, Bird.birdY)) # 設定小鳥的坐标
Bird.birdUpdate() # 鳥移動
# 顯示分數
screen.blit(font.render('Score:' + str(score), -1, (255, 255, 255)), (100, 50)) # 設定顔色及坐标位置
pygame.display.update() # 更新顯示
5.判斷碰撞
這一部分代碼使用pygame.Rect.colliderect來判斷小鳥和管道是否碰撞以及
def checkDead():
# 上方管子的矩形位置
upRect = pygame.Rect(Pipeline.wallx, -300,
Pipeline.pineUp.get_width() - 10,
Pipeline.pineUp.get_height())
# 下方管子的矩形位置
downRect = pygame.Rect(Pipeline.wallx, 500,
Pipeline.pineDown.get_width() - 10,
Pipeline.pineDown.get_height())
# 檢測小鳥與上下方管子是否碰撞
if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):
Bird.dead = True
# 檢測小鳥是否飛出上下邊界
if not 0 < Bird.birdRect[1] < height:
Bird.dead = True
return True
else:
return False
6.加載文字
文字相當于遊戲的眼睛,來展示資料的變化 這一部分實時将遊戲的得分顯示在遊戲視窗上
def getResult():
final_text1 = "Game Over"
final_text2 = "Your final score is: " + str(score)
ft1_surf = font.render(final_text1, 1, (242, 3, 36)) # 設定第一行文字顔色
ft2_surf = font.render(final_text2, 1, (253, 177, 6)) # 設定第二行文字顔色
screen.blit(ft1_surf, [screen.get_width() / 2 - ft1_surf.get_width() / 2, 100]) # 設定第一行文字顯示位置
screen.blit(ft2_surf, [screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) # 設定第二行文字顯示位置
pygame.display.flip()
end
遊戲不僅可以用代碼來制作
遊戲還可以使用代碼來完成,例如Codingame就是使用代碼來完成遊戲中的任務,在玩遊戲的同時也能提高代碼的水準