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

 
 
 
 
 

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

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

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

Python是一種計算機語言。咱們在這篇教程裏選擇Python是由於這門語言很容易上手,學習起來也很簡單和有趣。前端

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

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

 

起步:安裝Python

若是你想在Windows PC上嘗試這篇教程裏講到的東西,你須要安裝Python。確保你安裝的是2.7.3版本,而不是3.3.0版本!在安裝程序運行完以後,在開始按鈕的「全部程序」裏就會有IDLE了。首先啓動IDLE。python

若是你是用的Mac,上面已是把Python裝好了!打開終端,輸入python,而後按回車就好了mysql

注意:若是你是安裝的從python.org下載的安裝包,那麼你在Mac上也能夠啓動IDLE了,它應該是在 /Application/Python2.7 這個文件夾裏。linux

若是你按以上的步驟執行了,那麼你能夠看到一下的東西:android

注意:若是你想迅速終止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這行代碼——這一行加載遊戲的背景音樂而後下一行讓背景音樂一直不停的播放。

如今注意聲音的配置。如今你全部須要作的就是在須要的時候播放不一樣的音樂。

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

 

那接下來呢?

你應該爲本身感到自豪:你剛剛完成了一個遊戲;裏面包含了音樂,音效,一個殺手兔子,自殺衝鋒的獾等等。我跟你說了這確實是能夠完成的!

你能夠從這裏下載最終的遊戲代碼。

在這基礎上,你能夠根據你本身的創意來擴展遊戲!你能夠試着重置裏面的各類圖片,加上不一樣的槍或者是不一樣的怪物!

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

程序員專屬極客T恤,你喜歡哪款? ->  第2件八折,從這裏搶購
 贊  5 收藏  24 評論
 

關於做者:賤聖OMG

非專業碼農(新浪微博:@賤聖OMG) 我的主頁 ·  個人文章 ·  16
 

   

直接登陸 
最新評論
  • CSU985  2013/08/24

     

    牛逼的孩子啊

     

  • WYS  2013/08/24

     

    騷年很強,忍不住實現了一下,
    發現繪製箭頭的代碼有點小問題,
    一、箭頭的刪除有問題,index值只能爲0或1;二、箭頭重複繪製

     

    • WYS  2013/08/24

       

      修改成:
      # 6.2 - 繪製箭頭 Draw arrows
      index=0#當前箭頭下標
      for bullet in arrows:#計算箭頭位置
      velx=math.cos(bullet[0])*10#X方向分速度
      vely=math.sin(bullet[0])*10#Y方向分速度
      bullet[1]+=velx*0.1
      bullet[2]+=vely*0.1
      if bullet[1]640*0.8 or bullet[2]480*0.8:#超出屏幕範圍
      arrows.pop(index)#刪除當前箭頭,後面的箭頭代替當前箭頭,index下標不變
      else:
      index+=1#若沒刪除,則下標加1,計算下一個箭頭
      for projectile in arrows:
      arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)#轉動後的箭頭圖片
      screen.blit(arrow1, (projectile[1], projectile[2]))#繪製箭頭

       

      •  

        關於問題實在沒有看懂,代碼也反覆看了,不得要領,能否勞煩詳細說說?

         

  •  

    好東西呀,下個星期雙休無聊來看看能不能按照LZ的方式實現一下;
    多謝分享,分享萬歲
    ;

     

  • 阿宅  2013/08/26

     

    我作到第三步,可是按鍵之後沒有反應

     

  • gaint111  2013/08/27

     

    試下

     

  • 圖騰  2013/08/27

     

    試一下

     

  • caven16  2013/09/13

     

    2.7.3應該下哪一個版本的PyGame ?

     

  • Kevin  2013/10/02

     

    太還玩了!

     

  • 李呈  2013/10/17

     

    請問素材在哪裏下載呢?沒有找到。若是能夠,能發給我一份嗎?

     

  •  

    有誰完成了,遊戲結束後選擇繼續或者退出的部分麼,我卡了三天了…………求助

     

  • RichieWang  2014/10/19

     

    關於您給的兔子圖片? 好像不能點

     

  • Sean Zhao  2014/12/07

     

    很好
    做爲入門的實例

     

  • fansfantasy  2015/04/09

     

    E:\python>game.py
    Traceback (most recent call last):
    File "E:\python\game.py", line 10, in
    screen=pygame.display.set_mode((width, height))
    pygame.error: No available video device

    這是什麼問題啊

     

  • 董欣宇  2015/05/20

     

    我發現若是用mac的話 遊戲圖像只會顯示在左上角 而且只有正常大小的四分之一 爲何啊@。@

     

  • 第四個火槍手 高級軟件工程師2015/09/12

     

    個人python是3.4.2因此運行不起來。

     

  • 小英的守護 程序員2015/09/14

     

    樓主太厲害了,根據你的提示,python3.4修改一些地方也是能夠行得通的。

     

  • Melody_empty  2015/11/24

     

    mark,厲害啊

     

  •  

    箭頭打在獾身上只能刪除最前面的獾 有沒有辦法打哪一個死哪一個 (爲何箭頭不會消失)

     

 

關於伯樂在線博客

在這個信息爆炸的時代,人們已然被大量、快速而且簡短的信息所包圍。然而,咱們相信:過多「快餐」式的閱讀只會使人「虛胖」,缺少實質的內涵。伯樂在線內容團隊正試圖以咱們微薄的力量,把優秀的原創文章和譯文分享給讀者,爲「快餐」添加一些「養分」元素。

快速連接
問題反饋與求助 » 
加入伯樂翻譯小組 » 
加入專欄做者 »

關注咱們

新浪微博:@伯樂在線官方微博
RSS:訂閱地址
推薦微信號 

合做聯繫
Email:bd@Jobbole.com
QQ: 2302462408 (加好友請註明來意)

更多頻道

小組 – 好的話題、有啓發的回覆、值得信賴的圈子
頭條 – 分享和發現有價值的內容與觀點
相親 – 爲IT單身男女服務的徵婚傳播平臺
資源 – 優秀的工具資源導航
翻譯 – 翻譯傳播優秀的外文文章
文章 – 國內外的精選文章
設計 – UI,網頁,交互和用戶體驗
iOS – 專一iOS技術分享
安卓 – 專一Android技術分享
前端 – JavaScript, HTML5, CSS
Java – 專一Java技術分享
Python – 專一Python技術分享

 

© 2016 伯樂在線 首頁   博客   資源   小組   相親    反饋

 
跳到底部
返回頂部
相關文章
相關標籤/搜索