1. 程式人生 > >12歲的少年教你用Python做小遊戲

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

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

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

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

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

起步:安裝Python

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

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

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

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

Python
1234 Python2.7.3(v2.7.3:70274d53c1dd,Apr92012,20:52:43)[GCC4.2.1(Apple Inc.build5666)(dot3)]on darwinType"help","copyright","credits"or"license"formore information.>>>

注意:如果你想迅速終止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
12345678 Python2.7.2(default,Jun202012,16:23:33)[GCC4.2.1Compatible Apple Clang4.0(tags/Apple/clang-418.0.60)]on darwinType"help","copyright","credits"or"license"formore information.>>>importpygameTraceback(most recent call last):File"<stdin>",line1,in<module>ImportError:No module named 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,開啟一個新的文字編輯視窗。輸入以下的程式碼:

Python
123456789101112131415161718192021222324252627 # 1 - Import libraryimportpygamefrompygame.localsimport*# 2 - Initialize the gamepygame.init()width,height=640,480screen=pygame.display.set_mode((width,height))# 3 - Load imagesplayer=pygame.image.load("resources/images/dude.png")# 4 - keep looping throughwhile1:# 5 - clear the screen before drawing it againscreen.fill(0)# 6 - draw the screen elementsscreen.blit(player,(100,100))# 7 - update the screenpygame.display.flip()# 8 - loop through the eventsforevent inpygame.event.get():# check if the event is the X button ifevent.type==pygame.QUIT:# if it is quit the gamepygame.quit()exit(0)

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

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

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

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

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

第二步:新增背景

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

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

Python
12 grass=pygame.image.load("resources/images/grass.png")castle=pygame.image.load("resources/images/castle.png")

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

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

Python
1234567 forxinrange(width/grass.get_width()+1):foryinrange(height/grass.get_height()+1):screen.blit(grass,(x*100,y*100))screen.blit(castle,(0,30))screen.blit(castle,(0,135))screen.blit(castle,(0,240))screen.blit(castle,(0,345))

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

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

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

第三步:讓兔子能夠移動

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

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

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

Python
12 keys=[False,False,False,False]playerpos=[100,100]

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

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

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

Python
1 screen.blit(player,(100,100))

改成:

Python
1 screen.blit(player,playerpos)

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

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

Python
123456789101112131415161718 ifevent.type==pygame.KEYDOWN:ifevent.key==K_w:keys[0]=Trueelifevent.key==K_a:keys[1]=Trueelifevent.key==K_s:keys[2]=Trueelifevent.key==K_d:keys[3]=Trueifevent.type==pygame.KEYUP:ifevent.key==pygame.K_w:keys[0]=Falseelifevent.key==pygame.K_a:keys[1]=Falseelifevent.key==pygame.K_s:keys[2]=Falseelifevent.key==pygame.K_d:keys[3]=False

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

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

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

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

123456789 # 9 - Move playerifkeys[0]:playerpos[1]-=5elif keys[2]:playerpos[1]+=5ifkeys[1]:playerpos[0]-=5elif keys[3]:playerpos[0]+=5

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

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

第四步:讓兔子轉向

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

看一下下面的插圖:

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

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

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

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

Python
1 importmath

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

Python
123456 # 6.1 - Set player position and rotationposition=pygame.mouse.get_pos()angle=math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))playerrot=pygame.transform.rotate(player,360-angle*57.29)