Pygame框架實現飛機大戰
阿新 • • 發佈:2020-08-07
本文例項為大家分享了Pygame框架實現飛機大戰的具體程式碼,供大家參考,具體內容如下
飛機大戰主遊戲類
""" 專案名稱:簡單飛機大戰遊戲 基於框架:Pygame 開發日期:2020.07 開發人員:Y 版本:**** """ import sys # 匯入內建模組sys 呼叫sys.exit() import pygame # 匯入第三方模組pygame from plane_sprites import * # 匯入自定義模組內所有工具 class PlayGame(object): # 定義開始遊戲主類 繼承object基類 def __init__(self): # 定義初始化方法 self.srceen = pygame.display.set_mode(SRCEEN_SIZE.size) # 設定遊戲主視窗 self.clock = pygame.time.Clock() # 設定遊戲時鐘 用於重新整理螢幕幀率 self.__creat_sprites() # 呼叫私有方法實現新增精靈類內容 pygame.display.set_caption('飛機大戰') # 設定視窗標題 pygame.time.set_timer(CREAT_ENEMY_EVENT,1000) # 設定事件定時器 用於每隔一段時間執行一次事件 pygame.time.set_timer(FIRE_BULLTE,300) # 設定事件定時器 用於每隔一段時間執行一次事件 def start_game(self): # 定義開始遊戲方法 while True: # 遊戲迴圈 self.clock.tick(CLOCK_TICK) # 利用時鐘設定重新整理幀率 self.__event_hander() # 呼叫私有方法實現監聽事件 self.__check_collide() # 呼叫私有方法檢測碰撞 self.__update_sprites() # 呼叫私有方法更新和繪製精靈組 pygame.display.flip() # 更新視窗顯示 # pygame.display.update() # 更新視窗顯示 def __creat_sprites(self): # 定義新增精靈組方法 bj1 = Background() # 利用背景類建立背景物件1 預設引數Flase 表示第一張影象,需要與螢幕重合 bj2 = Background(True) # 利用背景類建立背景物件2 引數True 表示另一張影象, 在螢幕的正上方 self.bj_group = pygame.sprite.Group(bj1,bj2) # 設定背景精靈組 self.emeny_group = pygame.sprite.Group() # 提前設定敵機精靈組 但並不設定敵機物件 # 敵機類物件是定時被建立的,因此在初始化方法中,不需要建立敵機物件 self.hero = Hero() # 利用英雄類建立英雄物件 注意:後續對英雄做碰撞檢測及發射操作,所有需要單獨設定為屬性 self.hero_group = pygame.sprite.Group(self.hero) # 設定英雄精靈組 def __event_hander(self): # 定義監聽事件方法 for event in pygame.event.get(): # 迴圈監聽所有事件 if event.type == pygame.QUIT: # 如果是單擊退出按鈕事件 PlayGame.__game_over() # 呼叫私有方法實現結束遊戲 elif event.type == CREAT_ENEMY_EVENT: # 如果是執行自定義事件建立敵機 emeny1 = Enemy("./images/enemy1.png") # 利用敵機類建立敵機1 emeny2 = Enemy("./images/enemy2.png") # 利用敵機類建立敵機2 emeny3 = Enemy("./images/enemy3_n1.png") self.emeny_group.add(emeny1,emeny2,emeny3) # 對之前設定好的敵機精靈組進行新增精靈物件 elif event.type == FIRE_BULLTE: # 如果是執行自定義事件發射子彈 self.hero.fire() # 呼叫英雄物件的發射子彈方法 key_tuple = pygame.key.get_pressed() # 捕獲鍵盤按鍵返回值為元組 if key_tuple[pygame.K_RIGHT]: # 判斷捕獲鍵盤按鍵為右鍵 self.hero.speed = 4 # 設定英雄類物件的速度為4 向右移動 elif key_tuple[pygame.K_LEFT]: # 判斷捕獲鍵盤按鍵為左鍵 self.hero.speed = -4 # 設定英雄類物件的速度為-4 向左移動 else: # 否則 self.hero.speed = 0 # 捕獲其餘任何按鍵英雄類物件速度不變 不移動 def __check_collide(self): # 定義檢測碰撞方法 pygame.sprite.groupcollide(self.hero.bullet_group,self.emeny_group,True,True) # 兩個精靈組中所有的精靈的碰撞檢測 屬性True,則發生碰撞的精靈將被自動移除 enemies = pygame.sprite.spritecollide(self.hero,True) # 判斷某個精靈和指定精靈組中的精靈的碰撞 屬性True,則指定精靈組中發生碰撞的精靈將被自動移除 # 返回精靈組中跟精靈發生碰撞的精靈列表 if len(enemies) > 0: # 判斷敵機精靈組內精靈是否存在 若存在 self.hero.kill() # 碰撞導致英雄銷燬 PlayGame.game_over() # 呼叫類中結束遊戲方法 退出遊戲 def __update_sprites(self): # 定義精靈組更新和繪製方法 self.bj_group.update() # 更新背景類精靈 self.bj_group.draw(self.srceen) # 繪製背景類精靈 self.emeny_group.update() # 更新敵機類精靈 self.emeny_group.draw(self.srceen) # 繪製敵機類精靈 self.hero_group.update() # 更新英雄類精靈 self.hero_group.draw(self.srceen) # 繪製英雄類精靈 self.hero.bullet_group.update() # 更新英雄子彈類精靈 self.hero.bullet_group.draw(self.srceen) # 繪製英雄子彈類精靈 @staticmethod # 宣告定義靜態方法 def __game_over(): # 定義靜態方法 print("遊戲結束") # 控制檯列印遊戲結束 pygame.quit() # 解除安裝所有pygame模組工具 sys.exit() # 退出程式 if __name__ == '__main__': # 判斷當前執行 playgame = PlayGame() # 建立開始遊戲物件 playgame.start_game() # 呼叫開始遊戲物件的開始方法
遊戲工具類
""" 專案名稱:簡單飛機大戰遊戲 基於框架:Pygame 開發日期:2020.07 開發人員:Y 版本:**** """ import random # 匯入內建模組 random 呼叫randint方法 import pygame # 匯入第三方模組pygame SRCEEN_SIZE = pygame.Rect(0,480,700) # 利用Rect方法定義視窗大小常量 CLOCK_TICK = 60 # 定義時鐘幀率常量 CREAT_ENEMY_EVENT = pygame.USEREVENT # 自定義建立敵機事件 FIRE_BULLTE = pygame.USEREVENT + 1 # 自定義發射子彈事件 class GameSprites(pygame.sprite.Sprite): # 定義遊戲精靈類 繼承pygame.sprite.Sprite def __init__(self,image_name,speed=1): # 定義初始化方法 super().__init__() # 因未繼承object基類 定義初始化方法需要先super()下父類的 __init_方法 self.image = pygame.image.load(image_name) # 定義例項屬性image為載入圖片至記憶體中 self.rect = self.image.get_rect() # 定義例項屬性rect為獲取圖片的矩形區域(0,image.width,image.height) self.speed = speed # 定義例項屬性speed為運動速度 實質為移動的幅度,幅度大則速度快 def update(self): # 定義更新資料方法實現移動image self.rect.y += self.speed # 移動image的Y軸距離為向下speed距離 class Background(GameSprites): # 定義背景精靈類 繼承遊戲精靈類 def __init__(self,is_alt=False): # 在父類(遊戲精靈類)基礎上定義初始化方法 is_alt預設引數用於判斷是否為第二張image super().__init__("./images/background.png") # 因未繼承object基類 定義初始化方法需要先super()下父類的 __init_方法 並以背景圖為image為引數 if is_alt: # 判斷是否為第二張image 如果是 self.rect.y = -self.rect.height # 將第二張image的Y軸座標設定為本身image.height的負值 用來實現將第二張image置於第一張image上方 def update(self): # 在父類(遊戲精靈類)基礎上修改 更新資料方法實現移動background_image super().update() # 繼承父類(遊戲精靈類)的移動方式 按照speed向下移動 if self.rect.y >= SRCEEN_SIZE.height: # 判斷background_image在Y軸距離是否大於等於視窗高度 如果是 # 表示第一張image全部下滑出視窗 self.rect.y = -self.rect.height # 需要重新將該image置於第二張image上方 class Enemy(GameSprites): # 定義敵機精靈類 繼承遊戲精靈類 def __init__(self,image): # 在父類(遊戲精靈類)基礎上修改定義初始化方法 自定義引數image用於實現多種形式敵機 super().__init__(image) # 因未繼承object基類 定義初始化方法需要先super()下父類的 __init_方法 並以自定義背景圖為image為引數 self.speed = random.randint(1,5) # 修改敵機類image移動幅度(速度)為1--5隨機值 self.rect.bottom = 0 # 定義敵機類image的底部為0 表示每次從視窗最頂部駛入 美化效果 MAX_WIDTH = SRCEEN_SIZE.width - self.rect.width # 定義常量為敵機物件出現時的image.x最大值 防止跑出視窗介面或只有敵機部分駛入視窗 # 最大寬度 = 視窗寬度 - 敵機image的寬度 self.rect.x = random.randint(0,MAX_WIDTH) # 設定敵機image的出現範圍為限制在視窗內 def update(self): # 在父類(遊戲精靈類)基礎上修改 更新資料方法實現移動emeny_image super().update() # 繼承父類(遊戲精靈類)的移動方式 按照speed向下移動 if self.rect.y >= SRCEEN_SIZE.height: # 判斷敵機物件的Y軸距離是否超過視窗高度 如果是 表示敵機物件駛出視窗 # print("敵機銷燬") self.kill() # 敵機物件駛出視窗後進行銷燬 從記憶體中釋放敵機image 減輕計算機記憶體壓力 def __del__(self): # 定義敵機物件銷燬前的動作,如爆炸動畫,碰撞音訊等等 pass # pass語句佔位 待開發。。 class Hero(GameSprites): # 定義英雄精靈類 繼承遊戲精靈類 def __init__(self): # 在父類(遊戲精靈類)基礎上修改定義初始化方法 實現英雄類image初始位置以及移動限制 super().__init__("./images/me1.png",0) # 因未繼承object基類 定義初始化方法需要先super()下父類的 __init_方法 並以自定義英雄類image self.rect.centerx = SRCEEN_SIZE.centerx # 限制英雄類物件只可以在X軸(水平方向)移動 self.rect.bottom = SRCEEN_SIZE.bottom - 120 # 設定英雄類物件出現時底部位置為視窗底部上120px self.bullet_group = pygame.sprite.Group() # 注意:內建子彈類精靈組為英雄類例項屬性 提前設定子彈精靈組 def update(self,*args): # 注意:此方法不是在父類(遊戲精靈類)基礎上修改 更新資料方法實現移動hero_image # 因為英雄類物件不需要從上向下移動,無需繼承父類(遊戲精靈類)的update方法 self.rect.x += self.speed # 設定移動例項屬性 在X軸水平方向以speed速度(幅度)移動 if self.rect.x < 0: # 判斷英雄類例項在X軸座標是否小於0 即是否移出視窗左側 如果是 self.rect.x = 0 # 重置(限制)英雄例項在X軸方向座標為0 即視窗最左側 elif self.rect.right > SRCEEN_SIZE.right: # 判斷英雄類例項在X軸座標是否大於視窗最右側 即是否移除視窗右側 如果是 self.rect.right = SRCEEN_SIZE.right # 重置(限制)英雄例項在X軸方向座標為視窗最右側 即視窗最右側 def fire(self): # 英雄類精靈例項定義發射子彈方法 print("發射子彈。。。") # 控制檯打印發射子彈。。。字樣 for i in (0,1,2): # for計次迴圈用於實現子彈連發 bullte = Bullet() # 利用子彈精靈類建立子彈例項 bullte.rect.bottom = self.rect.y - i * 20 # 設定子彈初始位置的最底部為英雄類物件Y軸方向的上方 i*20 px的距離 bullte.rect.centerx = self.rect.centerx # 限制子彈類物件位置始終為英雄類物件的X軸中間 self.bullet_group.add(bullte) # 對之前設定好的子彈精靈組進行新增精靈物件 class Bullet(GameSprites): # 定義子彈精靈類 繼承遊戲精靈類 def __init__(self): # 在父類(遊戲精靈類)基礎上修改定義初始化方法 實現子彈類image以及speed為-x 即向上移動speed super().__init__("./images/bullet1.png",-2) def update(self,*args): # 在父類(遊戲精靈類)基礎上 更新資料方法實現移動bullet_image super().update() # 繼承父類(遊戲精靈類)的移動方式 按照speed向上移動 if self.rect.bottom < 0: # 判斷子彈物件的Y軸距離是否超過視窗高度 如果是 表示子彈物件駛出視窗 self.kill() # 子彈物件駛出視窗後進行銷燬 從記憶體中釋放子彈image 減輕計算機記憶體壓力
遊戲截圖
更多有趣的經典小遊戲實現專題,分享給大家:
C++經典小遊戲彙總
python經典小遊戲彙總
python俄羅斯方塊遊戲集合
JavaScript經典遊戲 玩不停
java經典小遊戲彙總
javascript經典小遊戲彙總
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。