現在飛機已經能夠帶著血條突突突飛下來讓玩家虐,于是我們給用戶一點打飛機的成就感——計分系統以及難度遞增機制。
1、計分系統
首先,我們在main()函數中添加全局變量(score)并初始化為零用以統計當前用戶的打飛機得分:
~~~
score = 0 # 統計用戶得分
~~~
接下來只需要在敵機銷毀時對score進行累加就可以了,我們在這里先給敵機標個價:小型敵機一架值500分,中型敵機一架值2000分,大型敵機一架值6000分,然后在敵機損毀時根據敵機類型選擇加多少分,對于小型敵機:
~~~
for each in small_enemies: # 繪制小型敵機并自動移動
if each.active:
# 繪制小型敵機
else:
if e1_destroy_index == 0:
# 敵機損毀音效
if not (delay % 3):
# 播放損毀畫面
if e1_destroy_index == 0:
score += 500
# reset()
~~~
中型敵機:
~~~
for each in mid_enemies: # 繪制中型敵機并自動移動
if each.active:
# 繪制中型敵機# 繪制血槽
else:
if e2_destroy_index == 0:
# 播放損毀音效
if not (delay % 3):
# 繪制損毀畫面
if e2_destroy_index == 0:
score += 2000
# reset()
~~~
大型敵機:
~~~
for each in big_enemies: # 繪制大型敵機并自動移動
if each.active: # 如果飛機正常存在
# 繪制大型敵機# 繪制血槽
if each.rect.bottom == -50:
# 播放大型飛機的音效(循環播放)
else: # 如果飛機已撞毀
# 出場音效停止
if e3_destroy_index == 0:
# 播放飛機撞毀音效
if not (delay % 3): # 每三幀播放一張損毀圖片# 大型敵機有六張損毀圖片
if e3_destroy_index == 0: # 如果損毀圖片播放完畢,則重置飛機屬性
score += 6000
# reset()
~~~
需要指出一點,這里之所以添加“if e3_destroy_index == 0:”是因為整個飛機損毀的過程是由四幀(或六幀)圖像的播放來完成的,如果不加這個限制,則在飛機損毀過程中每播放一幀就加一次分,這樣小型機和中型機損毀一次就要加4次分,大型機損毀一次就要加6次分,因此需要規定每次飛機損毀時只在播放損毀最后一幀畫面之后再進行加分、復位,播放聲音等操作。
2、顯示分數
在游戲過程中,需要將玩家得分實時顯示在界面的左上角,這就涉及到Pygame的font模塊的應用。首先在main函數初始化過程(while循環之前)調用font模塊成員函數創造系統字體對象:
~~~
score_font = pygame.font.SysFont("arial", 48) # 定義分數字體
~~~
這里的score_font對象采用系統字體“arial”,字號為48。之后通過調用字體對象的render()成員函數將當前分數存于字體對象中,并返回字體的surface格式對象,用以接下來的屏幕打印工作:
~~~
score_text = score_font.render("Score : %s" % str(score), True, color_white)
screen.blit(score_text, (10, 5))
~~~
這里先將當前分數通過str()函數轉換成字符串,然后格式化到“Score:”的字符串中,第二個參數表示當前字體在打印時自動開啟抗鋸齒功能,第三個參數為字體顏色。建議將這兩句代碼放在while循壞體內比較靠前的位置,以便使代碼更為整潔。運行程序,分數能夠正確的、實時的顯示在屏幕上,接下來我們來給游戲增加難度——難度分級遞增機制。
3、設計難度分級標準
我們的目的是隨著用戶得分的提高,游戲對應難度也逐漸加大,首先需要在main()函數添加一個全局標志位level用以指示當前游戲處于那種難度:
~~~
level = 1 # 游戲難度級別
~~~
接下來簡單的制定以下難度門檻:分數處于(0,5000)為第一級難度,處于(5000,30000)為第二級難度,處于(30000,60000)為第三級難度:
~~~
# ====================定義難度遞進操作====================
if level == 1 and score > 5000: # 如果達到第二難度等級,則增加3架小型敵機,2架中型敵機,1架大型敵機,并提升小型敵機速度
level = 2
pass
elif level == 2 and score > 30000: # 如果達到第三難度等級
level = 3
pass
elif level == 3 and score > 60000: # 如果達到第四難度等級
level = 4
pass
~~~
接下來開始根據對應難度等級來給游戲加難度,如何才算增加難度,無非是增加敵機數量,增加敵機速度,因此我們定義兩個函數來完成這個功能,首先定義增加飛機數量的函數,剛好我們之前已經定義好了這個函數:
~~~
# ====================敵方飛機生成控制函數====================
def add_small_enemies(group1, group2, num):
def add_mid_enemies(group1, group2, num):
def add_big_enemies(group1, group2, num):
~~~
關于這些函數的具體作用參見之前博文,接下來定義速度增加函數,原理就是增加敵機對象內部speed成員變量的值即可:
~~~
# ====================提升敵機速度====================
def inc_speed(target, inc):
for each in target:
each.speed += inc
~~~
target為待加速的敵機精靈組,inc為加速的程度(大致可以成為加速度吧)。
4、完善難度分級遞增機制
定義完“add_small_enemies”、“inc_speed”等操作函數后,我們給出完整的難度分級遞增機制部分代碼(建議放在while循環的開始部分):
~~~
# ====================定義難度遞進操作====================
if level == 1 and score > 5000: # 如果達到第二難度等級,則增加3架小型敵機,2架中型敵機,1架大型敵機,并提升小型敵機速度
level = 2
level_up_sound.play()
add_small_enemies(small_enemies, enemies, 3)
add_mid_enemies(mid_enemies, enemies, 2)
add_big_enemies(big_enemies, enemies, 1)
inc_speed(small_enemies, 1)
elif level == 2 and score > 30000: # 如果達到第三難度等級
level = 3
level_up_sound.play()
add_small_enemies(small_enemies, enemies, 3)
add_mid_enemies(mid_enemies, enemies, 2)
add_big_enemies(big_enemies, enemies, 1)
inc_speed(small_enemies, 1)
inc_speed(mid_enemies, 1)
elif level == 3 and score > 60000: # 如果達到第四難度等級
level = 4
level_up_sound.play()
add_small_enemies(small_enemies, enemies, 3)
add_mid_enemies(mid_enemies, enemies, 2)
add_big_enemies(big_enemies, enemies, 1)
inc_speed(small_enemies, 1)
inc_speed(mid_enemies, 1)
inc_speed(big_enemies, 1)
~~~
這段代碼的分級機制很簡單,每增加一級難度,就在之前的基礎上添加三架小型敵機,兩架中型敵機和一架大型敵機,同時將各個機型的速度均加一,在難度提升的瞬間還有特殊音效播放。ok程序到這里應該可以正確運行,試玩一下發現,當分數超過30000分時敵機已經鋪天蓋地的飛了下來,為了玩家的生存,我們將在下一篇博文中為我方飛機添加超級武器:超級子彈和全屏炸彈。
~~~
?
~~~
~~~
~~~