這里有九個.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