1. 程式人生 > >Python編寫微信打飛機小遊戲(一)

Python編寫微信打飛機小遊戲(一)

如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。 


  最近開始學習Python語言,發現Python有一個神奇的Pygame模組,在編寫小遊戲時顯得非常方便,於是參照教學視訊編寫了一個微信打飛機的小遊戲,網上有很多相關的部落格,但都不是很詳細,大都是直接貼程式碼,於是決定沉下心來把編寫程式的過程記錄下來,與大家分享。

  首先宣告一點,這篇部落格完全參照了小甲魚的《零基礎入門學習Python》教學視訊,為了尊重原創,特將原作者的視訊地址公佈如下:《零基礎入門學習Python》

  Python編譯器和Pygame模組的安裝網上的教程很多,這裡不再贅述,需要強調的一點是,兩者之前不僅要求版本一致,所對應作業系統位數也應該一致,例如32位的Pygame模組必須對應32位的Python編譯器,我採用的是Python3.4(32位),所用Python的IDE為Pycharm。

  在編寫遊戲的過程中需要用到大量圖片和聲音資源,如背景圖片、背景音樂等,這裡將相關資源統一打包,供大家下載:《微信打飛機圖片音效資源》


  1、匯入相關模組。

  建立主函式檔案,如“mian.py”,在程式開始前將用到的Python模組匯入:

# 匯入相關模組
# coding: utf-8
import pygame
import sys
import tracebackfrom random import *
from pygame.locals import *

  這裡有幾個問題需要解釋一下:(1)如果Python不能正常列印中文字元,需要在檔案開頭加上“# coding: utf-8”來指定對應的編碼型別;(2)“sys”為系統模組,“traceback”為Python用來捕獲異常的模組,“random”為隨機數生成模組,“pygame.locals”則包含了Pygame中的一些固定的標誌常量,在下面的程式中將會用到。(3)這裡涉及了Python兩種匯入模組的方式,一種是形如“import pygame”,這種方法表示宣告一個模組,如果需要使用其中的元素,應採用“模組名.變數名”的格式;另一種形如“from random import *”,表示將模組中的所有元素全部匯入當前工程,在使用時直接使用元素名稱即可。

  2、載入相關資源

  將下載得到的資源(一個image資料夾,一個sound資料夾)放入工程目錄下(與mian.py相同的資料夾中),之後在主程式中載入這些資源。在載入之前,需要對pygame的相關功能進行初始化:

# ==================初始化==================
pygame.init()
pygame.mixer.init()  # 混音器初始化
bg_size = width, height = 480, 852  # 設計背景尺寸
screen = pygame.display.set_mode(bg_size)  # 設定背景對話方塊
pygame.display.set_caption("
飛機大戰……FishC Demo") background = pygame.image.load("image/background.png") # 載入背景圖片,並設定為不透明

  注意:(1)mixer為pygame模組的聲音控制物件(俗稱混音器),在涉及到與聲音有關的操作時會用到。(2)bg_size取決於背景圖片的尺寸

  在完成相關初始化後,可以正式的載入背景圖片和相關音效了:

# ==========載入遊戲音樂====================
pygame.mixer.music.load("sound/game_music.wav")
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
bullet_sound.set_volume(0.2)
big_enemy_flying_sound = pygame.mixer.Sound("sound/big_spaceship_flying.wav")
big_enemy_flying_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
enemy1_down_sound.set_volume(0.2)
enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
enemy3_down_sound.set_volume(0.2)
me_down_sound = pygame.mixer.Sound("sound/game_over.wav")
me_down_sound.set_volume(0.2)
button_down_sound = pygame.mixer.Sound("sound/button.wav")
button_down_sound.set_volume(0.2)
level_up_sound = pygame.mixer.Sound("sound/achievement.wav")
level_up_sound.set_volume(0.2)
bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
bomb_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound("sound/get_double_laser.wav")
get_bullet_sound.set_volume(0.2)

  注意,由於pygame音訊處理能力有限,在讀取音訊資訊時,需要將音訊檔案轉換成wav格式,普通的MP3格式一般情況下是無法正常讀取的,更多pygame有關音訊檔案的操作可以參考下面的部落格:《Pygame音訊操作》

  3、遊戲主程序,迴圈播放背景音樂

  在載入完相關資源之後,開始編寫遊戲的主函式。由於還沒有定義相關的模組,這裡顯示編寫一個最簡單的框架,讓程式能夠迴圈執行起來。

if __name__ == '__main__':
    try:
        main()
    except SystemExit:
        pass
    except:
        traceback.print_exc()
        pygame.quit()
        input()

  這是Python的主程式入口,如果我們執行main.py檔案,程式則自動開始執行。如果只是將main.py作為一個模組import到其他工程中,則不會觸發這個函式的執行。注意在這裡我們使用了try語句來捕獲程式執行時出現的異常,如果main()函式在執行過程中丟擲任何異常,除了系統正常退出(SystemExit)的異常外,其他異常都通過“traceback.print_exc()”來列印異常資訊,同時呼叫“pygame.quit()”退出程式。

  由於還沒有編寫其他程式碼,在此處我們只編寫一個最簡單的main()函式來保證程式的正常執行,即簡單的顯示背景圖片並迴圈播放背景音樂:

def main():
    pygame.mixer.music.play(-1)
    running = True
    while running:
        screen.blit(background, (0, 0))
        for event in pygame.event.get():  # 響應使用者的偶然操作
            if event.type == QUIT:  # 如果使用者按下螢幕上的關閉按鈕,觸發QUIT事件,程式退出
                pygame.quit()
                sys.exit()

        pygame.display.flip()

  這裡對混音器mixer的成員函式play()賦值為-1代表迴圈播放該音樂,如果形參為空,則只播放一次該音樂。這裡在主程式迴圈中需要設定使用者退出操作,當檢測到使用者按下介面的關閉按鈕時(×),程式將呼叫pygame.quit()和sys.exit()完成退出。注意如果不設定這個操作,將會導致程式無法正常關閉(一般表現為程式無法響應)。在螢幕繪製方面,Python採用了一種雙緩衝的螢幕重新整理機制,即先通過blit()函式將一個圖片(統稱為surface物件)繪製在記憶體中,最後統一用pygame.display.flip()函式將繪製好的surface物件一次全部重新整理到螢幕上。至於什麼是surface物件,可以暫時理解為Python世界中的所有的圖形影象吧。ok,第一部分就先介紹這些。