作為一個有良心的游戲,我們不能讓玩家沉迷下去,所以子彈的數量我們要限制一下,變相增加游戲難度。
1.5.6 限制子彈數量
首先,在settings.py中存儲所允許的最大子彈數:這里我們設置為3發。
class Settings():
#存儲游戲設置
def __init__(self):
#初始化游戲設置
#屏幕設置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
#飛船設置
self.ship_speed_factor = 1.5
#子彈設置
self.bullet_speed_factor = 1
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60,60,60
self.bullets_allowed = 3
下面我們需要在game_functions.py的check_keydown_events() 中,創建新子彈前檢查未消失的子彈數是否小于該設置:
def check_keydown_events(event,ai_settings,screen,ship,bullets):
# 響應按鍵
if event.key == pygame.K_RIGHT:
#向右移動飛船
ship.moving_right = True
elif event.key == pygame.K_LEFT:
#向左移動飛船
ship.moving_left = True
elif event.key == pygame.K_SPACE:
#創建一顆子彈,并將其加入編組bullets中
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
玩家按空格鍵時,我們檢查bullets 的長度。如果len(bullets) 小于3,我們就創建一個新子彈;但如果已有3顆未消失的子彈,則玩家按空格鍵時什么都不會發生。如果你 現在運行這個游戲,屏幕上最多只能有3顆子彈。
1.5.7 創建函數update_bullets()
編寫并檢查子彈管理代碼后,可將其移到模塊game_functions 中,以讓主程序文件alien_invasion.py盡可能簡單。我們創建一個名為update_bullets() 的新函數,并將其添加到game_functions.py的末尾:
def update_bullets(bullets):
# 更新子彈的位置
bullets.update() # 刪除已消失的子彈
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
#print(len(bullets))
現在我們主程序的代碼就更加簡潔了:
import pygame
from pygame.sprite import Group
from setting import Settings
from ship import Ship
import game_functions as gf
def rungame():
#初始化游戲并創建一個屏幕對象
pygame.init()
#實例化設置對象
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
#創建一只飛船
ship = Ship(ai_settings,screen)
#創建一個用于存儲子彈的編組
bullets = Group()
#開始游戲主循環
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_screen(ai_settings,screen,ship,bullets)
rungame()
1.5.8 創建函數fire_bullet()
下面將發射子彈的代碼移到一個獨立的函數中,這樣,在check_keydown_events() 中只需使用一行代碼來發射子彈,讓elif 代碼塊變得非常簡單:
def fire_bullet(ai_settings,screen,ship,bullets):
#創建一顆子彈,并將其加入編組bullets中
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
函數fire_bullet() 只包含玩家按空格鍵時用于發射子彈的代碼;在check_keydown_events() 中,我們在玩家按空格鍵時調用fire_bullet() 。