python微信飛機大戰

先添上最終完成效果圖

Github代碼倉庫鏈接

https://github.com/happyte/plane, 這個是飛機大戰的代碼倉庫,不足之處希望大家指出。

基礎類的構建

導彈類

  • 1.導彈是從飛機上發射的(無論是玩家的飛機還是敵機),導彈的位置需要根據飛機的位置確定,還需要根據是玩家飛機還是敵機確定導彈的圖片名和發射方向,因此需要傳入圖片名和位置參數。

    pygame框架加載圖片為圖像函數為:
  pygame.image.load(image).convert()

傳入的參數是圖片的相對路徑

  • 2.描繪出導彈的位置,導彈并且需要在初始化的self.xself.y基礎上移動位置,位置是在屏幕上描繪的,需要傳入屏幕參數。

    pygame顯示圖片函數為:
     screen.blit(self.image,(self.x,self.y))
     pygame.display.update()
    
第一個參數為加載的圖像,第二個參數為左上角坐標。兩個函數是配合使用的,需要第二個函數去刷新界面。

## 飛機類
- 1.`Plane`類是接下來要創建的玩家類`Hero`和敵機類`Enemy`的基類。基類把兩者共同的屬性和方法定義出來,方便子類繼承。飛機要發射導彈,有一定的發射間隔,因此定義一個對象屬性`self.bulletSleepTime`。還需要一個列表存儲導彈,定義一個對象屬性為空列表`self.bulletList`。
![](http://upload-images.jianshu.io/upload_images/4300291-7b20c8aebfb3415c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
`time.time()`可以用來確定當前時間,按照一定的格式可以轉換

- 2.在初始化的時候我們定義了導彈的發射間隔時間,大于間隔時間的話我們就往定義的列表中添加導彈對象,因為我現在只想讓玩家飛機發射子彈,因此初始化導彈對象特意往`self.x`加了`36(是玩家飛機72x72圖片寬度的一半)`,讓導彈在玩家飛機的正中間開始顯示。
![](http://upload-images.jianshu.io/upload_images/4300291-6bd1343aff885c70?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 3.描繪出飛機的位置
![](http://upload-images.jianshu.io/upload_images/4300291-45446eedba25a1ab?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

# 繼承類的構建
##玩家飛機類
- 1.在飛機基類中我們定義了一些共同的對象屬性,不同的對象屬性有圖像和原始位置,而且玩家飛機類對象還想擁有基類對象的屬性,所以需要調用`Plane.__init__(self)`函數,通過這個函數就擁有了`Plane`基類的對象屬性`bulletSleepTime`、`lastShootTime`、`bulletList`。
![](http://upload-images.jianshu.io/upload_images/4300291-f394984937086b2c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 2.玩家飛機通過鍵盤的上下左右控制飛機的位置
![](http://upload-images.jianshu.io/upload_images/4300291-dc488d254669804a?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

##敵人飛機類
- 1.敵人飛機類中還多了速度對象屬性,考慮到隨著游戲難度的增加,敵人飛機速度越來越快,這個參數需要外界傳入。而且敵人飛機有小中大三種類型,是隨機的,起始的位置`x`軸也是隨機的,`y`軸固定從最上方開始。
![](http://upload-images.jianshu.io/upload_images/4300291-a4d66500742b5332?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
用到了隨機數函數,需要導入`random`模塊
 ```objc
  random.randint(1,3)

其中用到了super(Enemy,self).__init__()與玩家類中的Plane.__init__(self)效果是相同的。direction對象屬性可以忽略,現在沒有用到。

  • 2.敵人的飛機不斷往下掉,改變self.y,其實不用判斷,direction沒有用到

游戲初始化類(封裝功能)

  • 1.GameInit類創建了幾個類屬性,g_enemyList=[]列表用于存儲敵人飛機對象,初始化玩家對象hero=object,object是元類,和用于統計玩家分數的屬性score。
  • 2.接下來定義了幾個類方法和靜態方法,用于封裝功能,在主函數里調用的都是這些類方法和靜態方法
  • 往敵機列表中添加敵機對象,忽略下我的代碼英語好像打錯了


  • 創建玩家飛機對象


  • 游戲初始化


  • 玩家飛機對象處理鍵盤操作,在玩家飛機類中已經定義了鍵盤處理函數,這里再封裝一層


  • 更新敵人飛機位置,敵人飛機對象都在g_enemyList列表中

  • 有3種類型的對象需要描繪,玩家飛機對象,敵人飛機對象和導彈,這個函數就是用來描繪這些對象,其中導彈和敵機需要判斷哪些對象超出屏幕從列表中刪除,這里用了del函數,記錄下索引值并從列表中刪除,同樣也可以用pop函數,這里的j為索引值

  • 玩家飛機對象發射子彈,同時也要判斷打中了敵機就讓敵機對象和和子彈對象同時從列表中刪除。通過pygame.Rect(self.image.get_rect())獲得矩形的值,但是只獲得了圖像的widthheight兩個屬性,前兩個屬性lefttop都為0,因此還需要設置這兩個屬性,然后通過collidetect判斷兩個矩形是否有相交處,其中索引值enemyIndexbulletIndex需要仔細分析下

  • 判斷玩家飛機是否與敵機相撞判斷游戲是否結束


  • 3.幾個靜態方法,靜態方法不需要cls這個參數,通過類和實例都可以調用
  • 退出整個程序


  • 進入游戲后可以按space鍵停止游戲,其實就是就是個死循壞,按鍵按下后跳出函數

  • 游戲開始后和結束后把分數顯示出來,第一個參數是分數,第二個參數是通過pygame的字體庫創建出來的,例如font = pygame.font.SysFont(None,64),參數分別為字體樣式和大小,可以選擇字體樣式例如arial、simsun(宋體),第三個參數是屏幕,第四和第五個參數是字體顯示的lefttop值。

主函數

  • 1.運行一個模塊,有if __name__ == 'main':標識,會直接運行里面的代碼。第一步初始化pygame庫,調用pygame.init(),第二步創建一個窗口與背景圖片一樣大:screen = pygame.display.set_mode((ScreenWidth,ScreenHeight),0,32),然后可以設置窗口標題:pygame.display.set_caption('飛機大戰'),第三步做一些初始化常量設置。其中紀錄了游戲開始的時間,因為按照我的思想游戲開始后難度會逐漸增加,我是通過時間來增加難度的

    啟動時顯示start圖片,直到Enter鍵按下才進入游戲
  • 2.進入while 循壞后,調用游戲初始化類封裝好的函數,通過時間間隔interval選定游戲困難模式,通過改變敵機刷新的時間和敵機的速度增加難度,游戲結束后,再次按下Enter 按鍵退出程序。這里存在一個bug,一旦游戲進行過程中按下Space暫停游戲,interval時間間隔仍然再計算(按道理應該讓時間暫停),再次按下Space恢復游戲后,當前模式設定時間減少了或者進入更困難模式了。

總結

  • 1.我用的版本是python3.5,不知道為什么無法導入音樂,提示我打不開音樂文件,目前還沒試過其它版本,猜測是否是因為版本的原因
  • 2.接下來修復bug,目前完成了基本功能,下一步加入敵機爆炸效果和大型敵機是需要好幾發子彈才能擊毀
  • 3.在運行程序前安裝pygame庫,我是在windows電腦上寫的,可以用pip list查看安裝了哪些三方庫
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容

  • 本文作者: 楊曉輝 本文鏈接: http://youngxhui.github.io/2017/06/22/pyt...
    一個正在成為碼農的人閱讀 3,129評論 3 25
  • 工廠模式類似于現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,799評論 2 17
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,753評論 0 9
  • Python進階框架 希望大家喜歡,點贊哦首先感謝廖雪峰老師對于該課程的講解 一、函數式編程 1.1 函數式編程簡...
    Gaolex閱讀 5,509評論 6 53
  • 這個暑假,我們難得過起了兩人一狗的生活。孩子和老人都不在家,我們確實也省了不少心。不過還有個自定的任務需要完成,那...
    田園成長閱讀 266評論 0 0