手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


煙花三月下揚州,我想3月能下樓。雖然很多地方都已經開始慢慢的開放了,但是我懷念的胡辣湯,海底撈,還有燒雞都沒有開門。眼看宅在家,吃了睡睡了吃,肚子上的救生圈都出來了一層又一層。宅男的我都練出一身廚藝。買了理髮工具已經可以兼職當“Tony”老師理髮了。


想必大家已經窩在家裡快發黴了吧,趁著時間充裕,我又重新撿起了之前學習的PyQt5。以前不是有一個打地鼠的遊戲,這次用簡單100多行代碼寫一個《消滅地鼠病毒》的小遊戲,效果如下,廢話少說先看視頻!


視頻鎮樓


01

PyQt介紹及安裝


PyQt5是基於Digia公司強大的圖形程式框架Qt5的python接口,由一組python模塊構成。PyQt5本身擁有超過620個類和6000函數及方法。在可以運行於多個平臺,包括:Unix, Windows,and Mac OS。Python的gui中有三大框架,分別是PyQt、wxpython和tkinter,我個人偏愛於PyQt,因為PyQt是比較流行的一個 Tkinter 的替代品,功能非常強大,可以用Qt開發多美漂亮的界面,也就可以用PyQt開發多麼漂亮的界面


安裝PyQt

其實安裝比較簡單,只需在命令行輸入pip install PyQt5,引入模塊:

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


02

構建界面


構造窗口,添加圖標和音樂,並以網格形式對控件進行佈局

1).構造1個窗口

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲

  • PyQt5應用必須創建一個應用(Application)對象;
  • sys.argv參數是一個來自命令行的參數列表,Top是窗口的類,setFixedSize設置窗口大小為900x600;
  • show()方法在屏幕上顯示出widget;
  • sys.exit(app.exec_())調用主循環用於接收來自窗口觸發的事件,並且轉發他們到widget應用上處理


手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


2).添加圖標、名稱及背景音樂

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲

效果如下

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


3).構造網格佈局,並將25張地洞圖片填滿5x5=25個網格

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲

  • QgridLayout為網格佈局,除了網格佈局,PyQt5有絕對位置和佈局類兩種佈局管理方式;
  • 其中佈局管理又分為水平佈局、垂直佈局、網格佈局、表單佈局四種佈局方法;
  • 每種方法都有其特點,這裡不再展開,有興趣的朋友可以研究一下,本次只採用網格佈局;


首先創建QgridLayout的實例,然後循環構造25個virus類,最後通過addWidget()方法將25個virus類分別放入imagelayout實例中,其中每個virus都包含地洞圖等信息


手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


運行程序,效果如圖

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


4)在右側添加設置欄

大家可以發現,上述效果圖佈局比較稀疏,因為我留有空餘,想在右邊放置一列設置欄,包含開始遊戲、消滅病毒數、逃跑病毒數以及剩餘時間等信息。


首先構造1個新的窗口,並將其嵌入主窗體中:

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


創建QgridLayout的實例,然後構造新窗口,設置大小,將其添加到主窗體中,addWidget5個參數分別為要添加的新窗口、在第1行、第6列,佔5行、1列,效果如下:

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


添加設置信息

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


用setText函數對各個標籤進行命名,最後用addWidget將其放入新加的窗口中,其中“開始遊戲”標籤還綁定了gamestart函數,後續還會講到,效果如下:

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


03

添加時間控件


為什麼要添加時間控件呢?因為我們要設置一局遊戲的時長、要設置病毒每次出現的時間間隔、要設置病毒停留的時間,PyQt5有現成的計時函數Qtimer,我們需要設置3個計時器。

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


共添加了全局計時、病毒隨機出現計時、剩餘時間計時共3個計時器,這3個計時器都在gamestart函數下啟動

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


當點擊“開始遊戲”時,會啟動gamestart函數,然後啟動timer(全局)、virustimer(病毒出現間隔)、remainter(遊戲剩餘時間)3個計時器,同時,計時器會按照設置的時間循環定時啟動綁定的函數。其中全局計時器綁定gameover函數

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲

即30秒後會調用該函數,將結束遊戲。


病毒出現計時器綁定virusactive函數

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲

首先檢測上個病毒在哪個位置出現,然後將該位置恢復為地洞圖片,其中virus.flag(初始值為0,病毒出現後設置成1)是病毒出現在哪個框的標誌;


後續會用於檢測小錘是否砸到病毒。接著用random函數在25個地洞中隨機選出下次病毒將會出現的位置,並將該位置的地洞圖片替換為病毒出現的圖片。


剩餘時間計時器綁定remainTimeshow函數

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲

每個1秒更新一下剩餘時間,並用setText函數將更新內容投送到remaintimeText標籤框,請大家注意,最下面一行是重新啟動剩餘時間計時器,這樣就能達到循環的效果了。


04

添加提示框


為了避免遊戲中不小心點了右上角的叉號而將遊戲關閉,需要添加1個提示框

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


closeEvent代表窗口關閉時間,用QMessageBox.question函數進行消息提示,效果如下:

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲


05

記分問題


經過上面的幾個步驟,基本框架已經搭建完了,現在需要考慮如何消滅病毒和計分的問題了。


1).首先綁定1個鼠標事件,即鼠標點擊時,將鼠標指針換成落下的小錘圖片

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲

mousePressEvent為鼠標點擊函數,每次鼠標點擊時該函數會啟動,停留0.1秒,接著啟動upTime計時器,該計時器綁定up函數

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲

即0.1秒後鼠標指針由落下的小錘圖片替換成抬起的錘子圖片,這樣就完成了1次敲擊動作。最後構造1個kill函數,主要用於計分

手把手教你!100行代碼,用Python做一個“消滅病毒”的小遊戲

之前說過,每個virus類都有其特徵,那麼我們就可以比對當前小錘砸到的virus類是否是病毒之前出現的那個virus類,通過什麼來比較呢?


還記得前面說過的virus.flag嗎?我們設置的每個virus的flag的初始值為0,當病毒出現在該virus類時,之前已將其設置成1,只需要看看當前小錘砸到的virus類的flag是否為1就可以判斷小錘是否砸到病毒了,如果砸到則計1分。




到這裡基本已經將遊戲的整個編寫過程講解完畢,這只是1個非常基礎的遊戲,PyQt還可以製作很多更加高大上的遊戲,感興趣的朋友可以繼續研究探索。


分享到:


相關文章: