精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發 后端 前端
你有沒有想過電腦游戲是怎樣制作出來的?其實它沒有你想象的那樣復雜!在這個教程里,你要學做一個叫《兔子和獾》的塔防游戲,兔子作為英雄,需要在城堡里抵御獾的進攻。

你有沒有想過電腦游戲是怎樣制作出來的?其實它沒有你想象的那樣復雜!

在這個教程里,你要學做一個叫《兔子和獾》的塔防游戲,兔子作為英雄,需要在城堡里抵御獾的進攻。

為了寫這個游戲的代碼,你將會用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 這個文件夾里。

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

  1. Python 2.7.3 (v2.7.3:70274d53c1dd, Apr  9 201220:52:43
  2. [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
  3. Type "help""copyright""credits" or "license" for more information. 
  4. >>> 

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

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

[[83774]]

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

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

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

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

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

 

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

  1. Python 2.7.2 (default, Jun 20 201216:23:33
  2. [GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin 
  3. Type "help""copyright""credits" or "license" for more information. 
  4. >>> import pygame 
  5. Traceback (most recent call last): 
  6.   File "<stdin>", line 1in <module> 
  7. ImportError: No module named pygame 
  8. >>> 

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

運行文件里的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,具體如下圖:

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

#p#

第一步:你好,兔子

 

運行IDLE,打開一個新的文本編輯窗口。輸入以下的代碼:

  1. # 1 - Import library 
  2. import pygame 
  3. from pygame.locals import * 
  4.   
  5. # 2 - Initialize the game 
  6. pygame.init() 
  7. width, height = 640480 
  8. screen=pygame.display.set_mode((width, height)) 
  9.   
  10. # 3 - Load images 
  11. player = pygame.image.load("resources/images/dude.png"
  12.   
  13. # 4 - keep looping through 
  14. while 1
  15.     # 5 - clear the screen before drawing it again 
  16.     screen.fill(0
  17.     # 6 - draw the screen elements 
  18.     screen.blit(player, (100,100)) 
  19.     # 7 - update the screen 
  20.     pygame.display.flip() 
  21.     # 8 - loop through the events 
  22.     for event in pygame.event.get(): 
  23.         # check if the event is the X button 
  24.         if event.type==pygame.QUIT: 
  25.             # if it is quit the game 
  26.             pygame.quit() 
  27.             exit(0

把文件保存到你的游戲文件夾里,把它命名為 game.py 。我們現在看看這段代碼做了什么:

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

在運行這段代碼后,你會看到一下的畫面:

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

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

第二步:添加背景

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

 

在#3的結尾處,在添加玩家圖片的后面,加上以下的代碼:

  1. grass = pygame.image.load("resources/images/grass.png"
  2. castle = pygame.image.load("resources/images/castle.png"

這段代碼加載圖片并將它們放在變量里。現在它們需要被畫在屏幕上。但是當你檢查了草的圖片后,發現它不會覆蓋整個屏幕,它的分辨率是640 x 480。

 

添加到 game.py 里#6的代碼:

  1. for x in range(width/grass.get_width()+1): 
  2.     for y in range(height/grass.get_height()+1): 
  3.         screen.blit(grass,(x*100,y*100)) 
  4. screen.blit(castle,(0,30)) 
  5. screen.blit(castle,(0,135)) 
  6. screen.blit(castle,(0,240)) 
  7. screen.blit(castle,(0,345 )) 

你可以看到,這段代碼首先是依次通過x進行循環。又是一個依次通過y的循環并且根據循環里x和y的值來畫上草的效果。接下來的幾行就是在屏幕上畫出城堡。

如果你現在運行你的代碼,效果應該如下圖:

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

#p#

第三步:讓兔子能夠移動

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

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

 

把以下代碼加入到 game.py 里#2后面:

  1. keys = [FalseFalseFalseFalse
  2. playerpos=[100,100

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

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

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

 

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

改成:

  1. screen.blit(player, playerpos) 

接下來,根據按下的鍵來更新按鍵記錄數組。PyGame里用給按鍵添加事件的方法來檢測按鍵。

 

在#8八月份的結尾,就在event.py == pygame.QUIT后面,添加一下的代碼(與pygame.QUIT保持同級別縮進):

  1. if event.type == pygame.KEYDOWN: 
  2.     if event.key==K_w: 
  3.         keys[0]=True 
  4.     elif event.key==K_a: 
  5.         keys[1]=True 
  6.     elif event.key==K_s: 
  7.         keys[2]=True 
  8.     elif event.key==K_d: 
  9.         keys[3]=True 
  10. if event.type == pygame.KEYUP: 
  11.     if event.key==pygame.K_w: 
  12.         keys[0]=False 
  13.     elif event.key==pygame.K_a: 
  14.         keys[1]=False 
  15.     elif event.key==pygame.K_s: 
  16.         keys[2]=False 
  17.     elif event.key==pygame.K_d: 
  18.         keys[3]=False 

Wow!又加了這么多代碼。但是如果你仔細看看這些表達式,并沒有那么復雜。

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

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

 

把一下的代碼加到game.py的結尾:(讓它與for 循環保持同級別縮進)

  1. # 9 - Move player 
  2. if keys[0]: 
  3.     playerpos[1]-=5 
  4. elif keys[2]: 
  5.     playerpos[1]+=5 
  6. if keys[1]: 
  7.     playerpos[0]-=5 
  8. elif keys[3]: 
  9.     playerpos[0]+=5 

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

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

第四步:讓兔子轉向

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

看一下下面的插圖:

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

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

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

 

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

  1. import math 

然后,把#6部分的最后一行用一下代碼替換:

  1. # 6.1 - Set player position and rotation 
  2. position = pygame.mouse.get_pos() 
  3. angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26)) 
  4. playerrot = pygame.transform.rotate(player, 360-angle*57.29
  5. playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2
  6. screen.blit(playerrot, playerpos1) 

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

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

 

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

第五步:射吧!兔子

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

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

 

首先,在#2聲明的部分加上必要的變量的聲明。

  1. acc=[0,0
  2. arrows=[] 

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

 

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

  1. arrow = pygame.image.load("resources/images/bullet.png"

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

  1. if event.type==pygame.MOUSEBUTTONDOWN: 
  2.     position=pygame.mouse.get_pos() 
  3.     acc[1]+=1 
  4.     arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32]) 

這段代碼會檢查是否鼠標被點擊了,如果點擊了,它就會得到鼠標的位置并且根據玩家和光標的位置計算出箭頭旋轉角度。旋轉角度的值存放在arrows這個數組里。

 

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

  1. # 6.2 - Draw arrows 
  2. for bullet in arrows: 
  3.     index=0 
  4.     velx=math.cos(bullet[0])*10 
  5.     vely=math.sin(bullet[0])*10 
  6.     bullet[1]+=velx 
  7.     bullet[2]+=vely 
  8.     if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480
  9.         arrows.pop(index) 
  10.     index+=1 
  11.     for projectile in arrows: 
  12.         arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29
  13.         screen.blit(arrow1, (projectile[1], projectile[2])) 

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

試著運行游戲。當你點擊鼠標時,你的兔子就可以射出剪頭了:D

#p#

第六步:獾,拿上武器!

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

[[83780]]

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

  1. 添加一個壞蛋的列表
  2. 更新壞蛋的信息,并且檢查它們是否超出屏幕范圍
  3. 展示這些壞蛋

 

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

  1. badtimer=100 
  2. badtimer1=0 
  3. badguys=[[640,100]] 
  4. healthvalue=194 

以上的代碼里定義了一個定時器,使得游戲里可以經過一段時間后就新建一只獾。

 

在#3部分結尾處添加以下代碼:

  1. badguyimg1 = pygame.image.load("resources/images/badguy.png"
  2. badguyimg=badguyimg1 

第一行跟前面加載圖片的代碼很相似。第二行聲明了一個圖片的復制。

 

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

  1. # 6.3 - Draw badgers 
  2. if badtimer==0
  3.     badguys.append([640, random.randint(50,430)]) 
  4.     badtimer=100-(badtimer1*2
  5.     if badtimer1>=35
  6.         badtimer1=35 
  7.     else
  8.         badtimer1+=5 
  9. index=0 
  10. for badguy in badguys: 
  11.     if badguy[0]<-64
  12.         badguys.pop(index) 
  13.     badguy[0]-=7 
  14.     index+=1 
  15. for badguy in badguys: 
  16.     screen.blit(badguyimg, badguy) 

上面的代碼看起來有不少。第一行是來檢查badtime是否為0,如果為0,創建一個獾然后重新設置badtime。第一個循環更新獾的x坐標,檢查獾是否超出屏幕范圍,如果超出范圍,將獾刪掉。第二個循環是來畫出所有的獾。

 

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

  1. import random 

最后,把一行代碼添加到#4部分的while表達式后面:

  1. badtimer-=1 

 

 

試著運行這段代碼。現在它應該像個真正的游戲了——你可以移動、射箭、轉向,然后有獾沖向你。

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

 

把以下代碼加到#6.3部分index+=1之前的第一個循環里:

  1. # 6.3.1 - Attack castle 
  2. badrect=pygame.Rect(badguyimg.get_rect()) 
  3. badrect.top=badguy[1
  4. badrect.left=badguy[0
  5. if badrect.left<64
  6.     healthvalue -= random.randint(5,20
  7.     badguys.pop(index) 
  8. # 6.3.3 - Next bad guy 

這段代碼相當簡單。如果獾的x坐標離右邊小于64,就刪除壞蛋并且減少游戲里的健康值,減少的大小為5至20里的一個隨機數。

再次運行這個游戲,你就會有一些獾沖過來并且在碰到城堡的時候會消失。盡管你看不到,獾實際上會降低你的健康值。

第七部:獾與箭頭的碰撞

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

是時候來讓箭頭能夠殺死獾讓你能保護你的城堡并且贏得這場游戲。基本上,你需要循環所有的壞蛋,你需要循環所有的箭頭來檢查是否有碰撞。如果碰撞上,刪除獾,刪除箭頭,并且添加精確度的變量里面加1。

 

在#6.3.1部分后面加這些:

  1. #6.3.2 - Check for collisions 
  2. index1=0 
  3. for bullet in arrows: 
  4.     bullrect=pygame.Rect(arrow.get_rect()) 
  5.     bullrect.left=bullet[1
  6.     bullrect.top=bullet[2
  7.     if badrect.colliderect(bullrect): 
  8.         acc[0]+=1 
  9.         badguys.pop(index) 
  10.         arrows.pop(index1) 
  11.     index1+=1 

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

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

第八步:添加健康值和時間的顯示

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

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

 

首先,添加一個計時。在#7部分加上下面的代碼:

  1. # 6.4 - Draw clock 
  2. font = pygame.font.Font(None24
  3. survivedtext = font.render(str((90000-pygame.time.get_ticks())/60000)+":"+str((90000-pygame.time.get_ticks())/1000%60).zfill(2), True, (0,0,0)) 
  4. textRect = survivedtext.get_rect() 
  5. textRect.topright=[635,5
  6. screen.blit(survivedtext, textRect) 

上面的代碼使用了PyGame默認的大小為24的字體。這個字體用來顯示時間信息。

  1. healthbar = pygame.image.load("resources/images/healthbar.png"
  2. health = pygame.image.load("resources/images/health.png"

接下來添加代碼到#6.4部分后面:

  1. # 6.5 - Draw health bar 
  2. screen.blit(healthbar, (5,5)) 
  3. for health1 in range(healthvalue): 
  4.     screen.blit(health, (health1+8,8)) 

這段代碼首先畫了一個全紅色的生命值條。然后根據城堡的生命值往生命條里面添加綠色。

 

運行下代碼,現在就會有計時和生命值條了。

#p#

第九步:贏或輸

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

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

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

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

  • 停止運行游戲
  • l設置游戲的輸出

如果城堡被毀,那么:

  • 停止運行游戲
  • l設置游戲的輸出

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

 

在game.py 結尾添加這些代碼:

  1.     #10 - Win/Lose check 
  2.     if pygame.time.get_ticks()>=90000
  3.         running=0 
  4.         exitcode=1 
  5.     if healthvalue<=0
  6.         running=0 
  7.         exitcode=0 
  8.     if acc[1]!=0
  9.         accuracy=acc[0]*1.0/acc[1]*100 
  10.     else
  11.         accuracy=0 
  12. # 11 - Win/lose display        
  13. if exitcode==0
  14.     pygame.font.init() 
  15.     font = pygame.font.Font(None24
  16.     text = font.render("Accuracy: "+str(accuracy)+"%"True, (255,0,0)) 
  17.     textRect = text.get_rect() 
  18.     textRect.centerx = screen.get_rect().centerx 
  19.     textRect.centery = screen.get_rect().centery+24 
  20.     screen.blit(gameover, (0,0)) 
  21.     screen.blit(text, textRect) 
  22. else
  23.     pygame.font.init() 
  24.     font = pygame.font.Font(None24
  25.     text = font.render("Accuracy: "+str(accuracy)+"%"True, (0,255,0)) 
  26.     textRect = text.get_rect() 
  27.     textRect.centerx = screen.get_rect().centerx 
  28.     textRect.centery = screen.get_rect().centery+24 
  29.     screen.blit(youwin, (0,0)) 
  30.     screen.blit(text, textRect) 
  31. while 1
  32.     for event in pygame.event.get(): 
  33.         if event.type == pygame.QUIT: 
  34.             pygame.quit() 
  35.             exit(0
  36.     pygame.display.flip() 

這是最長的一段代碼!不過它并不復雜。

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

 

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

  1. gameover = pygame.image.load("resources/images/gameover.png"
  2. youwin = pygame.image.load("resources/images/youwin.png"

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

  1. # 4 - keep looping through 
  2. while 1
  3.     badtimer-=1 

改成:

  1. # 4 - keep looping through 
  2. running = 1 
  3. exitcode = 0 
  4. while running: 
  5.     badtimer-=1 

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

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

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

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

 

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

  1. pygame.mixer.init() 

然后在#3部分加載聲音然后設置聲音:

  1. # 3.1 - Load audio 
  2. hit = pygame.mixer.Sound("resources/audio/explode.wav"
  3. enemy = pygame.mixer.Sound("resources/audio/enemy.wav"
  4. shoot = pygame.mixer.Sound("resources/audio/shoot.wav"
  5. hit.set_volume(0.05
  6. enemy.set_volume(0.05
  7. shoot.set_volume(0.05
  8. pygame.mixer.music.load('resources/audio/moonlight.wav'
  9. pygame.mixer.music.play(-10.0
  10. pygame.mixer.music.set_volume(0.25

上面大部分代碼就是加載聲音文件并且配置音量。但是注意 pygame.mixer.music.load這行代碼——這一行加載游戲的背景音樂然后下一行讓背景音樂一直不停的播放。

 

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

  1. # section 6.3.1 after if badrect.left<64: 
  2. hit.play() 
  3. # section 6.3.2 after if badrect.colliderect(bullrect): 
  4. enemy.play() 
  5. # section 8, after if event.type==pygame.MOUSEBUTTONDOWN: 
  6. shoot.play() 

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

那接下來呢?

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

你可以從這里下載最終的游戲代碼。

 

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

原文鏈接: Julian Meyer   翻譯: 伯樂在線 - 伯樂在線讀者

譯文鏈接: http://blog.jobbole.com/46308/

責任編輯:林師授 來源: 伯樂在線
相關推薦

2020-12-07 16:20:53

Python 開發編程語言

2021-08-13 09:01:31

Python小游戲Python基礎

2021-05-18 14:42:55

PythonMySQL

2019-01-24 09:00:00

PythonAutoML機器學習

2015-03-23 12:33:28

2015-04-22 11:29:45

PythonPython創建瀑布圖

2023-08-03 08:51:07

2020-04-09 09:52:42

Python數據技術

2021-08-09 13:31:25

PythonExcel代碼

2021-12-26 18:32:26

Python Heic 文件

2014-07-22 10:19:19

NeoBundle

2012-08-31 09:54:35

程序員游戲開發

2017-07-19 10:22:07

2022-02-18 10:34:19

邏輯回歸KNN預測

2023-10-27 11:38:09

PythonWord

2019-09-05 10:07:23

ZAODeepfakes換臉

2018-05-14 10:43:53

平衡數據數據分析Python

2021-05-10 06:48:11

Python騰訊招聘

2021-12-11 20:20:19

Python算法線性

2021-02-02 13:31:35

Pycharm系統技巧Python
點贊
收藏

51CTO技術棧公眾號

7799精品视频| 国产精品久久久久久妇女6080| 欧美黑人性视频| 污污免费在线观看| 国产资源在线观看入口av| 久久亚洲二区三区| 国产中文欧美精品| 日本少妇xxxx动漫| 国产欧美亚洲精品a| 欧美日韩精品欧美日韩精品| 久久亚洲国产成人精品无码区| 亚洲av电影一区| 久久精品国产免费看久久精品| 九九热这里只有在线精品视| 国产艳俗歌舞表演hd| jizz亚洲女人高潮大叫| 亚洲国产精品一区二区尤物区| 麻豆av一区二区| 97国产精品久久久| 国产亚洲精品久久久久婷婷瑜伽| 综合激情国产一区| 日本少妇毛茸茸| 伊人久久大香| 91国产免费看| 天堂…中文在线最新版在线| 日韩三级影院| 91美女视频网站| 亚洲在线免费观看| 国产偷人爽久久久久久老妇app| 国产精品xvideos88| 中文字幕视频在线免费欧美日韩综合在线看 | 高潮一区二区三区乱码| 蜜桃一区二区三区在线观看| 91大神在线播放精品| 欧美三级在线免费观看| 日韩视频在线观看| 亚洲欧美成人网| 中文成人无字幕乱码精品区| 一区二区视频| 日韩一级完整毛片| 中文字幕66页| 国产精品亚洲成在人线| 91久久奴性调教| 免费高清在线观看免费| f2c人成在线观看免费视频| 亚洲欧美偷拍另类a∨色屁股| 日韩欧美亚洲v片| 欧美视频综合| 久久综合精品国产一区二区三区| 国产精品一 二 三| 空姐吹箫视频大全| 成人亚洲一区二区一| 2014亚洲精品| 国产av一区二区三区精品| 激情六月婷婷久久| 成人午夜高潮视频| 国产欧美一级片| 国产在线观看免费一区| 成人午夜两性视频| 99久久夜色精品国产亚洲| 精品一区二区影视| 亚洲xxxxx电影| 国产黄色美女视频| 国产黑丝在线一区二区三区| 成人18视频| 黄色片一区二区| 99久久国产综合色|国产精品| 国产精品亚洲一区| 日本免费不卡| 国产欧美一区二区在线| 亚洲一区二区不卡视频| 国内外激情在线| 亚洲最大成人网4388xx| 国产96在线 | 亚洲| 神马久久午夜| 在线视频欧美精品| 在线观看岛国av| 欧美高清一级片| 亚洲国产精品免费| 亚洲精品国产熟女久久久| 青青草原综合久久大伊人精品| 中文字幕日韩在线播放| 激情视频在线播放| 99国内精品| 国产精品色午夜在线观看| 国产精品久久久久久久久久久久久久久久 | 日本妇女一区| 一区二区在线视频| 91嫩草|国产丨精品入口| 狠狠入ady亚洲精品经典电影| 97精品国产97久久久久久春色| 亚洲成人第一网站| 韩国精品久久久| 精品日产一区2区三区黄免费| 加勒比一区二区三区在线| 最新国产精品久久精品| 免费观看美女裸体网站| 主播大秀视频在线观看一区二区| 日韩一卡二卡三卡国产欧美| 国产精品成人一区二区三区电影毛片| 日韩久久精品网| 久久免费视频这里只有精品| 国产一级片一区二区| 国产白丝网站精品污在线入口| 欧美日韩国产一二| 自拍亚洲图区| 欧美吞精做爰啪啪高潮| 国产高清成人久久| 97久久夜色精品国产| 57pao精品| 亚洲AV无码一区二区三区性| 久久精品综合网| 久久久久久久久久伊人| 欧洲av一区二区| 亚洲韩国日本中文字幕| 国产精品精品软件男同| 亚洲综合精品| 999国产视频| jzzjzzjzz亚洲成熟少妇| 亚洲国产精品麻豆| 黄色aaaaaa| 精品视频免费| 日韩美女视频免费在线观看| 亚洲国产欧美另类| 国产精品传媒入口麻豆| 国产黄色特级片| 国内精品免费| 欧美激情a在线| 国产乱淫片视频| 中文字幕乱码一区二区免费| 无罩大乳的熟妇正在播放| 天堂精品久久久久| 久久国产精品偷| 夜夜嗨aⅴ一区二区三区| 久久婷婷国产综合国色天香| 天堂…中文在线最新版在线| 成人三级av在线| 欧美精品性视频| 97免费观看视频| 国产精品福利一区二区三区| 亚洲高清在线免费观看| 免费电影一区二区三区| 欧美在线xxx| 午夜av免费在线观看| 亚洲一级电影视频| 少妇熟女视频一区二区三区 | 国产九色91回来了| 久久久精品国产99久久精品芒果| 自慰无码一区二区三区| 欧美人与动xxxxz0oz| 97婷婷涩涩精品一区| 欧美 日韩 中文字幕| 亚洲第一搞黄网站| 精品人妻一区二区三区日产| 亚洲精品日本| 国产综合动作在线观看| 麻豆理论在线观看| 精品视频—区二区三区免费| 特级做a爱片免费69| 久久久久国产精品人| 亚洲欧美另类动漫| 99久久婷婷| 92看片淫黄大片欧美看国产片| 50度灰在线| 亚洲第一页在线| 亚洲 欧美 成人| 中文字幕高清一区| 日本精品一区在线| 国产精品videossex久久发布| 国产精品9999久久久久仙踪林| av丝袜在线| 亚洲天堂精品在线| 中文字幕第315页| 亚洲情趣在线观看| 黄色激情在线观看| 欧美亚洲免费| 夜夜爽99久久国产综合精品女不卡 | 天天综合网 天天综合色| 黄色国产在线观看| 美女www一区二区| 日产精品久久久久久久蜜臀| 少妇久久久久| 国产免费一区视频观看免费| 羞羞的网站在线观看| 日韩精品日韩在线观看| 中文字幕一区二区在线视频| 一区二区三区中文在线| www.久久国产| 久久超级碰视频| 久久国产精品视频在线观看| 精品久久影院| www.久久久| 色猫猫成人app| 欧美激情综合色| 成年人视频在线看| 精品国精品自拍自在线| 亚洲天堂五月天| 一区二区三区美女| 久操视频在线观看免费| 成人中文字幕合集| 亚洲国产精品三区| 99精品热6080yy久久| 杨幂一区欧美专区| 最新国产一区| 成人欧美视频在线| 欧美大片网站| 欧美一级淫片播放口| av大全在线| 中文字幕精品久久| 香蕉视频免费看| 日韩精品一区二区三区蜜臀 | 末成年女av片一区二区下载| 久久精品国产一区二区三区 | 久久蜜臀精品av| 欧美69精品久久久久久不卡 | 怡红院一区二区| 国产综合色产在线精品| 久久国产色av免费观看| 伊人影院久久| 真人做人试看60分钟免费| 精品国产美女| 欧美日韩国产精品一卡| 欧美激情99| 不卡一区二区三区视频| 亚洲伦理网站| 国产精品成久久久久三级| 在线观看v片| 国语自产精品视频在线看| 伊人电影在线观看| 久久久国产影院| 老司机免费在线视频| 日韩在线免费视频观看| 国产毛片在线看| 一二美女精品欧洲| 国产日本在线视频| 亚洲欧美一区二区三区情侣bbw | 99国产精品久久久久久久久久久| 丰满少妇一区二区三区专区| 国内外成人在线| 午夜激情影院在线观看| 久久成人免费网站| 色91精品久久久久久久久| 久久精品国产亚洲高清剧情介绍 | 天天综合网久久综合网| 天天综合色天天综合色h| 久久精品视频6| 亚洲超碰精品一区二区| 国产一级淫片免费| 亚洲成人动漫av| 国产成人精品片| 色综合久久久久综合体桃花网| 毛片基地在线观看| 日韩人体视频一二区| 黄色一级视频免费看| 色综合天天性综合| 中文字幕视频二区| 欧美男男青年gay1069videost| 亚洲一区在线观| 91精品国产麻豆| 乱精品一区字幕二区| 亚洲精品wwwww| 深夜福利视频在线免费观看| 亚洲欧美日韩天堂一区二区| 国产女人在线视频| 色av中文字幕一区| 青青草视频在线免费直播| 久久理论片午夜琪琪电影网| 色偷偷偷在线视频播放| 欧美一区视频在线| 2019年精品视频自拍| 成人a级免费视频| 成功精品影院| 色女人综合av| 欧美xxx在线观看| 青青视频在线播放| 蜜臀av一区二区三区| 丰满人妻一区二区三区大胸| 97超碰欧美中文字幕| 中文天堂资源在线| 一区二区三区精密机械公司| 欧美日韩乱国产| 欧美日本韩国一区二区三区视频 | 久久综合九色综合欧美98 | 91日韩免费| 精品人妻少妇一区二区| 日本亚洲视频在线| 国产男女无遮挡猛进猛出| 91免费小视频| 国产精品国产精品88| 福利一区福利二区微拍刺激| 亚洲天堂网视频| 亚洲黄色在线看| 免费网站看v片在线a| 午夜精品在线视频| 九七电影院97理论片久久tvb| av日韩中文字幕| 成人av国产| 欧美 日韩 亚洲 一区| 老司机精品视频导航| 日韩免费高清一区二区| 国产精品不卡一区| 久久久久久91亚洲精品中文字幕| 欧美精品丝袜中出| 久久久资源网| 久久久久久久久久久成人| 国产日本久久| 鲁丝一区二区三区免费| 欧美日韩精选| 日韩中文字幕a| 久久中文字幕电影| 久久久久97国产| 欧美丰满嫩嫩电影| 国产视频二区在线观看| 97成人在线视频| 三级欧美日韩| 一区二区三区日韩视频| 日韩av二区在线播放| 欧美一级片黄色| 一区二区三区av电影| 一区二区自拍偷拍| 亚洲一区第一页| 天堂在线中文网官网| 国产欧美综合精品一区二区| 亚洲综合中文| 奇米视频888| 国产精品福利一区二区| 夜夜躁日日躁狠狠久久av| 日韩精品在线视频美女| www成人免费观看| 97人人澡人人爽| 午夜欧美在线| www.五月天色| 亚洲男同1069视频| 99热精品在线播放| 伦理中文字幕亚洲| 国产精品毛片无码| 一区二区三区四区五区视频| 日韩成人午夜电影| 久久久视频6r| 欧美私人免费视频| www 日韩| 成人av资源在线播放| 五月天激情综合网| 亚洲一区二区三区观看| 亚洲丝袜制服诱惑| 99热这里只有精品9| 色综合久久久888| 在线综合色站| 性一交一乱一伧国产女士spa| 成人国产精品免费网站| 日本五十熟hd丰满| 日韩国产高清污视频在线观看| 免费在线小视频| 日韩精品另类天天更新| 日韩av一级片| 日本福利片在线观看| 日韩视频123| 日本在线高清| 日韩欧美亚洲在线| 精品一区二区三区在线视频| 丁香花五月激情| 亚洲第一福利视频| 欧美极品影院| 一本一道久久久a久久久精品91| 激情都市一区二区| 精品少妇一二三区| 亚洲女人天堂av| 亚洲热av色在线播放| 欧美一区二区视频在线播放| 91性感美女视频| 中文字幕乱码在线观看| 美女999久久久精品视频| 国内毛片久久| 国产xxxxx视频| 亚洲人吸女人奶水| 日本精品一二区| 国产精品扒开腿做爽爽爽男男| 99久久99久久精品国产片桃花| 国产精品日日摸夜夜爽| 欧美午夜视频一区二区| 免费网站免费进入在线| 国产色综合一区二区三区| 视频一区视频二区中文字幕| 日本a级片视频| 亚洲欧美激情视频| 久久九九精品视频| 欧美 日韩精品| 亚洲欧美日韩人成在线播放| 天天av综合网| 91啪国产在线| 久久久久久久波多野高潮日日| 亚洲色偷偷综合亚洲av伊人| 日韩av在线电影网| 伊人久久一区| 欧美 国产 小说 另类| 亚洲男人的天堂在线aⅴ视频| 人成在线免费视频| 亚洲aⅴ男人的天堂在线观看| 久久国产福利| 国产精品30p|