python編程:從入門到實踐--項目1-外星人入侵_學習筆記_源碼


這里有九個.py文件,在工作的間隙,和老板斗智斗勇,終於完成了,實現了游戲的功能,恰逢博客園開通,雖然是對着書上的代碼敲了一遍,但是對pygam這個庫的了解增加了一些,作為一個python初學者,也作為一個堂堂西電通信科班出來的人,竟然沒有用過python表示狗血,僅以此記錄我亡羊補牢,為時不晚的茫茫深飄路,如果我的代碼有幸被你搜到

你可以copy進你的編輯器,然后運行 

python.exe .\alien_invasion.py

 

 

隨后就會出現這個一個簡易版的飛船大戰游戲,缺點是本來應該是飛船和外星人,我找不到合適的圖,因為要bmp格式圖像,我現在還只是在網站上在線轉換。所以美工效果不行,諒解!

 

下面附上window目錄下文件

 

 

ship3.bmp是為了逗姑娘,把飛船設置成他的照片,哈哈哈。就這樣吧,歡迎大家和我進行討論,我希望通過這個博客園記錄一下,我的CT+IT之路。

 

 

 

alien_invasion.py

#coding=utf-8
import sys
import pygame
from setting import Settings
from ship import Ship
from pygame.sprite import Group
from game_stats import GameStats
from button import Button
from scoreboard import Scoreboard
#from alien import Alien
import game_functions as gf#名稱太長,想要給它取個別名,以后每次用到它的時候都用它的別名代替它

def run_game():
    #初始化pygame、設置和屏幕對象
    pygame.init()#初始化所有導入的 pygame 模塊#返回的一個pygame.Surface對象,而元組(1200,800)代表屏幕設置的長寬
    ai_settings=Settings()#調用類使用
    #這里的ai_注意這個寫法是上面被調用的
    screen=pygame.display.set_mode(#創建一個長寬的窗口
        (ai_settings.screen_width,ai_settings.screen_height))#pygame.display.set_mode(resolution=(0,0),flags=0,depth=0)
    pygame.display.set_caption("Alien Invasion")
    #創建一個用於存儲游戲統計信息的實例
    # 創建存儲游戲統計信息的實例,並創建記分牌
    stats=GameStats(ai_settings)
    sb=Scoreboard(ai_settings,screen,stats)
    #print stats
     # 創建一艘飛船
    ship=Ship(ai_settings,screen)
     # 創建Play按鈕 
    play_button = Button(ai_settings,screen,"Play")
   # print play_button
    #創建一個外星人
   # alien=Alien(ai_settings,screen)
    # bg_color=(230,230,100)#設置背景色
    #創建一個用於存儲子彈的編組
    bullets=Group()
    aliens=Group()#創建了一個空編組
    #創建外星人群
    gf.create_fleet(ai_settings,screen,ship,aliens)
    # 開始游戲主循環
    while True:
        gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets)#我們需要更新調用的check_events() 代碼,將ship 作為實參傳遞給它
        ship.update()
        #刪除已消失的子彈
        if stats.game_active:
            ship.update()
            gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)
            #print(len(bullets))
            gf.update_aliens(ai_settings,screen,stats,sb,ship,aliens,bullets)
        gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button)    
        # 每次循環時都重繪屏
        # 讓最近繪制的屏幕可見
run_game()

    

 

ship.py

#-*- coding=utf-8 -*-
#ship.py
import pygame
from pygame.sprite import Sprite
class Ship(Sprite):
    def __init__(self,ai_settings,screen):
        """初始化飛船並設置其初始位置"""
        super(Ship,self).__init__()
        self.screen=screen
        self.ai_setting=ai_settings
        self.image=pygame.image.load(r'images\ship2.bmp')
        self.rect=self.image.get_rect()#處理矩形(rect 對象)
        self.screen_rect=screen.get_rect()
        #將每艘飛船放在屏幕底部中央
        self.rect.centerx=self.screen_rect.centerx#要將游戲元素居中,可設置相應rect 對象的屬性center 、centerx 或centery 
        self.rect.bottom=self.screen_rect.bottom
        #在飛船的屬性center中存儲小數值
        self.center=float(self.rect.centerx)#因為centerx只能存儲整數
        #移動標志
        self.moving_right=False#為Ship類添加一個名為moving_right的屬性
        self.moving_left=False
    def update(self):           #和一個名為update的方法    
        """根據移動標志調整飛船的位置"""
        #更新飛船的center值,而不是rect    #self.rect.right返回飛船外接矩形的右邊緣的 x 坐標
        if self.moving_right and self.rect.right<self.screen_rect.right:    #為什么用兩個if是因為防止同時按住左鍵和右鍵
            self.center+=self.ai_setting.ship_speed_factor
        if self.moving_left and self.rect.left>0:#飛船將在觸及屏幕左邊緣或右邊緣后停止移動
            self.center-=self.ai_setting.ship_speed_factor
        self.rect.centerx=self.center
    def blitme(self):
        """在指定位置繪制飛船"""
        self.screen.blit(self.image,self.rect)
    def center_ship(self):
        """讓飛船在屏幕上居中"""
        self.center=self.screen_rect.centerx

setting.py

#coding=utf-8
class Settings():
    """存儲《外星人入侵》的所有設置的類"""
    def __init__(self):
        """初始化游戲的靜態設置"""
       #屏幕設置
        self.screen_width=1200
        self.screen_height=800
        self.bg_color=(230,180,230)
        #飛船的設置
        self.ship_limit=3
        self.bullet_width=3
        self.bullet_height=15
        self.bullet_color=60,60,60
        self.bullets_allowed=3     
        # 外星人設置
        self.fleet_drop_speed=50
        # 以什么樣的速度加快游戲節奏 ❶  
        self.speedup_scale = 1.1 
         # 外星人點數的提高速度 ❶     
        self.score_scale = 1.5 
        self.initialize_dynamic_settings()
    def initialize_dynamic_settings(self):     
        """初始化隨游戲進行而變化的設置"""     
        self.ship_speed_factor = 1.5     
        self.bullet_speed_factor = 3       
        self.alien_speed_factor = 1      
        # fleet_direction為1表示向右;為-1表示向左,游戲剛開始時,外星人總是向右移動   
        self.fleet_direction = 1
         # 記分       
        self.alien_points = 50

    def increase_speed(self):  
        """提高速度設置和外星人點數"""    
        self.ship_speed_factor *= self.speedup_scale     
        self.bullet_speed_factor *= self.speedup_scale     
        self.alien_speed_factor *= self.speedup_scale
        self.alien_points = int(self.alien_points * self.score_scale)
        #print self.alien_points


    

    

game_function.py

#-*-coding=utf-8-*-
#這個模塊中導入了事件檢查循環要使用的sys 和pygame 。
#當前,函數check_events() 不需要任何形參,其函數體復制了alien_invasion.py的事件循環。 
import sys
import pygame
from bullet import Bullet
from alien import Alien
from time import sleep
def check_keydown_events(event,ai_settings,screen,ship,bullets):
    """響應按鍵"""
    if event.key==pygame.K_RIGHT:
        ship.moving_right=True
        #print "K_RIGHT",pygame.K_RIGHT
       # print "RIGHTde ",event.key
    elif event.key==pygame.K_LEFT:
        ship.moving_left=True
       # print "LEFTde :",event.key
    elif event.key==pygame.K_SPACE:
     # 創建一顆子彈,並將其加入到編組bullets中
        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)#add() 方法用於給集合添加元素,如果添加的元素在集合中已存在,則不執行任何操作。
 #        print new_bullet
    elif event.key==pygame.K_q:#玩家按Q時結束游戲,設置成e也行鍵盤
        sys.exit()
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)
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,stats,sb,play_button,ship,aliens,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)
        elif event.type==pygame.MOUSEBUTTONDOWN:
            mouse_x,mouse_y=pygame.mouse.get_pos()
            check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y)
def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y):
    """在玩家單機play按鈕時開始新游戲"""
    button_cliked=play_button.rect.collidepoint(mouse_x,mouse_y)
    if button_cliked and not stats.game_active:#test if a point is inside a rectangle
        #重置游戲統計信息 #Returns true if the given point is inside the rectangle
        stats.reset_stats()
        stats.game_active=  True
        #重置記分牌圖像
        sb.prep_score()
        sb.prep_high_score()
        sb.prep_level()
        sb.prep_ships()
        #清空外星人列表和子彈列表
        # 重置游戲設置   
        ai_settings.initialize_dynamic_settings()
        pygame.mouse.set_visible(False)
        #隱藏光標
        stats.reset_stats()#單擊了Play按鈕且 且 游戲當前處於非活動狀態
        stats.game_active=True
    #清空外星人列表和子彈列表
        aliens.empty()
        bullets.empty()
    #創建一群新的外星人,並將飛船居中
    create_fleet(ai_settings,screen,ship,aliens)
    ship.center_ship()
        
#def check_events(ship): 
#    for event in pygame.event.get():#從隊列中獲取事件get events from the queue這是一個pygame的事件
#        if event.type ==pygame.QUIT:#,並將事件循環替換為對函數check_events() 調用
#            sys.exit()
#        elif event.type==pygame.KEYDOWN:#KEYDOWN是個事件
#            if event.key==pygame.K_RIGHT:
#                ship.moving_right=True
#            elif event.key==pygame.K_LEFT:
#                ship.moving_left=True
#        elif event.type==pygame.KEYUP:
#            if event.key==pygame.K_RIGHT:#如果因玩家按下K_LEFT 鍵而觸發了KEYDOWN 事件,我們就將moving_left 設置為True 
#                ship.moving_right=False
#            elif event.key==pygame.K_LEFT:#如果因玩家松開K_LEFT 而觸發了KEYUP 事件,我們就將moving_left 設置 為False 
#                ship.moving_left=False
#            #向右移動飛船
#                ship.rect.centerx+=1
#
#
def update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button):
    """更新屏幕上的圖像,並切換到新屏幕"""
    #每次循環時都重繪屏幕
    screen.fill(ai_settings.bg_color)#screen.fill() 用背景色填充屏
    #在飛船和外星人后面重繪所有子彈
    for bullet in bullets.sprites():
        bullet.draw_bullet()  
    ship.blitme()#填充背景后,我們調 用ship.blitme() 將飛船繪制到屏幕上,確保它出現在背景前面
    aliens.draw(screen)#在屏幕上繪制編組中的每個外星人
    #alien.blitme()
    # 顯示得分
    sb.show_score()
    # 如果游戲處於非活動狀態,就顯示Play按鈕
    if not stats.game_active:
        play_button.draw_button()
    #讓最近繪制的屏幕可見
    pygame.display.flip()
def update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):
    """更新子彈的位置,並刪已消失的子彈"""
    #更新子彈的位置
    bullets.update()
    #刪除已消失的子彈
    for bullet in bullets.copy():
        if bullet.rect.bottom<=0:
            bullets.remove(bullet)
        # 檢查是否有子彈擊中了外星人  
        # 如果是這樣,就刪除相應的子彈和外星  
    check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets)
   # collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)
    #if len(aliens)==0:
        #刪除現有的子彈並新建一群外星人
     #   bullets.empty()
     #   create_fleet(ai_settings,screen,ship,aliens)
def check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):
    """響應子彈和外星人的碰撞"""
    #刪除發生碰撞的子彈和外星人
    collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)#當為True的時候,會刪除組中所有沖突的精靈,False的時候不會刪除沖突的精靈
    if collisions: 
        for aliens in collisions.values():
            stats.score += ai_settings.alien_points*len(aliens)      
            sb.prep_score() 
        check_high_score(stats,sb)
    if len(aliens)==0:
        #刪除現有的子彈,並創建一個新的外星人群
        # 如果整群外星人都被消滅,就提高一個等級
        bullets.empty()
        ai_settings.increase_speed()
          # 提高等級 ❶  
        stats.level += 1 
        sb.prep_level()   
        create_fleet(ai_settings, screen, ship, aliens)
#def create_fleet(ai_settings, screen, aliens):     
#    """創建外星人群"""     
#    # 創建一個外星人,並計算一行可容納多少個外星人     
#    # 外星人間距為外星人寬度 ❶     
#    alien = Alien(ai_settings, screen)    
#    alien_width = alien.rect.width 
#    available_space_x = ai_settings.screen_width - alien_width 
#    number_aliens_x = int(available_space_x / (1.5* alien_width))   
#    # 創建第一行外星人 ❺     
#    for alien_number in range(number_aliens_x):     
#    # 創建一個外星人並將其加入當前行 ❻     
#        alien = Alien(ai_settings, screen)
#        alien.x = alien_width + 1.5* alien_width * alien_number     
#        alien.rect.x = alien.x       
#        aliens.add(alien)
#def create_fleet(ai_settings,screen,aliens):
#    """創建外星人群"""
#    #創建一個外星人,並計算一行可容納多少個外星人
#    #外星人間距為外星人寬度的1/2
#    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_sapce_x/(1.5*alien_width)
#    #創建第一行外星人
#    for alien_number in range(number_aliens_x):     
#   # 創建一個外星人並將其加入當前行 ❻     
#        alien = Alien(ai_settings, screen)
#        alien.x=alien_width+1.5*alien_width*alien_number
#        alien.rect.x=alien.x
#        aliens.add(alien)
def get_number_aliens_x(ai_settings,alien_width):
    """計算每行可容納多少個外星人"""
    available_sapce_x=ai_settings.screen_width-0.5*alien_width
    number_aliens_x=int(available_sapce_x/(1.5*alien_width))
    return number_aliens_x
def create_alien(ai_settings,screen,aliens,alien_number,row_number):
    """創建一個外星人並將其加入當前行"""
    alien=Alien(ai_settings,screen)
    alien_width=alien.rect.width
    alien.x=alien_width+1.5*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 create_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 alien_number in range(number_aliens_x):
  #      create_alien(ai_settings,screen,aliens,alien_number,row_number)
    #創建外星人群
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            create_alien(ai_settings,screen,aliens,alien_number,
            row_number)
def get_number_rows(ai_settings,ship_height,alien_height):
    """計算屏幕可容納多少行外星人"""
    available_space_y=(ai_settings.screen_height-(2*alien_height)-ship_height)
    number_rows=int(available_space_y/(3*alien_height))
    return number_rows
def ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets):
    """響應被外星人撞到的飛船"""
    #將ships_left減1
    if stats.ships_left>0:
        #將ships_left減1
        stats.ships_left-=1
         # 更新記分牌 ❺      
        sb.prep_ships()
    #清空外星人列表和子彈列表
        aliens.empty()
        bullets.empty()
     # 創建一群新的外星人,並將飛船放到屏幕底端中央
        create_fleet(ai_settings,screen,ship,aliens)
        ship.center_ship()
     #暫停
        sleep(1)
    else :
        stats.game_active=False
        pygame.mouse.set_visible(True)
    
def update_aliens(ai_settings,screen,stats,sb,ship,aliens,bullets):
    """檢查是否有外星人到達屏幕邊緣        
    然后更新所有外星人的位置
    檢查是否有外星人位於屏幕邊緣,並更新整群外星人的位置
    """
    check_fleet_edges(ai_settings,aliens)
    aliens.update()
    #檢測外星人和飛船之間的碰撞
    if pygame.sprite.spritecollideany(ship,aliens):
        ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets)
        print("Ship hit!!!")
    #方法spritecollideany() 接受兩個實參:一個精靈和一個編組。它檢查編組是否有成員與精靈發生了碰撞,
    #並在找到與精靈發生了碰撞的成員后就停止遍歷編組
    # 檢查是否有外星人到達屏幕底端 
    check_aliens_bottom(ai_settings,screen,stats,sb,ship,aliens,bullets)
    
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

def check_aliens_bottom(ai_settings,screen,stats,sb,ship,aliens,bullets):
    """檢查是否有外星人位於屏幕底端"""
    screen_rect=screen.get_rect()
    for alien in aliens.sprites():
        if alien.rect.bottom>=screen_rect.bottom:
        # 像飛船被撞到一樣進行處理
            ship_hit(ai_settings,stats,screen,ship,aliens,bullets)
            break
def check_high_score(stats, sb):      
    """檢查是否誕生了新的最高得分"""      
    if stats.score > stats.high_score:     
        stats.high_score = stats.score         
        sb.prep_high_score()
           
    

 bullet.py

#-*-coding=utf-8-*-
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
    """一個對飛船發射的子彈進行管理的類"""
    def __init__(self,ai_settings,screen,ship):
        """在飛船所處的位置創建一個子彈對象"""
        super(Bullet,self).__init__()#super() 函數是用於調用父類(超類)的一個方法。
        self.screen=screen#python中的super( test, self).__init__()
        #首先找到test的父類(比如是類A),然后把類test的對象self轉換為類A的對象,然后“被轉換”的類A對象調用自己的__init__函數
        #在(0,0)處創建一個表示子彈的矩形,再設置正確的位置
        self.rect=pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
        self.rect.centerx=ship.rect.centerx
        self.rect.top=ship.rect.top
        #存儲用小數表示的子彈位置
        self.y=float(self.rect.y)
        self.color=ai_settings.bullet_color
        self.speed_factor=ai_settings.bullet_speed_factor
    def update(self):
        """向上移動子彈"""
        #更新表示子彈位置的小數值
        self.y-=self.speed_factor
        #更新表示子彈的rect的位置
        self.rect.y=self.y
    def draw_bullet(self):
        """在屏幕上繪制子彈"""
        pygame.draw.rect(self.screen,self.color,self.rect)

 

scoreboard.py

#-*-coding=utf-8-*-
import pygame.font#在屏幕上顯示文本,因此我們首先導入模塊pygame.font 
from pygame.sprite import Group
from ship import Ship
class Scoreboard():
    """顯示得分信息的類"""
    def __init__(self,ai_settings,screen,stats):
        """初始化顯示得分涉及的屬性"""
        self.screen=screen
        self.screen_rect=screen.get_rect()
        self.ai_settings = ai_settings    
        self.stats = stats       
        # 顯示得分信息時使用的字體設置      
        self.text_color = (30, 30, 30) 
        self.font = pygame.font.SysFont(None, 48)      
        # 准備初始得分圖像       
        # 准備包含最高得分和當前得分的圖像 
        self.prep_score()     
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()
        
        
        
    def prep_score(self):        
        """將得分轉換為一幅渲染的圖像"""  
        rounded_score = int(round(self.stats.score, -1)) 
        score_str = "{:,}".format(rounded_score)        
        self.score_image = self.font.render(score_str, True, self.text_color,       
        self.ai_settings.bg_color)        
        # 將得分放在屏幕右上角      
        self.score_rect = self.score_image.get_rect()     
        self.score_rect.right = self.screen_rect.right - 20     
        self.score_rect.top = 20
    def show_score(self):      
        """在屏幕上顯示得分"""      
        self.screen.blit(self.score_image, self.score_rect)
        self.screen.blit(self.high_score_image, self.high_score_rect)
        self.screen.blit(self.level_image,self.level_rect)
         # 繪制飛船  
        self.ships.draw(self.screen)

    def prep_high_score(self):      
        """將最高得分轉換為渲染的圖像"""   
        high_score = int(round(self.stats.high_score, -1))    
        high_score_str = "{:,}".format(high_score)    
        self.high_score_image = self.font.render(high_score_str, True,    
        self.text_color, self.ai_settings.bg_color)        
        #將最高得分放在屏幕頂部中央        
        self.high_score_rect = self.high_score_image.get_rect()    
        self.high_score_rect.centerx = self.screen_rect.centerx 
        self.high_score_rect.top = self.score_rect.top
    def prep_level(self):
        """將登記轉換為渲染的圖像"""
        self.level_image=self.font.render(str(self.stats.level),True,
            self.text_color,self.ai_settings.bg_color)
        #將登記放在得分的下方
        self.level_rect=self.level_image.get_rect()
        self.level_rect.right=self.score_rect.right
        self.level_rect.top=self.score_rect.bottom+10
    def prep_ships(self):   
        """顯示還余下多少艘飛船""" 
        self.ships = Group()         
        for ship_number in range(self.stats.ships_left):   
            ship = Ship(self.ai_settings, self.screen)       
            ship.rect.x = 10 + ship_number * ship.rect.width  
            ship.rect.y = 10             
            self.ships.add(ship)

 

button.py

#-*-coding=utf-8-*-
import pygame.font#Pygame能夠將文本渲染到屏幕
class Button():
    def __init__(self,ai_settings,screen,msg):   #,其中msg 是 要在按鈕中顯示的文本
        """初始化按鈕的屬性"""       
        self.screen = screen        
        self.screen_rect = screen.get_rect() 
        # 設置按鈕的尺寸和其他屬性
        self.width,self.height=200,50
        self.button_color=(0,255,0)#設置button_color 讓按鈕的rect 對象為亮綠色
        self.text_color=(255,255,255)#置text_color 讓文本為白色
        self.font=pygame.font.SysFont(None,48)#實參None 讓Pygame 使用默認字體,而48 指定了文本的字號
        #創建按鈕的rect對象,並使其居中#為讓按鈕在屏幕上居中,我們創建一個表示按鈕的rect 
        self.rect=pygame.Rect(0,0,self.width,self.height)
        self.rect.center=self.screen_rect.center#,並將其center 屬性設置為屏幕的center 屬性
        #按鈕的標簽只需創建一次
        self.prep_msg(msg)
    def prep_msg(self,msg):#方法prep_msg() 接受實參self 以及要渲染為圖像的文本(msg )。
        """將msg渲染為圖像,並使其在按鈕上居中"""
        self.msg_image=self.font.render(msg,True,self.text_color,
        self.button_color)#方法font.render() 還接受一個布爾實參,該實參指定開啟還是關閉反鋸齒功能(反鋸齒讓文本的邊緣更平滑
        self.msg_image_rect=self.msg_image.get_rect()
        self.msg_image_rect.center=self.rect.center
    def draw_button(self):
    # 繪制一個用顏色填充的按鈕,再繪制文本
        self.screen.fill(self.button_color,self.rect)#調用screen.fill() 來繪制表示按鈕的矩形
        self.screen.blit(self.msg_image,self.msg_image_rect)#再調用screen.blit() ,並向它傳遞一幅圖像以及與該圖像相關聯的rect 對象

 

game_stats.py

#-*-coding=utf-8-*-
class GameStats():
    """跟蹤游戲的統計信息"""
    def __init__(self,ai_settings):
        """初始化統計信息"""
        self.ai_settings=ai_settings
        self.reset_stats()
        # 游戲剛啟動時處於活動狀態       
        self.game_active = False
                # 在任何情況下都不應重置最高得分       
        self.high_score = 0
    def reset_stats(self):
        """初始化在游戲運行期間可能變化的統計信息"""
        self.ships_left=self.ai_settings.ship_limit
        self.score=0
        self.level=1

 

alien.py

#-*-coding=utf-8-*-
import sys
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
    """表示單個外星人的類"""
    def __init__(self,ai_settings,screen):
        """初始化外星人並設置其起始位置"""
        super(Alien,self).__init__()
        self.screen=screen
        self.ai_settings=ai_settings
        #加載外星人圖像,並設置其rect屬性
        self.image=pygame.image.load('images/ship2.bmp')
        self.rect=self.image.get_rect()
        #每個外星人最初都在屏幕左上角附近
        self.rect.x=self.rect.width*1/2
        self.rect.y=self.rect.height*1/2#獲得圖像的寬度
        #存儲外星人的准確位置
        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):
        """如果外星人位於屏幕邊緣,就返回True"""
        screen_rect=self.screen.get_rect()
#如果外星人的rect 的right 屬性大於或等於屏幕的rect 的right 屬性,就說明外星人位於屏幕右邊緣
        if self.rect.right>=screen_rect.right:
#外星人的rect 的left 屬性小於或等於0,就說明外星人位於屏幕左邊
            return True
        elif self.rect.left<=0:
            return True



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM