12歲的少年教你用Python做小遊戲

賤聖OMG發表於2013-07-10

你有沒有想過電腦遊戲是怎樣製作出來的?其實它沒有你想象的那樣複雜!在這個教程裡,你要學做一個叫《兔子和獾》的塔防遊戲,兔子作為英雄,需要在城堡裡抵禦獾的進攻。

為了寫這個遊戲的程式碼,你將會用Python。好吧,我不是指一條大蟒蛇!

Python是一種計算機語言。我們在這篇教程裡選擇Python是因為這門語言很容易上手,學習起來也很簡單和有趣。

如果你是個Python方面的新手,在開始看教程之前你可以看看這本書《 Think Python: How to Think Like a Computer Scientist》。這能讓你看教程的時候不那麼吃力。

在看了那本書後回到這裡並且準備好——兔子和獾之間有一場大戰爆發,一起來加入到這場戰鬥中來吧!

 

起步:安裝Python

如果你想在Windows PC上嘗試這篇教程裡講到的東西,你需要安裝Python。確保你安裝的是2.7.3版本,而不是3.3.0版本!在安裝程式執行完之後,在開始按鈕的“所有程式”裡就會有IDLE了。首先啟動IDLE。

如果你是用的Mac,上面已經是把Python裝好了!開啟終端,輸入python,然後按回車就行了

注意:如果你是安裝的從python.org下載的安裝包,那麼你在Mac上也可以啟動IDLE了,它應該是在 /Application/Python2.7 這個資料夾裡。

如果你按以上的步驟執行了,那麼你可以看到一下的東西:

注意:如果你想迅速終止Python,你可以輸入exit()然後按回車,或者是按Control+D。

現在很迅速的把Python環境配置好了,為了測試下Python是否正常工作,輸入 print 1+1 然後按回車,應該會列印出2。你剛才就寫了一個簡單的Python程式!

那麼,現在你知道Python已經能正常工作了,為了能用Python來寫一個遊戲,你需要安裝PyGame。

PyGame是一個Python的庫,能夠讓你更容易的寫出一個遊戲。它提供的功能包括圖片處理和聲音重放的功能,並且它們能很容易的整合進你的遊戲裡。

點選這裡下載適合你的PyGame安裝包。確保你下載的是針對2.7版本的庫。

注意:從以上鍊接下載的PyGame安裝包是無法與Mac上安裝的Python一起正常工作的。你需要從 python.org 上下載一個Python安裝包才能使用PyGame。或者,你可以用MacPorts來讓你的Python和PyGame正常工作。

為了確定PyGame是否安裝好了,開啟IELD或者是在終端裡執行Python,然後輸入import pygame 並且回車。如果沒有打出任何輸出,說明沒有問題。

但是,如果打出瞭如下圖的輸出,那麼PyGame就沒有被安裝上。

如果你發現了這樣的錯誤,把出錯的情況發到論壇上,我會幫助你把它執行起來

 

執行檔案裡的Python程式碼

現在你已經能在Python快捷終端裡寫一點程式碼了,如果你想要寫一個更大一點的程式(比如遊戲),那麼你就需要把程式碼儲存到檔案裡了。

有好幾種執行檔案裡的Python程式碼的方法。其中一種方法是使用一個簡單的文字編輯器,比如Windows系統上的nodepad,或者Mac上的TextEdit。開啟一個新的文字檔案,輸入Python程式碼(比如print 1+1)。然後將其儲存為XXX.py 。(XXX表示檔名)

在Windows上,雙擊這個py檔案來執行它。在Mac上,開啟終端然後輸入python,然後把程式碼檔案拖到終端上最後再按回車。

另一種執行程式碼的方法是使用IDLE編輯器,這是在這篇教程裡主要使用的方法。要執行IDLE,需要在終端裡輸入idle,然後在選單裡選擇新建檔案,然後就可以利用這個文字編輯器來寫Python程式碼了。你可以通過 File/Save 來儲存檔案,通過點選 Run/Run(F5)來執行程式碼。

要注意執行的選單在編輯器裡開啟了檔案之後才可用。

 

新增遊戲資源

你現在已經基本上準備好來建立一個遊戲了。但是哪個遊戲沒有很棒的影像和音效呢?我把遊戲裡需要的影像和音像儲存在了zip檔案裡,點選這裡下載。

在下載好檔案後,為遊戲建立一個資料夾然後把壓縮檔案解壓到這個資料夾的子資料夾裡,將其命名為resources,具體如下圖:

我們現在可以開始做兔子和獾這個遊戲啦!

 

第一步:你好,兔子

執行IDLE,開啟一個新的文字編輯視窗。輸入以下的程式碼:

把檔案儲存到你的遊戲資料夾裡,把它命名為 game.py 。我們現在看看這段程式碼做了什麼:

  1. 匯入pygame庫,這一步能讓你使用庫裡提供的功能
  2. 初始化pygame,設定展示視窗
  3. 載入作為兔子的圖片
  4. 不停地迴圈執行接下來的部分
  5. 在給螢幕畫任何東西之前用黑色進行填充
  6. 在螢幕的(100,100)座標出新增你載入的兔子圖片
  7. 更新螢幕
  8. 檢查一些新的事件,如果有退出命令,則終止程式的執行。

在執行這段程式碼後,你會看到一下的畫面:

可以看到一個兔子在這裡,準備好要戰鬥了!

但是暫時兔子看起來還是很孤獨的,背景上只有它一個。現在是時候讓它更進一步了。

 

第二步:新增背景

我們現在開始給遊戲的背景加上一些風景。這可以通過一些 screen.blit() 的呼叫來實現。

在#3的結尾處,在新增玩家圖片的後面,加上以下的程式碼:

這段程式碼載入圖片並將它們放在變數裡。現在它們需要被畫在螢幕上。但是當你檢查了草的圖片後,發現它不會覆蓋整個螢幕,它的解析度是640 x 480。

新增到 game.py 裡#6的程式碼:

你可以看到,這段程式碼首先是依次通過x進行迴圈。又是一個依次通過y的迴圈並且根據迴圈裡x和y的值來畫上草的效果。接下來的幾行就是在螢幕上畫出城堡。

如果你現在執行你的程式碼,效果應該如下圖:

好多了——現在開始看起來不錯了!

 

第三步:讓兔子能夠移動

接下來你需要加上一些真正的遊戲的元素了,比如讓兔子能夠隨著按鍵移動。

為了做到這一點,首先,你需要實現一個方法,用來記錄在某一時刻那個鍵被按下。可以通過新建一個按鍵狀態的佇列來存放每個你想在遊戲裡用到的按鍵。

把以下程式碼加入到 game.py 裡#2後面:

這段程式碼是不言自明的,key這個佇列用來記錄幾個按鍵的情況:WASD。佇列中的每一項對應一個按鍵——第一個對應W,第二個對應A等等。

playerpos這個變數表示程式畫出玩家的位置。因為這個遊戲會讓玩家向不同的方向移動,用一個變數來表示玩家的位置並且能夠依據這個變數將玩家畫出來的方案是非常適合的。

現在你需要修改現在畫出玩家的程式碼,需要用上playerpos變數。把#6部分的程式碼進行修改:

改成:

接下來,根據按下的鍵來更新按鍵記錄陣列。PyGame裡用給按鍵新增事件的方法來檢測按鍵。

在#8八月份的結尾,就在event.py == pygame.QUIT後面,新增一下的程式碼(與pygame.QUIT保持同級別縮排):

Wow!又加了這麼多程式碼。但是如果你仔細看看這些表示式,並沒有那麼複雜。

首先,你檢查是否有一個鍵被按下或放開。然後,檢查是哪一個鍵被按下或放開了,如果被按下或放開的鍵是你使用的,你就更新記錄按鍵的變數。

最終,你需要更新playerpos變數作為按鍵後的反應。這實際上是非常簡單的。

把一下的程式碼加到game.py的結尾:(讓它與for 迴圈保持同級別縮排)

這段程式碼簡單的檢查了哪個鍵被按下,然後增加或減少玩家的x和y座標。

執行這個遊戲,那麼你應該會看到一下的畫面。試著按WASD,耶!好使了!

第四步:讓兔子轉向

好的,現在你的兔子在你按鍵的時候可以移動了,但是如果你能用滑鼠讓兔子朝向你選擇的方向不是更酷嗎?這樣它就不會總是朝向一個方向了。用三角定理實現它會非常簡單。

看一下下面的插圖:

在上圖中,如果(5,2)是兔子的位置,(2,4)是現在滑鼠的位置,你可以通過三角定理來得出需要旋轉的角度。然後,你知道了旋轉的角度後,以就可以來旋轉你的兔子了。

如果你對這部分感到有點疑惑,不要擔心——這沒有關係。但這是你為什麼需要在數學課上集中精力的原因。在遊戲程式設計中會用得到它的。

現在,你需要接受你的遊戲裡的概念。為了實現它,你可以使用PyGame Surface.rotate(degrees) 函式。

atatn2函式是來自Python 的math庫。所以把一下程式碼加到#1部分:

然後,把#6部分的最後一行用一下程式碼替換:

我們來瀏覽一下以上程式碼的基本結構。首先獲取滑鼠和玩家的位置。然後將它們使用atan2函式。然後,獲取通過atan2函式得出的角度和弧度。

當兔子被旋轉的時候,它的位置將會改變。所以你需要計算兔子新的位置,然後將其在螢幕上顯示出來。

再次執行遊戲,如果你只是按WASD這幾個鍵,那麼這個遊戲跟以前還是一樣的。但是如果你移動滑鼠,兔子也開始旋轉了,相當酷!

第五步:射吧!兔子

現在你的兔子可以四處移動了,是時候來新增更多的功能了。讓兔子用箭頭射向它們的敵人怎麼樣?

這一步會有一點複雜,因為你需要跟蹤所有的箭頭,更新它們,旋轉它們,在它們跑出螢幕的時候刪除它們。

首先,在#2宣告的部分加上必要的變數的宣告。

第一個變數會跟蹤玩家的精度,第二個變數會跟蹤箭頭。這個精度的變數本質上是一個數字組成的列表,記錄了射出的箭頭數和被擊中的獾的數量。之後我們會用到這些資訊用來計算射擊精確度。

接下來,在#3部分結尾載入箭頭的圖片。

現在,當玩家點選滑鼠,就需要射出一支箭頭。在#8部分加上以下程式碼:

這段程式碼會檢查是否滑鼠被點選了,如果點選了,它就會得到滑鼠的位置並且根據玩家和游標的位置計算出箭頭旋轉角度。旋轉角度的值存放在arrows這個陣列裡。

接下來,你需要真的在螢幕上畫出箭頭來。在#6部分加上以下程式碼:

vely和velx的值是根據三角定理算出來的。10是箭頭的速度。if表示式是檢查箭頭是否超出了螢幕範圍,如果超出,就刪除這個箭頭。第二個for表示式是迴圈來把箭頭根據相應的旋轉畫出來。

試著執行遊戲。當你點選滑鼠時,你的兔子就可以射出剪頭了:D

第六部:獾,拿上武器!

好吧,現在有了城堡,並且你有一個英雄可以移動和射出箭頭。還差什麼呢?攻擊城堡的敵人可以被英雄用箭頭射了!

在這一步,你將會隨機建立出一些獾衝向城堡。在遊戲的程式中會有越來越多的獾冒出來。所以,我們來列個接下來要做的事情的清單。

  1. 新增一個壞蛋的列表
  2. 更新壞蛋的資訊,並且檢查它們是否超出螢幕範圍
  3. 展示這些壞蛋

第一步,在#2部分加上一下程式碼:

以上的程式碼裡定義了一個定時器,使得遊戲裡可以經過一段時間後就新建一隻獾。

在#3部分結尾處新增以下程式碼:

第一行跟前面載入圖片的程式碼很相似。第二行宣告瞭一個圖片的複製。

接下來,你需要更新並且顯示這些壞蛋了。在#6.2部分加上以下程式碼:

上面的程式碼看起來有不少。第一行是來檢查badtime是否為0,如果為0,建立一個獾然後重新設定badtime。第一個迴圈更新獾的x座標,檢查獾是否超出螢幕範圍,如果超出範圍,將獾刪掉。第二個迴圈是來畫出所有的獾。

為了在以上程式碼裡用到隨機的功能,你需要匯入random庫。所以在#1部分加上匯入的程式碼:

最後,把一行程式碼新增到#4部分的while表示式後面:

試著執行這段程式碼。現在它應該像個真正的遊戲了——你可以移動、射箭、轉向,然後有獾衝向你。

但是先慢著!為什麼獾沒有炸掉城堡?我們快速的把這功能加進來。

把以下程式碼加到#6.3部分index+=1之前的第一個迴圈裡:

這段程式碼相當簡單。如果獾的x座標離右邊小於64,就刪除壞蛋並且減少遊戲裡的健康值,減少的大小為5至20裡的一個隨機數。

再次執行這個遊戲,你就會有一些獾衝過來並且在碰到城堡的時候會消失。儘管你看不到,獾實際上會降低你的健康值。

第七部:獾與箭頭的碰撞

獾們衝向你的城堡,但是你的箭頭對它們完全沒有作用!這讓兔子怎麼放手它的家園呢?

是時候來讓箭頭能夠殺死獾讓你能保護你的城堡並且贏得這場遊戲。基本上,你需要迴圈所有的壞蛋,你需要迴圈所有的箭頭來檢查是否有碰撞。如果碰撞上,刪除獾,刪除箭頭,並且新增精確度的變數裡面加1。

在#6.3.1部分後面加這些:

這段程式碼裡面只有一個地方需要提一下,這個if表示式使用了PyGame內建功能來檢查兩個矩形是否交叉。接下來的一些程式碼跟上面說的一樣。

再執行下程式碼,現在你就可以用箭頭來殺死獾了。

 

第八步:新增健康值和時間的顯示

現在遊戲執行起來相當不錯了。現在有攻擊者,有防守者。現在,你需要的就是通過一個方法來顯示兔子的得分。

最簡單的方法就是新增一個HUD來顯示當前城堡的生命值。你也可以加一個計時來記錄城堡存活下來的時間。

首先,新增一個計時。在#7部分加上下面的程式碼:

上面的程式碼使用了PyGame預設的大小為24的字型。這個字型用來顯示時間資訊。

接下來新增程式碼到#6.4部分後面:

這段程式碼首先畫了一個全紅色的生命值條。然後根據城堡的生命值往生命條裡面新增綠色。

執行下程式碼,現在就會有計時和生命值條了。

第九步:贏或輸

現在怎麼樣?如果你玩的時間夠長,即使你的生命值已經變成0了,遊戲仍然是繼續的!不僅如此,你仍然可以用箭頭射向這些獾。這肯定不太對。你需要加上一些贏或者輸的情況來讓你的遊戲值得玩。

那麼我們來加上勝利或者失敗的條件。你可以通過終止主迴圈,進入勝利/失敗的迴圈來實現它。你需要指出玩家是否勝利,並將其顯示在螢幕上。

下面是一些勝利/失敗的一些基本條件:

如果時間到了(90秒)那麼:

  • 停止執行遊戲
  • l設定遊戲的輸出

如果城堡被毀,那麼:

  • 停止執行遊戲
  • l設定遊戲的輸出

精確度是一直都需要計算的。

在game.py 結尾新增這些程式碼:

這是最長的一段程式碼!不過它並不複雜。

第一個ifb表示式是檢查是否時間到了。第二個是檢查城堡是否被摧毀了。第三個計算你的精準度。之後,一個if表示式是檢查你是贏了還是輸了,然後顯示出相應的圖片。

當然,如果你想在贏或輸的時候顯示圖片,這些圖片首先需要載入。所以在#3部分加上這些程式碼:

還有需要改的地方,把#4部分從:

改成:

這個running變數會跟蹤遊戲是否結束,exitcode變數會跟蹤玩家是否勝利。

再次執行遊戲,你就發現你可以勝利或者失敗了!酷

第十步:免費的音樂和聲音效果

這個遊戲現在相當不錯了,但是沒有聲音。有點太安靜了。加上一點聲音效果,能讓你更好地感受這個遊戲。

PyGame能夠讓載入和播放聲音非常簡單。首先,你在#2部分結尾加上這些程式碼:

然後在#3部分載入聲音然後設定聲音:

上面大部分程式碼就是載入聲音檔案並且配置音量。但是注意 pygame.mixer.music.load這行程式碼——這一行載入遊戲的背景音樂然後下一行讓背景音樂一直不停的播放。

現在注意聲音的配置。現在你所有需要做的就是在需要的時候播放不同的音樂。

再次執行遊戲,你會發現現在有背景音樂了,並且在射出箭頭和碰撞的時候會有音效。這遊戲就更加逼真啦!

 

那接下來呢?

你應該為自己感到自豪:你剛剛完成了一個遊戲;裡面包含了音樂,音效,一個殺手兔子,自殺衝鋒的獾等等。我跟你說了這確實是可以完成的!

你可以從這裡下載最終的遊戲程式碼。

在這基礎上,你可以根據你自己的創意來擴充套件遊戲!你可以試著重置裡面的各種圖片,加上不同的槍或者是不同的怪物!

如果你對這篇教程有什麼問題和建議。請留言。

相關文章