精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产大片中文字幕在线观看| 久久久久久人妻一区二区三区| 中文在线字幕免费观| 午夜精品毛片| 亚洲第一二三四五区| 欧美影院精品一区| 国产精品久久国产精品99gif| 卡通动漫亚洲综合| 欧美欧美黄在线二区| 91精品国产入口| 欧美精品色婷婷五月综合| 国产在线1区| 91免费视频网址| 亚洲一区二区免费| 樱花视频在线免费观看| 韩日欧美一区| 视频直播国产精品| 免费黄色在线视频| 97色成人综合网站| 欧美顶级少妇做爰| 五月婷婷狠狠操| 免费看男女www网站入口在线| 综合久久国产九一剧情麻豆| 免费国产一区二区| 丰满人妻妇伦又伦精品国产| 久久精品二区亚洲w码| 欧美在线观看网站| 久操视频免费在线观看| 亚洲一区 二区 三区| 亚洲社区在线观看| 天天插天天射天天干| 欧美电影院免费观看| 欧美浪妇xxxx高跟鞋交| 日本美女高潮视频| 亚洲综合在线电影| 色婷婷综合久久久中文字幕| 一二三四视频社区在线| 女人黄色免费在线观看| 亚洲精品国产品国语在线app| 亚洲一区二区三区精品动漫| sese一区| 中文字幕日韩一区二区| 亚洲综合欧美日韩| 视频三区在线| 国产精品久久久久久久久免费丝袜| 欧美日韩免费高清| 免费在线国产| 国产日产精品1区| 欧美日韩另类综合| 国产永久av在线| 国产偷国产偷精品高清尤物| 久久久久久久久久码影片| 午夜性色福利视频| 97久久精品人人澡人人爽| 精品国产一区二区三区四区精华| 天堂av2024| 26uuu色噜噜精品一区| 久久狠狠久久综合桃花| 你懂的视频在线观看| 久久久青草青青国产亚洲免观| 久久久久九九九| 暖暖视频在线免费观看| 欧美激情资源网| 亚洲午夜精品福利| 二区三区四区高清视频在线观看| 樱花影视一区二区| 欧美日韩福利在线| 鲁鲁在线中文| 日本大香伊一区二区三区| 日韩大片一区二区| 国产精品18| 亚洲福利视频免费观看| 亚洲天堂成人av| 欧美精品尤物在线观看| 久久九九亚洲综合| 国产精品2020| 日韩高清不卡在线| 亚洲自拍偷拍区| 天堂网av2014| 国产日产亚洲精品系列| 免费在线精品视频| 国产福利电影在线播放| 欧洲精品视频在线观看| 在线视频观看一区二区| 狠狠久久伊人| 中文字幕在线观看日韩| 国产亚洲小视频| 久久黄色网页| 91黄在线观看| 国产有码在线| 亚洲一区中文在线| 国产成人精品无码播放| 中文成人激情娱乐网| 亚洲国产欧美精品| 美女视频久久久| 亚洲高清av| 国产免费一区二区三区香蕉精| 精品人妻无码一区二区三区蜜桃一| av一区二区三区四区| 亚洲成人a**址| 国内在线视频| 欧美日韩不卡一区| 一级国产黄色片| 欧美欧美全黄| 国产精品夜色7777狼人| 五月激情丁香婷婷| 亚洲免费观看高清完整版在线观看 | 欧美18免费视频| 中文字幕亚洲无线码在线一区| 久久久香蕉视频| 青青草成人在线观看| 国产一区二区自拍| 超碰个人在线| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 逼特逼视频在线观看| 91蜜臀精品国产自偷在线| 欧美在线xxx| 二区三区在线视频| 亚洲色图都市小说| 亚洲这里只有精品| 伊人久久大香线蕉无限次| 色综合视频网站| 一级片视频免费| 久久久久免费观看| 欧美亚洲另类色图| 加勒比中文字幕精品| 九九精品在线观看| 国产又大又黄的视频| 亚洲国产精品av| 精品视频一区二区在线| 中文字幕精品影院| 69**夜色精品国产69乱| 四虎永久在线观看| 亚洲成av人片| 国产a级黄色片| 欧美欧美天天天天操| 91嫩草免费看| 欧美人与性动交α欧美精品济南到 | 成人精品一区二区三区电影免费 | 成人av在线亚洲| avtt亚洲| 欧美日韩免费在线视频| 激情高潮到大叫狂喷水| 九色综合狠狠综合久久| 亚洲午夜久久久影院伊人| 欧洲亚洲精品久久久久| 最新国产精品亚洲| 国产又大又黑又粗| 亚洲激情第一区| www日本在线观看| 999成人网| 91在线视频精品| 动漫一区在线| 亚洲成人黄色网址| 日本高清www免费视频| 久久网站热最新地址| 日韩视频免费在线播放| 成人羞羞视频在线看网址| 国产免费观看久久黄| 久操免费在线| 日韩三级视频在线看| 日本熟妇一区二区| 久久久久久毛片| 爱情岛论坛亚洲首页入口章节| 欧美xxav| 国产精品播放| 欧美亚洲韩国| 久久久精品一区二区| 亚洲精品国产精品乱码不卡| 精品久久久久久久久久久| 久久精品—区二区三区舞蹈| 日本亚洲免费观看| 欧美少妇在线观看| 日韩一级电影| 成人av在线网址| 爱看av在线| 国产亚洲精品久久久| 国产强被迫伦姧在线观看无码| 亚洲线精品一区二区三区八戒| 欧美大片免费播放器| 奇米影视一区二区三区小说| 欧美一二三不卡| 天堂av一区二区三区在线播放| 国产精品久久久久不卡| 色呦呦在线视频| 亚洲网址你懂得| 朝桐光av在线一区二区三区| 色综合天天狠狠| 欧美成人精品欧美一级| 久久久777精品电影网影网 | 中国丰满人妻videoshd| 欧美va久久久噜噜噜久久| 国产在线观看一区| www久久久| 日韩av成人在线观看| 成人免费高清| 一区二区欧美在线| 日本黄色免费视频| 欧美精品久久一区| 亚洲第一精品在线观看| 亚洲激情中文1区| 在线视频第一页| 97久久精品人人做人人爽| 日韩av影视大全| 久久精品官网| 国产精品一线二线三线| 亚洲精品久久久| 色婷婷精品国产一区二区三区| 中文字幕在线播出| 国产探花在线精品| 国产精品一区二区免费| 成人污版视频| 国产成人精品在线观看| 不卡视频观看| 欧美另类暴力丝袜| 日本在线观看视频| 国产一区二区三区中文| 天天爽夜夜爽夜夜爽| 欧美成va人片在线观看| 一区二区www| 欧美色欧美亚洲另类二区| 欧美日韩乱国产| 性做久久久久久免费观看| 91porn在线视频| 亚洲欧洲中文日韩久久av乱码| eeuss中文字幕| 中文字幕+乱码+中文字幕一区| 国产精品一区二区入口九绯色| 成人av中文字幕| 性一交一黄一片| 国产精品一区免费视频| 亚洲黄色片免费看| 久久99精品视频| 日本免费观看网站| 日韩精品一区第一页| 欧美私人情侣网站| 美女诱惑黄网站一区| 国产精品97在线| 国产精品最新自拍| 97在线播放视频| 久久婷婷av| 日韩精品一区中文字幕| 日韩精品成人一区二区三区| 精品久久久噜噜噜噜久久图片| 噜噜爱69成人精品| 欧美午夜性生活| 免费人成精品欧美精品| 久久久久xxxx| 国产成人在线观看免费网站| 特黄特色免费视频| 99久久精品久久久久久清纯| 在线免费观看a级片| 久久久久久久久伊人| 久久成人激情视频| 亚洲国产精品高清| www欧美com| 五月激情综合色| 久久国产视频一区| 欧美写真视频网站| 国产日本精品视频| 亚洲二区中文字幕| 高清美女视频一区| 日韩在线视频一区| 成人一对一视频| 米奇777在线欧美播放| 成年网站在线播放| 国产精一区二区三区| 人妻 日韩 欧美 综合 制服| 久久综合狠狠综合久久激情| 国产亚洲精品精品精品| 亚洲另类在线视频| 日本网站在线免费观看| 在线观看亚洲专区| 国产99视频在线| 日韩不卡中文字幕| se在线电影| 久久久久久12| 成人18视频在线观看| 亚洲www永久成人夜色| 嫩草国产精品入口| 在线免费观看成人网| 一本色道久久综合亚洲精品不卡| 日本888xxxx| 成人美女视频在线看| 白白色免费视频| 亚洲精品乱码久久久久久久久| 国产小视频在线免费观看| 欧美人妇做爰xxxⅹ性高电影 | 粉嫩一区二区三区性色av| 黄瓜视频污在线观看| 综合激情成人伊人| 日韩在线视频不卡| 精品久久人人做人人爱| 成av人电影在线观看| 久久频这里精品99香蕉| 日韩色淫视频| 久久亚洲高清| 欧美久久影院| 国产成人美女视频| 久久久一区二区| 日韩av一二三区| 欧美喷水一区二区| 加勒比一区二区三区在线| 欧美日本高清视频| 777午夜精品电影免费看| 国精产品一区二区| 欧美日本不卡高清| 国内自拍第二页| 国产午夜精品一区二区三区嫩草| 久久久久久久久久99| 欧美蜜桃一区二区三区| 国产中文字幕在线看| 97视频在线看| 懂色av一区二区| 视频一区二区视频| 蜜臀a∨国产成人精品| 三级网站在线免费观看| 精品国产91久久久| 蜜桃av噜噜一区二区三区麻豆| 国产一区二区三区精品视频| 影音先锋欧美在线| 久热综合在线亚洲精品| 天天插天天射天天干| 亚洲电影一区二区| 国产aⅴ一区二区三区| 久久精品中文字幕一区| 免费视频观看成人| 日韩欧美一区二区在线观看| 午夜一级久久| 波多野结衣先锋影音| 午夜影院久久久| 人人妻人人玩人人澡人人爽| 天天综合天天综合色| 久久人人爽人人片| 久久精品亚洲精品国产欧美| 亚洲影院在线播放| 亚洲欧美www| 日韩在线影院| 视频在线99| 美女视频网站黄色亚洲| 色婷婷粉嫩av| 91精品国产一区二区三区蜜臀| 国产传媒在线播放| 91最新在线免费观看| 欧美成人高清| 亚洲欧美综合视频| 香蕉成人伊视频在线观看| 人妻夜夜爽天天爽| 日韩av成人在线观看| 欧美限制电影| 亚洲午夜激情影院| 亚洲精品中文在线影院| 天堂成人在线观看| 国产999在线观看| 成人中文视频| 欧美体内she精高潮| 亚洲电影一区二区三区| 免费在线性爱视频| 91精品国产自产在线| 欧美精品黄色| 精品无码在线视频| 在线精品视频免费播放| 黄网站免费在线观看| 国产伦理久久久| 日韩高清欧美激情| 国模无码国产精品视频| 亚洲精品国产suv| 毛片无码国产| 只有这里有精品| av一区二区三区黑人| 在线观看免费中文字幕| 欧美黑人xxxx| 国内黄色精品| 女同性αv亚洲女同志| 欧美性少妇18aaaa视频| 男人天堂久久久| 国产一区二区中文字幕免费看| 日本伊人色综合网| 久久久久久久蜜桃| 国产一级揄自揄精品视频| 亚洲无线观看| 一区二区在线播放视频| 亚洲一区二区三区在线播放| 你懂的在线看| 成人资源av| 日本美女视频一区二区| 久久亚洲AV无码| 最近的2019中文字幕免费一页| 福利在线一区| 成年人三级黄色片| 精品久久久香蕉免费精品视频| 日本中文字幕在线观看| 久久久久网址| 国产精品一卡二| 日韩xxx视频| 性日韩欧美在线视频| 欧美国产专区| 久久精品国产91精品亚洲| 97久久中文字幕| 青青青国产在线视频|