Python實現飛機大戰遊戲(後附完整代碼文件和素材)

前言

自學Python的記錄,不喜勿噴!
本程序的代碼是以B站黑馬程序員的視頻代碼爲基礎,個人加以總結思考,寫就的博文,純屬記錄自己的學習歷程!

當初想到要用Python的pygame模塊開發飛機大戰遊戲的時候,頓時就興奮了,畢竟學以致用是最好的學習方式,何況是做一個遊戲,但是當我真正上手的時候發現並沒有想象中的那麼輕鬆。當然萬事開頭難,有了一定的經驗之後,後面的路就會輕鬆許多了。

pygame模塊安裝

開發這個遊戲的第一步是安裝pygame模塊,當初我完全按照老師的要求在終端中使用命令行來安裝好了pygame,並且也能運行其內置的小遊戲,但是打開文件import pygame模塊的時候,不管我咋個弄永遠都是“NO module named pygame”,我是裝了卸,卸了裝,搗鼓過來搗鼓過去,總是弄不好,心態崩了。於是我放棄了,但是心有不甘,查閱了多方資料,功夫不負有心人,最後無意中發現了我前面博客中的解決方法。https://blog.csdn.net/qq_43779324/article/details/104594396,當然其他大佬還有更好的解決方式,怪我當初沒搜到,順便吐槽一下CSDN的搜索功能,經常搜的是牛頭不對馬嘴,我谷歌啥的都能搜到CSDN博客內容,軟件內就搜不到?具體安裝方式大家可以看這個:https://blog.csdn.net/sinat_40043477/article/details/78276460?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

pygame入門

在完成好pygame模塊安裝之後,就要正式開始我們的遊戲開發了!在這之前,我們先來認識一下Python中的pygame模塊,pygame是Python中的一個2D遊戲開發庫,支持聲音和圖像的編輯,當然在現在的3D遊戲的普及下,pygame逐漸沒落了,但是這不妨礙我們從中學到一些東西。pygame程序的大體結構就是下面這個樣子,init()函數開始,quit()函數退出,中間就是具體的遊戲代碼。

import pygame
pygame.init()
# 編寫遊戲的代碼
print("遊戲的代碼...")
pygame.quit()

使用Rect來描述矩形區域

Python遊戲中以座標系來描述遊戲中各個組件的位置,原點在左上角,x軸水平向右、y軸水平向下。描述一個矩形區域還要有寬度和高度,因爲一個座標只能表示其左上角的位置,加上寬度和高度之後位置就定死了。

import pygame
hero_rect = pygame.Rect(100, 500, 120, 125)
print("英雄的原點%d %d" % (hero_rect.x, hero_rect.y))
print("英雄的尺寸%d %d" % (hero_rect.width, hero_rect.height))
print("%d %d" % hero_rect.size)

創建遊戲窗口

pygame中專門提供了一個模塊pygame.display用於創建、管理遊戲窗口。其中有兩個方法:

  • pygame.display.set_moudle():用於初始化遊戲窗口。裏面有四個參數,窗口的寬和高,是否全屏,窗口的顏色。
  • pygame.display.update():用於刷新屏幕內容顯示,稍後使用。
import pygame
pygame.init()
# 創建遊戲的窗口
pygame.display.set_mode((480, 700))
while True:
    pass
pygame.quit()

遊戲窗口寬480,高700,單位是像素,這個設定是我們後面的背景圖片一致。while循環是主遊戲循環,只要沒有命令退出遊戲,就要一直執行下去。

繪製圖像

遊戲窗口創建完成之後,就要來放東西了,不然你就盯着一個黑麻麻的窗口看啥呢!pygame中的load()函數加載圖像數據,blit()函數繪製圖像,update()函數更新屏幕顯示,每繪製一次圖像就要調用一次update方法,當然也可以放在最後只調用一次update方法。

import pygame
pygame.init()
# 創建遊戲的窗口
screen = pygame.display.set_mode((480, 700))
# 繪製背景圖像
# 1.加載圖像數據
bg = pygame.image.load("./images/background.png")
# 2.blit繪製圖像
screen.blit(bg, (0, 0))
# 3.update更新屏幕顯示
pygame.display.update()
# 繪製英雄的飛機
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (180,500))
pygame.display.update()
while True:
    pass
pygame.quit()

這些弄完之後就是下面這個樣子:
在這裏插入圖片描述

遊戲循環

遊戲循環意味着遊戲的開始,遊戲循環的作用是保證遊戲不會直接退出,變換圖像位置來實現動畫效果並檢測與用戶的交互內容。具體包括設置刷新幀率,檢測用戶交互,更新圖像位置,更新屏幕顯示等等。

while True:
	pass

遊戲時鐘

pygame中專門提供了一個類pygame.time.Clock可以非常方便的設置屏幕繪製速度——刷新幀率。在遊戲初始化創建一個時鐘對象,並在遊戲循環中讓時鐘對象調用tick()方法,tick()方法會根據上次被調用的時間,自動設置遊戲循環中的延時。

......
# 創建時鐘對象
clock = pygame.time.Clock()
while True:
    # 可以指定循環體內部的代碼執行頻率
    clock.tick(60)
......

監聽事件

事件就是遊戲啓動後,用戶針對遊戲所做的操作。例如:用戶點擊鼠標,按動鍵盤等等。
監聽則是判斷用戶的具體操作,只有捕獲用戶具體的操作,才能針對性的做出響應。
pygame中通過pygame.event.get()可以獲得當前用戶所做操作的事件列表

import pygame
pygame.init()
# 創建遊戲的窗口
screen = pygame.display.set_mode((480, 700))
# 繪製背景圖像
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
#  pygame.display.update()
# 繪製英雄的飛機
hero = pygame.image.load("./images/me1.png")
# screen.blit(hero, (180,500))
# 可以在所有繪製工作完成之後統一調用update方法
pygame.display.update()
# 創建時鐘對象
clock = pygame.time.Clock()
# 1.定義rect記錄飛機的初始位置
hero_rect = pygame.Rect(150, 300, 102, 126)
# 遊戲循環->意味着遊戲的正式開始
while True:
    # 可以指定循環體內部的代碼執行頻率
    clock.tick(60)
    # 監聽事件
    event_list = pygame.event.get()
    if len(event_list) > 0:
        print(event_list)
        # 判斷飛機的位置
    if hero_rect.y <= 0:
        hero_rect.y = 700
        # 2.修改飛機的位置
    hero_rect.y -= 1
    # 3.調用blit方法繪製圖像
    screen.blit(bg, (0, 0))
    screen.blit(hero, hero_rect)
    # 4.調用update方法更新顯示
    pygame.display.update()
pygame.quit()

在這裏插入圖片描述
MouseMotion就是鼠標移動,KeyDown就是按下鍵盤,KeyUp就是鬆開鍵盤。

精靈和精靈組

我不是在講數碼寶貝啊!精靈和精靈組是pygame中提供的兩個類,是爲了簡化圖像加載、位置變化、繪製圖像等功能的開發步驟。
pygame.sprite.Sprite——用於存儲圖像image和位置rect的對象。
pygame.sprite.Group——包含多個精靈的對象。
精靈類中有兩個屬性image記錄圖像數據和rect位置信息,update()方法更新位置信息。
精靈組類add()方法向組中增加精靈;sprites()方法返回所用精靈列表;update()方法讓組中的所有精靈調用update方法;draw()將組中所用精靈的image繪製到Surface的rect位置。

class GameSprite(pygame.sprite.Sprite):
    """飛機大戰遊戲精靈"""
    def __init__(self, image_name, speed=1):
        # 調用父類的初始化方法
        super().__init__()
        # 定義對象的屬性
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed
    def update(self):
        # 在屏幕的垂直方向上移動
        self.rect.y += self.speed

框架搭建

借用一下黑馬的圖片。以下就是這個遊戲的大體框架:首先是遊戲初始化,設置遊戲窗口,創建遊戲時鐘,創建精靈和精靈組。再就是在遊戲循環中設置刷新幀率,進行事件監聽、碰撞檢測、更新繪製精靈組、更新屏幕顯示等等。
在這裏插入圖片描述
存儲各種精靈的文件:
在這裏插入圖片描述
主程序:
在這裏插入圖片描述
最後的遊戲窗口就是這個樣子,感覺我能玩一年。
在這裏插入圖片描述

最後

我還找到了一個B站小甲魚出品的飛機大戰,他裏面有分數,可以撿武器啥的,比這個要好玩多了,但是程序非常的複雜,一般人是看不懂的,還是黑馬講的仔細好懂一些,強烈建議大家學Python的去看看。
黑馬的代碼鏈接:鏈接:https://pan.baidu.com/s/1URFOEes93li-A6dTScp4RA 提取碼:ww9l
小甲魚的代碼鏈接:https://pan.baidu.com/s/10P6xM1yPQlueO9Xy-boCtg
提取碼:uicm
如不能運行,或者鏈接失效,歡迎私信我。

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