1. 程式人生 > >外星人大戰---------遊戲開發(三)

外星人大戰---------遊戲開發(三)

前兩章已經針對於遊戲螢幕以及飛船移動,以及發射子彈有了簡單的設定,現在就開始新增外星人。螢幕邊緣附近新增一個外星人,然後生成一群外星人,外星人向兩邊和下面移動,並刪除被子彈擊中的外星人,最後顯示使用者擁有的飛船數量,用完後結束遊戲。

做專案就是先一步一步構建,然後再研究已有的程式碼看看是否還可以重構程式碼,簡潔程式碼


1.建立第一個外星人:外星人的創建於飛船類似,也是先建立一個alien類,用於後續管控alien,首先我們把外星人的圖片放入images的資料夾下,建立alien類:

#外星人類
import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
    def __init__(self,ai_settings,screen):
        super().__init__()
        self.ai_settings=ai_settings
        self.screen=screen

#載入圖片和獲取矩形
        self.image=pygame.image.load('images/alien.bmp')
        self.rect=self.image.get_rect()

#外星人初始位置在左上角附件,左邊距設為外星人的寬度,上邊距設為外星人的高度
        self.rect.x=self.rect.width
        self.rect.y=self.rect.height

#儲存外星人的位置
        self.x=float(self.rect.x)

    def blitme(self):
        self.screen.blit(self.image,self.rect)  

修改功能模組:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等

import sys
import pygame
from bullet import Bullet

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:      #響應按空格鍵
                fire_bullet(ai_settings,screen,ship,bullets)

def fire_bullet(ai_settings,screen,ship,bullets):   #發射子彈
	if len(bullets)<ai_settings.bullets_allowed:    
		new_bullet=Bullet(ai_settings,screen,ship)
		bullets.add(new_bullet)

		
		
def check_keyup_events(event,ship):   #響應按鍵鬆開
	if event.key==pygame.K_RIGHT:
		ship.moving_right=False
	elif event.key==pygame.K_LEFT:
		ship.moving_left=False
	

def check_events(ai_settings,screen,ship,bullets):     #響應鍵盤和滑鼠事件
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit() 
		elif event.type==pygame.KEYDOWN:
			check_keydown_events(event,ai_settings,screen,ship,bullets)

		elif event.type==pygame.KEYUP:       #監測是否放開鍵盤
			check_keyup_events(event,ship)
         
def update_screen(ai_settings,screen,ship,alien,bullets):   # 更新螢幕
	screen.fill(ai_settings.bg_color)
	for bullet in bullets.sprites():
		bullet.draw_bullet()
	ship.blitme()
	alien.blitme()

	pygame.display.flip()

def update_bullets(bullets):  #更新子彈的位置,並刪除已消失的子彈
        bullets.update()
        for bullet in bullets.copy():
                if bullet.rect.bottom<=0:
                          bullets.remove(bullet)  
        

主程式如下:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygame

from setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from alien import Alien

def run_game():
    pygame.init()  #初始化,建立螢幕物件
    ai_settings=Setting()    #建立一個800*800的螢幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #對於這個視窗的命名為Alien Invasion

    ship=Ship(ai_settings,screen)   #建立飛船
    bullets=Group()
    alien=Alien(ai_settings,screen)  #建立外星人  

    while True:
        gf.check_events(ai_settings,screen,ship,bullets)
        ship.update()
        gf.update_bullets(bullets)
        gf.update_screen(ai_settings,screen,ship,alien,bullets)

run_game()

輸出如下:

2.建立一群外星人,首先我們要考慮當前的遊戲螢幕一行能容納多少外星人,所以確定水平距離和垂直距離。

修改功能模組:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等

import sys
import pygame
from bullet import Bullet
from alien import Alien

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:      #響應按空格鍵
                fire_bullet(ai_settings,screen,ship,bullets)

def fire_bullet(ai_settings,screen,ship,bullets):   #發射子彈
	if len(bullets)<ai_settings.bullets_allowed:    
		 new_bullet=Bullet(ai_settings,screen,ship)
		 bullets.add(new_bullet)

		
		
def check_keyup_events(event,ship):   #響應按鍵鬆開
	if event.key==pygame.K_RIGHT:
		ship.moving_right=False
	elif event.key==pygame.K_LEFT:
		ship.moving_left=False
	

def check_events(ai_settings,screen,ship,bullets):     #響應鍵盤和滑鼠事件
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit() 
		elif event.type==pygame.KEYDOWN:
			check_keydown_events(event,ai_settings,screen,ship,bullets)

		elif event.type==pygame.KEYUP:       #監測是否放開鍵盤
			check_keyup_events(event,ship)
         
def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新螢幕
	screen.fill(ai_settings.bg_color)
	for bullet in bullets.sprites():
		bullet.draw_bullet()
	ship.blitme()
	aliens.draw(screen)

	pygame.display.flip()

def update_bullets(bullets):  #更新子彈的位置,並刪除已消失的子彈
        bullets.update()
        for bullet in bullets.copy():
                if bullet.rect.bottom<=0:
                          bullets.remove(bullet)  

#建立外星人群
def creat_fleet(ai_settings,screen,aliens):
        alien=Alien(ai_settings,screen)    #建立一個外星人,計算一行可以容納多少
        alien_width=alien.rect.width
        available_space_x=ai_settings.screen_width-2*alien_width
        number_aliens_x=int(available_space_x/(2*alien_width)) 
        
        for alien_number in range(number_aliens_x):
            alien=Alien(ai_settings,screen)
            alien.x=alien_width+2*alien_width*alien_number
            alien.rect.x=alien.x
            aliens.add(alien)

對編組aliens呼叫draw(),pygame 自動繪製編組裡的每個元素;接著建立一個函式建立外星人群,首先要匯入Alien類,首先建立一個外星人,計算遊戲螢幕一行能放下多少個外星人,每個人外星人的間距為外星人的寬度,在從外星人的rect屬性中獲得外星人的寬度,值儲存於alien_width中,計算一行的可用空間:用螢幕的寬度減去左邊和右邊的間距,也就是兩個外星人的寬度。再接著計算一行可以放入多少個外星人。一個外星人的顯示是需要兩個外星人的寬度,所以公式為:可用空間除以外星人寬度的2倍。又因為外星人的個數必須要試整數,所以要取整。現在已經可以知道一行有多少外星人,所以開始建立,編寫一個迴圈,來建立外星人,設定x座標加入當前行,再新增到編組裡。

主程式:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygame

from setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from alien import Alien

def run_game():
    pygame.init()  #初始化,建立螢幕物件
    ai_settings=Setting()    #建立一個800*800的螢幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #對於這個視窗的命名為Alien Invasion

    ship=Ship(ai_settings,screen)   #建立飛船
    bullets=Group()
    aliens=Group()
    gf.creat_fleet(ai_settings,screen,aliens)

    while True:
        gf.check_events(ai_settings,screen,ship,bullets)
        ship.update()
        gf.update_bullets(bullets)
        gf.update_screen(ai_settings,screen,ship,aliens,bullets)

run_game()

輸出如下:

再次重構功能模組:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等

import sys
import pygame
from bullet import Bullet
from alien import Alien

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:      #響應按空格鍵
                fire_bullet(ai_settings,screen,ship,bullets)

def fire_bullet(ai_settings,screen,ship,bullets):   #發射子彈
         if len(bullets)<ai_settings.bullets_allowed:    
		 new_bullet=Bullet(ai_settings,screen,ship)
		 bullets.add(new_bullet)

		
		
def check_keyup_events(event,ship):   #響應按鍵鬆開
	if event.key==pygame.K_RIGHT:
		ship.moving_right=False
	elif event.key==pygame.K_LEFT:
		ship.moving_left=False
	

def check_events(ai_settings,screen,ship,bullets):     #響應鍵盤和滑鼠事件
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit() 
		elif event.type==pygame.KEYDOWN:
			check_keydown_events(event,ai_settings,screen,ship,bullets)

		elif event.type==pygame.KEYUP:       #監測是否放開鍵盤
			check_keyup_events(event,ship)
         
def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新螢幕
	screen.fill(ai_settings.bg_color)
	for bullet in bullets.sprites():
		bullet.draw_bullet()
	ship.blitme()
        aliens.draw(screen)

	pygame.display.flip()

def update_bullets(bullets):  #更新子彈的位置,並刪除已消失的子彈
        bullets.update()
        for bullet in bullets.copy():
                if bullet.rect.bottom<=0:
                          bullets.remove(bullet)  

  #建立外星人群
def get_number_aliens_x(ai_settings,alien_width):     #計算每行可以放入多少外星人
        available_space_x=ai_settings.screen_width-2*alien_width
        number_aliens_x=int(available_space_x/(2*alien_width))
        return number_aliens_x 

def creat_alien(ai_settings,screen,aliens,alien_number):
        alien=Alien(ai_settings,screen)    #建立一個外星人,放入當前行
        alien_width=alien.rect.width
        alien_x=alien_width+2*alien_width*alien_number
        alien.rect.x=alien.x
        aliens.add(alien)


def creat_fleet(ai_settings,screen,aliens):
        alien=Alien(ai_settings,screen)    #建立一個外星人,計算一行可以容納多少
        number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)

         #建立第一行外星人 
        for alien_number in range(number_aliens_x):
            creat_alien(ai_settings,screen,aliens,alien_number)

驗證過沒有問題:

3.新增行,上面的程式碼只是在第一行新增外星人,現在就要計算螢幕能裝多少行,用螢幕的垂直高度減取第一行的上邊距,外星人的高度和外星人之間的距離,以及飛船的高度:

修改功能模組:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等

import sys
import pygame
from bullet import Bullet
from alien import Alien

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:      #響應按空格鍵
                fire_bullet(ai_settings,screen,ship,bullets)

def fire_bullet(ai_settings,screen,ship,bullets):   #發射子彈
	if len(bullets)<ai_settings.bullets_allowed:    
		new_bullet=Bullet(ai_settings,screen,ship)
		bullets.add(new_bullet)

		
		
def check_keyup_events(event,ship):   #響應按鍵鬆開
	if event.key==pygame.K_RIGHT:
		ship.moving_right=False
	elif event.key==pygame.K_LEFT:
		ship.moving_left=False
	

def check_events(ai_settings,screen,ship,bullets):     #響應鍵盤和滑鼠事件
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit() 
		elif event.type==pygame.KEYDOWN:
			check_keydown_events(event,ai_settings,screen,ship,bullets)

		elif event.type==pygame.KEYUP:       #監測是否放開鍵盤
			check_keyup_events(event,ship)
         
def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新螢幕
	screen.fill(ai_settings.bg_color)
	for bullet in bullets.sprites():
		bullet.draw_bullet()
	ship.blitme()
	aliens.draw(screen)

	pygame.display.flip()

def update_bullets(bullets):  #更新子彈的位置,並刪除已消失的子彈
        bullets.update()
        for bullet in bullets.copy():
                if bullet.rect.bottom<=0:
                          bullets.remove(bullet)  

  #建立外星人群
def get_number_aliens_x(ai_settings,alien_width):     #計算每行可以放入多少外星人
        available_space_x=ai_settings.screen_width-2*alien_width
        number_aliens_x=int(available_space_x/(2*alien_width))
        return number_aliens_x 

def creat_alien(ai_settings,screen,aliens,alien_number,row_number):
        alien=Alien(ai_settings,screen)    #建立一個外星人,放入當前行
        alien_width=alien.rect.width
        alien.x=alien_width+2*alien_width*alien_number
        alien.rect.x=alien.x
        alien.rect.y=alien.rect.height+2*alien.rect.height*row_number
        aliens.add(alien)

#計算螢幕可以放入多少行
def get_number_rows(ai_settings,ship_height,alien_height):
        available_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)
        number_rows=int(available_space_y/(2*alien_height))
        return number_rows

def creat_fleet(ai_settings,screen,ship,aliens):
        alien=Alien(ai_settings,screen)    #建立一個外星人,計算一行可以容納多少
        number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
        number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)

        for row_number in range(number_rows):  
            for alien_number in range(number_aliens_x):
                creat_alien(ai_settings,screen,aliens,alien_number,row_number)

首先定義一個計算有多行的函式get_number_rows,再用兩個迴圈,一個外部迴圈建立行數,一個內部行數建立每行的外星人。

主程式如下:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygame

from setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group


def run_game():
    pygame.init()  #初始化,建立螢幕物件
    ai_settings=Setting()    #建立一個800*800的螢幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #對於這個視窗的命名為Alien Invasion

    ship=Ship(ai_settings,screen)   #建立飛船
    bullets=Group()
    aliens=Group()
    gf.creat_fleet(ai_settings,screen,ship,aliens)

    while True:
        gf.check_events(ai_settings,screen,ship,bullets)
        ship.update()
        gf.update_bullets(bullets)
        gf.update_screen(ai_settings,screen,ship,aliens,bullets)

run_game()


輸出如下:

4.讓外星人移動:讓外星人在螢幕上向右移動,撞到邊緣後下移一定的距離,再沿相反的方向移動。

首先實現向右移動,就像飛船裡的右移動一樣,在設定類裡新增外星人的速度:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#儲存外星人遊戲開發的設定
class Setting():
    def __init__(self):
        self.screen_width=800    #設定螢幕高度寬度,背景顏色
        self.screen_height=600
        self.bg_color=(230,230,230)
        self.ship_speed_factor=1   #設定飛船移動
        #子彈設定
        self.bullet_speed_factor=1
        self.bullet_width=3
        self.bullet_height=15
        self.bullet_color=(0,0,255)
        self.bullets_allowed=3
        #外星人的設定
        self.alien_speed_factor=1

在alien類修改:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#外星人類
import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
	def __init__(self,ai_settings,screen):
		super().__init__()
		self.ai_settings=ai_settings
		self.screen=screen

#載入圖片和獲取矩形
		self.image=pygame.image.load('images/alien.bmp')
		self.rect=self.image.get_rect()

#外星人初始位置在左上角附件,左邊距設為外星人的寬度,上邊距設為外星人的高度
		self.rect.x=self.rect.width
		self.rect.y=self.rect.height

#儲存外星人的位置
		self.x=float(self.rect.x)

	def blitme(self):
		self.screen.blit(self.image,self.rect)  
       
	def update(self):
		self.x+=self.ai_settings.alien_speed_factor   #向右移動
		self.rect.x=self.x

功能模組:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等

import sys
import pygame
from bullet import Bullet
from alien import Alien

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:      #響應按空格鍵
                fire_bullet(ai_settings,screen,ship,bullets)

def fire_bullet(ai_settings,screen,ship,bullets):   #發射子彈
	if len(bullets)<ai_settings.bullets_allowed:    
		new_bullet=Bullet(ai_settings,screen,ship)
		bullets.add(new_bullet)

		
		
def check_keyup_events(event,ship):   #響應按鍵鬆開
	if event.key==pygame.K_RIGHT:
		ship.moving_right=False
	elif event.key==pygame.K_LEFT:
		ship.moving_left=False
	

def check_events(ai_settings,screen,ship,bullets):     #響應鍵盤和滑鼠事件
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit() 
		elif event.type==pygame.KEYDOWN:
			check_keydown_events(event,ai_settings,screen,ship,bullets)

		elif event.type==pygame.KEYUP:       #監測是否放開鍵盤
			check_keyup_events(event,ship)
         
def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新螢幕
	screen.fill(ai_settings.bg_color)
	for bullet in bullets.sprites():
		bullet.draw_bullet()
	ship.blitme()
	aliens.draw(screen)

	pygame.display.flip()

def update_bullets(bullets):  #更新子彈的位置,並刪除已消失的子彈
        bullets.update()
        for bullet in bullets.copy():
                if bullet.rect.bottom<=0:
                          bullets.remove(bullet)  

  #建立外星人群
def get_number_aliens_x(ai_settings,alien_width):     #計算每行可以放入多少外星人
        available_space_x=ai_settings.screen_width-2*alien_width
        number_aliens_x=int(available_space_x/(2*alien_width))
        return number_aliens_x 

def creat_alien(ai_settings,screen,aliens,alien_number,row_number):
        alien=Alien(ai_settings,screen)    #建立一個外星人,放入當前行
        alien_width=alien.rect.width
        alien.x=alien_width+2*alien_width*alien_number
        alien.rect.x=alien.x
        alien.rect.y=alien.rect.height+2*alien.rect.height*row_number
        aliens.add(alien)

#計算螢幕可以放入多少行
def get_number_rows(ai_settings,ship_height,alien_height):
        available_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)
        number_rows=int(available_space_y/(2*alien_height))
        return number_rows

def creat_fleet(ai_settings,screen,ship,aliens):
        alien=Alien(ai_settings,screen)    #建立一個外星人,計算一行可以容納多少
        number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
        number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)

        for row_number in range(number_rows):  
            for alien_number in range(number_aliens_x):
                creat_alien(ai_settings,screen,aliens,alien_number,row_number)

#更新外星人的位置
def update_aliens(aliens):
	aliens.update()

主程式:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygame

from setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group


def run_game():
    pygame.init()  #初始化,建立螢幕物件
    ai_settings=Setting()    #建立一個800*800的螢幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #對於這個視窗的命名為Alien Invasion

    ship=Ship(ai_settings,screen)   #建立飛船
    bullets=Group()
    aliens=Group()
    gf.creat_fleet(ai_settings,screen,ship,aliens)

    while True:
        gf.check_events(ai_settings,screen,ship,bullets)
        ship.update()
        gf.update_bullets(bullets)
        gf.update_aliens(aliens)
        gf.update_screen(ai_settings,screen,ship,aliens,bullets)

run_game()


執行程式後,外星人向右移動,並逐漸消失在右邊邊緣:

接下來就是撞到右邊邊緣後下移再左移:

修改設定類:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#儲存外星人遊戲開發的設定
class Setting():
    def __init__(self):
        self.screen_width=800    #設定螢幕高度寬度,背景顏色
        self.screen_height=600
        self.bg_color=(230,230,230)
        self.ship_speed_factor=1   #設定飛船移動
        #子彈設定
        self.bullet_speed_factor=1
        self.bullet_width=3
        self.bullet_height=15
        self.bullet_color=(0,0,255)
        self.bullets_allowed=3
        #外星人的設定
        self.alien_speed_factor=1
        self.fleet_drop_speed=10
        self.fleet_direction=1     #fleet_direction為1表示右移。為-1左移
        

檢查外星人是否到了邊緣位置:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#外星人類
import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
	def __init__(self,ai_settings,screen):
		super().__init__()
		self.ai_settings=ai_settings
		self.screen=screen

#載入圖片和獲取矩形
		self.image=pygame.image.load('images/alien.bmp')
		self.rect=self.image.get_rect()

#外星人初始位置在左上角附件,左邊距設為外星人的寬度,上邊距設為外星人的高度
		self.rect.x=self.rect.width
		self.rect.y=self.rect.height

#儲存外星人的位置
		self.x=float(self.rect.x)

	def blitme(self):
		self.screen.blit(self.image,self.rect)  
       
	def update(self):
		self.x+=self.ai_settings.alien_speed_factor*self.ai_settings.fleet_direction   #向右移動
		self.rect.x=self.x

	def check_edges(self):
		screen_rect=self.screen.get_rect()
		if self.rect.right>=screen_rect.right:
			return True
		elif self.rect.left<=0:
			return True
	

 

修改功能模組:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
#遊戲的功能模組,包括響應鍵盤滑鼠事件,移動飛船等

import sys
import pygame
from bullet import Bullet
from alien import Alien

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:      #響應按空格鍵
                fire_bullet(ai_settings,screen,ship,bullets)

def fire_bullet(ai_settings,screen,ship,bullets):   #發射子彈
	if len(bullets)<ai_settings.bullets_allowed:    
		new_bullet=Bullet(ai_settings,screen,ship)
		bullets.add(new_bullet)

		
		
def check_keyup_events(event,ship):   #響應按鍵鬆開
	if event.key==pygame.K_RIGHT:
		ship.moving_right=False
	elif event.key==pygame.K_LEFT:
		ship.moving_left=False
	

def check_events(ai_settings,screen,ship,bullets):     #響應鍵盤和滑鼠事件
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
			sys.exit() 
		elif event.type==pygame.KEYDOWN:
			check_keydown_events(event,ai_settings,screen,ship,bullets)

		elif event.type==pygame.KEYUP:       #監測是否放開鍵盤
			check_keyup_events(event,ship)
         
def update_screen(ai_settings,screen,ship,aliens,bullets):   # 更新螢幕
	screen.fill(ai_settings.bg_color)
	for bullet in bullets.sprites():
		bullet.draw_bullet()
	ship.blitme()
	aliens.draw(screen)

	pygame.display.flip()

def update_bullets(bullets):  #更新子彈的位置,並刪除已消失的子彈
        bullets.update()
        for bullet in bullets.copy():
                if bullet.rect.bottom<=0:
                          bullets.remove(bullet)  

  #建立外星人群
def get_number_aliens_x(ai_settings,alien_width):     #計算每行可以放入多少外星人
        available_space_x=ai_settings.screen_width-2*alien_width
        number_aliens_x=int(available_space_x/(2*alien_width))
        return number_aliens_x 

def creat_alien(ai_settings,screen,aliens,alien_number,row_number):
        alien=Alien(ai_settings,screen)    #建立一個外星人,放入當前行
        alien_width=alien.rect.width
        alien.x=alien_width+2*alien_width*alien_number
        alien.rect.x=alien.x
        alien.rect.y=alien.rect.height+2*alien.rect.height*row_number
        aliens.add(alien)

#計算螢幕可以放入多少行
def get_number_rows(ai_settings,ship_height,alien_height):
        available_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)
        number_rows=int(available_space_y/(2*alien_height))
        return number_rows

def creat_fleet(ai_settings,screen,ship,aliens):
        alien=Alien(ai_settings,screen)    #建立一個外星人,計算一行可以容納多少
        number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
        number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)

        for row_number in range(number_rows):  
            for alien_number in range(number_aliens_x):
                creat_alien(ai_settings,screen,aliens,alien_number,row_number)

#更新外星人的位置
def update_aliens(ai_settings,aliens):
	check_fleet_edges(ai_settings,aliens)
	aliens.update()


#對於外星人到達邊緣採取的措施:
def check_fleet_edges(ai_settings,aliens):
	for alien in aliens.sprites():
		if alien.check_edges():
			change_fleet_direction(ai_settings,aliens)
			break
			
#下移外星人
def change_fleet_direction(ai_settings,aliens):
	for alien in aliens.sprites():
		alien.rect.y+=ai_settings.fleet_drop_speed
	ai_settings.fleet_direction*=-1
	

 

主程式:

#-*-coding:GBK-*-
#-*-coding:utf-8-*-
import pygame

from setting import Setting
from ship import Ship
import game_functions as gf
from pygame.sprite import Group


def run_game():
    pygame.init()  #初始化,建立螢幕物件
    ai_settings=Setting()    #建立一個800*800的螢幕
    screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))  
    pygame.display.set_caption("Alien Invasion")   #對於這個視窗的命名為Alien Invasion

    ship=Ship(ai_settings,screen)   #建立飛船
    bullets=Group()
    aliens=Group()
    gf.creat_fleet(ai_settings,screen,ship,aliens)

    while True:
        gf.check_events(ai_settings,screen,ship,bullets)
        ship.update()
        gf.update_bullets(bullets)
        gf.update_aliens(ai_settings,aliens)
        gf.update_screen(ai_settings,screen,ship,aliens,bullets)

run_game()


執行後,外星人將在螢幕來回移動,在邊緣後向下移動。