当前位置: 首页>Python>正文

python 外星人入侵游戲 學習總結 以及完整代碼

python 外星人入侵游戲 學習總結 以及完整代碼

  • 從三月開始看《python:從入門到實踐》自學python,踏入編程的世界,已經過去兩個多月了,學完基礎知識之后開始學習游戲項目《外星人入侵》。
    外星人入侵:在游戲《外星人入侵》中,玩家控制著一艘最初出現在屏幕底部中央的飛船。玩家可以使用箭頭鍵左右移動飛船,還可使用空格鍵進行射擊。游戲開始時,一群外星
    人出現在天空中,他們在屏幕中向下移動。玩家的任務是射殺這些外星人。玩家將所有外星人都消滅干凈后,將出現一群新的外星人,他們移動的速度更快。只要有
    外星人撞到了玩家的飛船或到達了屏幕底部,玩家就損失一艘飛船。玩家損失三艘飛船后,游戲結束。
    通過學習這樣一個項目,我學到了pygame的運用,對之前學的類、函數、方法有了更深的認識,開始思考項目背后運行的原理。
    項目分為10個文件,9個py文件和1個json文件。
    py文件分別儲存了游戲的各個要素,具體作用我會在代碼的注釋中詳述。json文件會被 scorebroad.py 中的代碼自動創建,用于儲存游戲中出現的最高分。
    作為新手,免不了要出錯,在寫這個項目的過程我也遇到了不少問題,也向很多大神求助過,在這里感謝幫助過我的前輩。我把幾個遇到的問題都寫在了之前在出錯的地方。
    總結一下教訓:
    1.寫代碼的時候一定要專注,不然很多時候怎么出錯都不知道。
    2.調用方法函數的時候記得加上括號,不然會報錯,這是個細節問題。
    3.一定要注意縮進問題,有時候不應該的縮進會導致一些莫名其妙的問題,找代碼出錯的時候記得看一看縮進是否正確。
    游戲界面如圖:
    在這里插入圖片描述

在這里插入圖片描述

項目代碼如下:

settings.py

#創建一個游戲設置的類
class Settings:def __init__(self):#儲存游戲初始化數據#初始化游戲的靜態設置self.screen_width = 1400self.screen_height = 750self.bg_color = (200,200,200)#設置飛船數量self.ship_limit = 3#創建關于子彈的屬性self.bullet_width = 15self.bullet_height = 30self.bullet_bg_color = (60,0,0)#設置限制子彈數量self.bullets_allowed = 3#設置外星人下降值self.alien_drop_factor = 2#設置速度提升倍數self.speedup_scale = 1.1#設置外星人點數的提高速度self.score_scale = 1.5#初始化速度值self.initialize_dynamic_settings()def initialize_dynamic_settings(self):#初始化動態設置# 設置外星人移動速度self.alien_speed_factor = 0.5# 設置外星人群移動值,向右為1,向左為-1self.fleet_direction = 1#設置外星人分數self.alien_points = 50#設置子彈移動速度self.bullet_speed_factor = 5# 設置飛船移動速度self.ship_speed_factor = 3def increase_speed(self):#提升速度值self.ship_speed_factor *= self.speedup_scaleself.bullet_speed_factor *= self.speedup_scaleself.alien_speed_factor*= self.speedup_scale#提升分數self.alien_points = int(self.alien_points * self.score_scale)

alien.py

#創建一個關于外星人的模塊
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):'''表示單個外星人的類'''def __init__(self,ai_settings,screen):#繼承精靈類super().__init__()self.ai_settings = ai_settingsself.screen = screen#返回外星人圖像并矩形化self.image = pygame.image.load('image/humor.png')self.rect = self.image.get_rect()#每個外星人最初都在屏幕左上角附近self.rect.x = self.rect.widthself.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'''當方向值為1時,x 坐標增加,向右移動。方向值為-1時,x 坐標減少,向左移動'''def check_edges(self):#檢查外星人是否碰到了邊緣#矩形化屏幕screen_rect = self.screen.get_rect()#當外星人貼圖右邊緣大于或等于屏幕矩形右邊緣,返回正確if self.rect.right >= screen_rect.right:return True#當外星人貼圖左邊緣小于或等于屏幕矩形左邊緣(小于等于0),返回正確elif self.rect.left <= screen_rect.left:return True

bullet.py

#創建子彈類
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):'''一個對飛船發射的子彈進行管理的類'''def __init__(self,ai_settings,screen,ship):#通過函數super()來繼承spritesuper().__init__()self.screen = screen#在(0,0)處創建一個代表子彈的矩形,再設置正確的位置,參數為初識坐標,子彈的寬和高self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)#根據飛船位置來確定子彈位置self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top#儲存用小數表示的子彈位置'''由于子彈是直線向下移動,所以我們只考慮在y軸上坐標的變化,而x軸的坐標是固定的,這由發射子彈時飛船的x軸坐標決定,因為我們在前面定義了self.rect.centerx = ship.rect.centerx'''self.y = float(self.rect.y)#儲存子彈顏色self.color = ai_settings.bullet_bg_color#儲存速度self.speed_factor = ai_settings.bullet_speed_factordef update(self):#讓子彈向上移動self.y -= self.speed_factor#更新子彈rect的位置self.rect.y = self.ydef draw_bullet(self):#在屏幕上繪制子彈pygame.draw.rect(self.screen,self.color,self.rect)

ship.py

import pygame
from pygame.sprite import Sprite
class Ship(Sprite):def __init__(self,ai_settings,screen):'''初始化飛船并設置其初始位置'''#繼承精靈super().__init__()self.screen = screenself.ai_settings = ai_settings#加載飛船圖像,并獲取其外接矩形#load返回貼圖所在文件self.image = pygame.image.load('image/shot.PNG')#矩形屬性rect為貼圖的矩形對象#get_rect()是一個處理矩形圖像的方法,返回值包含矩形的居中屬性( center centerx centery )#get_rect須加上(),否則后續程序在運行時會出現無法引用centerx和bottom的錯誤self.rect = self.image.get_rect()#先將表示屏幕的矩形儲存在屬性screen—rect中self.screen_rect = screen.get_rect()'''將每艘新飛船放在屏幕底部中央'''#再將self.rect.centerx設置為表示屏幕的矩形屬性centerx#再將self.rect.bottom設置為表示屏幕的矩形屬性bottom#后面使用這個rect屬性來放置飛船在屏幕底部中間self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom#在飛船屬性center中儲存小數點self.center = float(self.rect.centerx)#添加屬性,設置一個飛船向右移動的標志self.moving_right = False#添加一個飛船向左移動的標志self.moving_left = Falsedef blitme(self):#方法blit 位塊傳輸 將指定的像素內容傳輸到指定位置self.screen.blit(self.image,self.rect)def update(self):#根據標志來向右移動飛船#更新飛船的center值而不是rect(rect已被浮點化儲存到center中)'''添加條件,防止飛船移動到屏幕外'''#以屏幕矩形的右邊界為界,當按鍵事件(標志正確)以及飛船外接矩形坐標小于右邊界時可向右移動if self.moving_right and self.rect.right < self.screen_rect.right:self.center += self.ai_settings.ship_speed_factor#根據標志向左移動飛船#以屏幕矩形的左邊界為準,即x軸坐標的0,當按鍵事件(標志正確)以及飛船外接矩形坐標大于0時可向左移動if self.moving_left and self.rect.left > 0:self.center -= self.ai_settings.ship_speed_factor'''此處使用兩個if來應對左右方向按鍵,兩個條件同時檢測,當同時按下左右鍵時,飛船紋絲不動,這有利于精準控制,如使用if—elif格式的話,if優先,故右鍵優先,同時按兩個鍵時無法同時抵消,則向右移動'''#根據center來更新rectself.rect.centerx = self.centerdef center_ship(self):#讓飛船底部居中self.center = self.screen_rect.centerx

game_stats.py

#創建游戲統計類
class GameStats():#跟蹤游戲的統計信息def __init__(self,ai_settings):#初始化統計信息self.ai_setting = ai_settings#設置結束游戲的標志#修改標志,讓游戲一開始處于非活動狀態self.game_active = False#設置最高分,最高分不會被重置,所以在init初始化self.high_score = 0#在初始化init中調用方法reset_stats#在創建實例時能妥善地設置統計信息#在后續也可以調用self.reset_stats()def reset_stats(self):#重置統計#初始化游戲運行期間可能變化的統計信息#儲存飛船數量self.ships_left = self.ai_setting.ship_limit#初始化得分self.score = 0#初始化等級self.level = 1

button.py

#創建按鈕類
#導入模塊ftfont(font),它能將文本渲染到屏幕上
import pygame.ftfont
class Button():def __init__(self,ai_settings,screen,msg):#初始化self.screen = screenself.screen_rect = screen.get_rect()#設置按鈕尺寸和顏色self.wdith,self.height = 200,50self.button_color = (0,50,0)#指定文本顏色self.text_color = (255,255,255)#None 指定了使用默認字體渲染文本,48為字號self.ftfont = pygame.ftfont.SysFont(None,48)#創建一個rect對象self.rect = pygame.Rect(0,0,self.wdith,self.height)#rect對象位置居中self.rect.center = self.screen_rect.center#調用按鈕標簽(只需創建一次)self.prep_msg(msg)def prep_msg(self,msg):#創建渲染文本方法'''將msg渲染為圖像,并使其在按鈕上居中'''#將文本渲染為圖像,第一個實參為文本,第二個實參為布爾值(用于指定圖像邊緣是否開啟反鋸齒功能,此處的Ture為開啟)#第三個實參為文本顏色,第四個實參為按鈕顏色(即圖像的背景色,當沒有指定時為透明)self.msg_image = self.ftfont.render(msg,True,self.text_color,self.button_color)#矩形化文本圖像self.msg_image_rect = self.msg_image.get_rect()#文本圖像位置居中,即在按鈕中居中(按鈕矩形的中央位置)self.msg_image_rect.center = self.rect.centerdef draw_button(self):#繪制一個用顏色填充的按鈕,再繪制文本self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)

scorebroad.py

import pygame.ftfont
from pygame.sprite import Group
from ship import Ship
#導入json用于寫入最高分
import json
#創建計分板類
class Scoreboard():def __init__(self,screen,ai_settings,stats):#初始化得分涉及的屬性self.screen = screenself.screen_rect = self.screen.get_rect()self.ai_settings = ai_settingsself.stats = stats#設置計分板的字體self.text_color = (30,30,30)#默認字體,48字號self.ftfont = pygame.ftfont.SysFont(None,48)#準備初始得分圖像和最高分圖像、等級、飛船剩余圖像self.prep_images()def prep_images(self):# 整合初始化圖像內容self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):'''將得分轉換為渲染的圖像'''#  得分為得分為10的整數倍,并將逗號用作千分位分隔符rounded_score = int(round(self.stats.score, -1))score_str = "{:,}".format(rounded_score)self.image = self.ftfont.render(score_str,True,self.text_color,self.ai_settings.bg_color)#將得分放在屏幕右上角#將文字渲染成的圖像矩形化,指定位置self.score_rect = self.image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def prep_high_score(self):'''將最高得分渲染為圖像'''#打開json文件讀取最高分來圓整規范以及渲染為圖像,當出現 FileNotFoundError 異常時創建json文件,并寫入初始化最高分# (這一步僅需執行一次,也可應對文件丟失情況)try:with open('high_score.json') as f_obj:high_score_json = json.load(f_obj)except FileNotFoundError:with open('high_score.json','w') as f_obj:json.dump(self.stats.high_score,f_obj)# 最高得分為10的整數倍,并將逗號用作千位分隔符high_score = int(round(high_score_json,-1))high_score_str = "{:,}".format(high_score)self.high_score_image = self.ftfont.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.centerxself.high_score_rect.top = self.score_rect.topdef prep_level(self):'''將等級轉化為渲染的圖像'''self.level_image = self.ftfont.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.rightself.level_rect.top = self.score_rect.bottom + 10def prep_ships(self):'''顯示還剩余多少飛船'''self.ships = Group()#循環剩下的飛船數,并根據數量生成位置for ship_numbers in range(self.stats.ships_left):ship = Ship(self.ai_settings,self.screen)ship.rect.x = 10 + ship_numbers * (2 * ship.rect.width)ship.rect.y = -30self.ships.add(ship)def show_score(self):#在屏幕上顯示得分和最高分self.screen.blit(self.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)

game_functions.py

#將管理事件的代碼部分轉移到此模塊中,以簡化主程序邏輯
import sys
import pygame
#導入子彈類
from bullet import Bullet
from alien import Alien
#導入json用于記錄最高分
import json
#導入sleep來實現游戲暫停
from time import sleepdef 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_keydown_events(event,ai_settings,screen,ship,bullets,stats,aliens,sb):#響應按鍵if event.key == pygame.K_RIGHT:# 當按鍵事件為按下右箭頭時,向右移動標志為正確ship.moving_right = Trueelif event.key == pygame.K_LEFT:# 當按鍵事件為按下左箭頭時,向左移動標志為正確ship.moving_left = True#當按下的鍵為z時elif event.key == pygame.K_z:#簡化keydown,當按下空格時調用函數fire_bullets檢查條件發射子彈fire_bullet(ai_settings,screen,ship,bullets)#設置快捷鍵q用于退出游戲elif event.key == pygame.K_q:sys.exit()#設置快捷鍵p用于重置游戲elif event.key == pygame.K_p:start_game(stats,aliens,bullets,ai_settings,screen,ship,sb)def check_keyup_events(event,ship):#響應松開if event.key == pygame.K_RIGHT:# 當按鍵事件為松開按右箭頭時,向右移動標志為錯誤ship.moving_right = Falseelif event.key == pygame.K_LEFT:# 當按鍵事件為松開按左箭頭時,向左移動標志為錯誤ship.moving_left = Falsedef check_events(ai_settinngs,ship,screen,bullets,stats,play_button,aliens,sb):'''響應按鍵和鼠標事件'''for event in pygame.event.get():'''當事件類型為QUIT時,退出游戲'''if event.type == pygame.QUIT:sys.exit()#檢測鼠標事件elif event.type == pygame.MOUSEBUTTONDOWN:#將鼠標點擊區域坐標儲存到變量中mouse_x,mouse_y = pygame.mouse.get_pos()check_play_button(stats,play_button,mouse_x,mouse_y,aliens,bullets,ai_settinngs,screen,ship,sb)#更新后的check_event直接使用前面定義的函數elif event.type == pygame.KEYDOWN:#調用時增加形參check_keydown_events(event,ai_settinngs,screen,ship,bullets,stats,aliens,sb)elif event.type == pygame.KEYUP:check_keyup_events(event,ship)'''在 KEYDOWN 和 KEYUP 中使用 if-elif 結構處理兩種按鍵標志,因為每個事件只與一個鍵關聯,當同時按下左右兩鍵時,即視為兩個事件來處理'''def check_play_button(stats,play_button,mouse_x,mouse_y,aliens,bullets,ai_settings,screen,ship,sb):'''在玩家單擊play按鈕時開始新游戲'''#將按鈕點擊檢測儲存到變量中button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)#當按鈕被點擊且游戲非運行狀態時,按鈕點擊生效if button_clicked:#調用重置游戲方法start_game(stats,aliens,bullets,ai_settings,screen,ship,sb)def start_game(stats,aliens,bullets,ai_settings,screen,ship,sb):'''創建重置游戲的方法'''if not stats.game_active :# 隱藏光標# 向set_visible()傳遞參數False來隱藏光標pygame.mouse.set_visible(False)#重置速度ai_settings.initialize_dynamic_settings()# 重置統計信息stats.reset_stats()# 游戲運行標志正確stats.game_active = True#重置記分牌中的圖像sb.prep_images()# 清空子彈和外星人aliens.empty()bullets.empty()# 創建新外星人群create_fleet(ai_settings, screen, ship, aliens)# 飛船居中ship.center_ship()def update_bullets(bullets,aliens,ai_settings,screen,ship,stats,sb):# 對編組中的每一個子彈調用update#更新子彈位置bullets.update()# 刪除已消失的子彈# 在for循環中不應從列表或編組刪除條目,所以使用方法copy()遍歷編組的副本,然后修改編組# 遍歷副本的原因:由于編組內的子彈是動態變化的,遍歷副本后根據副本元素來刪除編組中對應的元素,做到精準刪除# 注意:這里刪除的是原編組里的子彈!for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)#調用檢測外星人子彈碰撞函數check_bullet_alien_collisions(bullets,aliens,ai_settings,screen,ship,stats,sb)def check_bullet_alien_collisions(bullets,aliens,ai_settings,screen,ship,stats,sb):#檢查是否有子彈擊中了外星人#如果子彈擊中外星人,則刪除該子彈和外星人collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)#當發生碰撞時加分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:start_new_level(bullets,ai_settings,stats,sb,screen,ship,aliens)def start_new_level(bullets,ai_settings,stats,sb,screen,ship,aliens):# 清空子彈bullets.empty()# 提升外星人群速度ai_settings.increase_speed()# 提升等級stats.level += 1sb.prep_level()# 創建外星人create_fleet(ai_settings, screen, ship, aliens)def check_high_score(stats,sb):'''檢測是否誕生了新的最高分'''#讀取json中的最高分,將最高分儲存在變量,將當前分數與最高分比較#當當前分數高于最高分時,將當前最高分儲存到新變量,并將新變量寫入json文件#調用更新最高分函數,顯示新的最高分with open('high_score.json') as f_obj:high_score = json.load(f_obj)if stats.score > high_score :new_high_score = stats.scorewith open('high_score.json','w') as f_obj :json.dump(new_high_score,f_obj)sb.prep_high_score()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))  # 行容納外星人數量'''這里使用了int來求得整數數量的外星人,舍棄了小部分,防止出現不完整外星人,同時也出于生成的目的,函數range()需要一個整數值'''return number_aliens_xdef 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_rowsdef create_alien(ai_settings, screen, aliens, alien_number, row_number):'''創建單個外星人并將其放在行中'''# 先創建單個外星人# 外星人間距為外星人寬度alien = Alien(ai_settings, screen)alien_width = alien.rect.width# 外星人位置從左算起,空掉一個外星人矩形作為間隔,每個外星人占據兩個外星人矩形大小,# x 軸排布位置由for循環的外星人次序決定,故 * number_aliens_xalien.x = alien_width + 2 * alien_width * alien_number# 儲存外星人坐標alien.rect.x = alien.x# 外星人行的位置需空出一行作為與頂的邊界,同時行與行之間空出一個外星人高度作為間距# y 軸排布位置由for循環的行數次序決定,故 * row_numberalien.rect.y = 30 + 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 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 update_screen(ai_settings,ship,screen,aliens,bullets,stats,play_button,sb):'''設置、飛船、屏幕為三個實參,在方法中使用'''#屏幕顏色填充為設置中設置的顏色screen.fill(ai_settings.bg_color)#在飛船和外星人后面重繪所有子彈#在背景設置完畢后將飛船繪制到指定位置ship.blitme()#繪制外星人編組中的每一個aliens.draw(screen)'''遍歷編組中的每一個精靈(子彈),并對每一個精靈(子彈)調用draw_bullte'''# 這里使用了方法bullets.sprites  它返回子彈編組  注意sprites是復數for bullet in bullets.sprites():bullet.draw_bullet()#顯示得分sb.show_score()#讓最近繪制的屏幕可見#當游戲處于非活動狀態,繪制按鈕if not stats.game_active :play_button.draw_button()#讓最近繪制的屏幕可見pygame.display.flip()def check_fleet_edges(ai_settings,aliens):#遍歷每一個外星人,當觸碰邊緣時調用改變方向函數for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings,aliens)'''由于之前這里忘記break退出循環,外星人群有時會直接下落導致游戲結束'''breakdef change_fleet_direction(ai_settings,aliens):#遍歷每一個外星人,調整每一個外星人的 y 坐標,即下降for alien in aliens.sprites():alien.rect.y += ai_settings.alien_drop_factor#改變方向值ai_settings.fleet_direction *= -1def check_alien_bottom(ai_settings,ship,aliens,stats,bullets,screen,sb):#檢查外星人是否觸底#注意!!!#get_rect()要記得加上括號,不然會出現如下錯誤:# AttributeError: 'builtin_function_or_method' object has no attribute 'bottom'screen_rect = screen.get_rect()#遍歷外星人編組for alien in aliens.sprites():#當有外星人觸底時,調用ship_hit函數更新外星人和飛船if alien.rect.bottom >= screen_rect.bottom:ship_hit(stats,aliens,bullets,ai_settings,screen,ship,sb)breakdef update_aliens(ai_settings,ship,aliens,stats,bullets,screen,sb):'''檢查外星人是否觸碰邊緣,做出調整'''check_fleet_edges(ai_settings,aliens)# 對每個外星人的位置更新aliens.update()#檢查外星人與飛船的碰撞,當碰撞時發出信號(已刪去)#在碰撞時調用ship_hit,做出相應變化if pygame.sprite.spritecollideany(ship,aliens):ship_hit(stats,aliens,bullets,ai_settings,screen,ship,sb)#調用函數檢查是否有外星人觸底check_alien_bottom(ai_settings,ship,aliens,stats,bullets,screen,sb)def ship_hit(stats,aliens,bullets,ai_settings,screen,ship,sb):#檢查飛船數量是否用完,若未用完,暫停后更新飛船和外星人;若用完,標志False,沒有更新,游戲結束if stats.ships_left > 0 :#響應被外星人撞到的飛船#飛船數量相應減一stats.ships_left -= 1#更新飛船剩余sb.prep_ships()#清空外星人和子彈列表aliens.empty()bullets.empty()#創建一群新的外星人create_fleet(ai_settings,screen,ship,aliens)#讓飛船底部居中ship.center_ship#暫停0.5秒sleep(0.5)elif stats.ships_left == 0:#當飛船數量用完,標志錯誤,不執行更新stats.game_active = False#在游戲處于非運行狀態時,光標出現,可以點擊按鈕繼續游戲pygame.mouse.set_visible(True)

alien_invasion.py

#游戲主程序
#模塊sys可用于退出游戲,因為模塊game_functions中已經導入sys,主程序中不需要再導入
import pygame
from settings import Settings
from ship import Ship
#導入信息統計類
from game_stats import GameStats
from scoreboard import Scoreboard
#導入編組
from pygame.sprite import Group
#由于不在主程序創建外星人實例,此處不必導入
#導入game_functions,后面的事件管理部分從模塊導入
import game_functions as gf
#導入按鈕類
from button import Button
def run_game():#初始化游戲并創建一個屏幕pygame.init()ai_settings = Settings()screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))#設置屏幕對象pygame.display.set_caption("alien_invision")#創建按鈕類 形參msg對應的實參為“play”play_button = Button(ai_settings,screen,"Play")#創建一個用于儲存游戲信息統計的實例stats = GameStats(ai_settings)#創建記分牌實例sb = Scoreboard(screen,ai_settings,stats)#創建一艘飛船ship = Ship(ai_settings,screen)#創建一個子彈編組bullets = Group()#創建一個外星人編組aliens = Group()# 使用gf模塊中的函數繪制外星人群gf.create_fleet(ai_settings,screen,ship,aliens)#開始游戲主循環while True:#使用模塊game_funcations中的方法#check_events檢測按鍵和鼠標點擊事件gf.check_events(ai_settings,ship,screen,bullets,stats,play_button,aliens,sb)#當標志正確時運行游戲:if stats.game_active :#方法update()用于確定事件標志以及移動距離和方向ship.update()#使用更新后的gf的函數用于更新和刪除子彈#檢測外星人與子彈的碰撞,刪除外星人與子彈  并創建外星人群gf.update_bullets(bullets,aliens,ai_settings,screen,ship,stats,sb )#由于外星人會被子彈擊中,所以在繪制子彈之后繪制外星人gf.update_aliens(ai_settings,ship,aliens,stats,bullets,screen,sb)#方法update_screen用于更新繪制屏幕各元素gf.update_screen(ai_settings,ship,screen,aliens,bullets,stats,play_button,sb)
#運行游戲
run_game()

https://www.nshth.com/python/338571.html
>

相关文章:

  • pygame外星人入侵,python外星人入侵小游戲
  • 用python入侵別人手機,python外星人入侵游戲圖片_Python外星人入侵游戲編程完整版
  • 誰是外星人游戲,20_外星人游戲項目03——
  • python游戲腳本開發,python 外星人游戲怎么打開_Python外星人入侵游戲開發—創建游戲窗口
  • 用python入侵別人手機,python小游戲----外星人入侵
  • python游戲腳本開發,python 外星人游戲下載大全_【Python】Python制作外星人入侵小游戲
  • python播放聲音模塊,python外星人入侵添加音效_python外星人入侵游戲打包
  • python飛機大戰源碼,基于pygame的飛船大戰外星人游戲
  • python 外星人入侵游戲 學習總結 以及完整代碼
  • 有外星人入侵嗎,python外星人入侵游戲代碼_python外星人入侵 游戲源碼
  • python飛機大戰源碼,python項目——外星人入侵游戲
  • 純python開發的大型游戲,Python之外星人游戲(帶源碼和圖片資源)項目
  • python編程書籍推薦,培訓python排行榜
  • bilibili播放量排行榜,b站每日排行榜爬蟲
  • python爬蟲爬取網頁表格數據,python爬蟲爬取歌曲_python爬蟲實戰:爬取全站小說排行榜
  • 爬蟲爬取網站之家,【Python爬蟲】用Python爬取娛樂圈排行榜數據
  • 可以用python寫網頁嗎,有關python的比賽_用 Python 寫一個 Kaggle 比賽排行榜的爬蟲
  • python django框架,python開源框架排行_Python開源項目最新月榜TOP 10
  • 用python刷網頁瀏覽量,用Python獲取公眾號閱讀數、點贊數。
  • 用python做一個簡單的游戲,python有什么好玩的書_史上最全的Python書排行榜|你想知道的都在這里
  • python庫大全一覽,總結!Github年度最強Python庫排行榜
  • python b站 排行_Python爬蟲抓取B站小視頻排行榜,新手也可以跟著做哦!
  • ubuntu運行安卓app,ubuntu AndroiStudio 中 外設(手機、平板) 無法使用
  • ad軟件怎么將原理圖生成pcb,AD20怎樣生成PCB文件??
  • 基于python的影評數據分析,python爬取《你好, 李煥英》豆瓣評論數據
  • 測試顯卡性能的工具,技嘉顯卡性能測試軟件,你好六啊!GTX 1660 Ti深度測試:升吧
  • 捕獲異常的方法有,Scala系列20:Scala中異常捕獲與拋出異常
  • 通過thread類創建線程,【0805作業】繼承Thread類創建線程,輸出20次數字,“你好”,線程名
  • ip靜態,Centos7 配置靜態 IP 地址
  • ip靜態,Centos7 安裝,配置靜態IP