使用Python六步製作小鳥管道遊戲(附源碼)

↑ 點擊上方 一行數據” 關注 + 星標 ~ 

行哥文章錯1字10元紅包,絕不錯過


現在用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就是使用代碼來完成遊戲中的任務,在玩遊戲的同時也能提高代碼的水平

本遊戲完整代碼複製本鏈接即可獲得:https://yihang.cowtransfer.com/s/833f8a3f63ba4f

——— / 往期精選 / ————

後臺回覆「進羣」可以加入我們的社羣哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章