Pygame框架實現(xiàn)飛機大戰(zhàn)
本文實例為大家分享了Pygame框架實現(xiàn)飛機大戰(zhàn)的具體代碼,供大家參考,具體內(nèi)容如下
飛機大戰(zhàn)主游戲類
""" 項目名稱:簡單飛機大戰(zhàn)游戲 基于框架:Pygame 開發(fā)日期:2020.07 開發(fā)人員:Y 版本:**** """ import sys # 導入內(nèi)置模塊sys 調(diào)用sys.exit() import pygame # 導入第三方模塊pygame from plane_sprites import * # 導入自定義模塊內(nèi)所有工具 class PlayGame(object): # 定義開始游戲主類 繼承object基類 def __init__(self): # 定義初始化方法 self.srceen = pygame.display.set_mode(SRCEEN_SIZE.size) # 設置游戲主窗口 self.clock = pygame.time.Clock() # 設置游戲時鐘 用于刷新屏幕幀率 self.__creat_sprites() # 調(diào)用私有方法實現(xiàn)添加精靈類內(nèi)容 pygame.display.set_caption('飛機大戰(zhàn)') # 設置窗口標題 pygame.time.set_timer(CREAT_ENEMY_EVENT, 1000) # 設置事件定時器 用于每隔一段時間執(zhí)行一次事件 pygame.time.set_timer(FIRE_BULLTE, 300) # 設置事件定時器 用于每隔一段時間執(zhí)行一次事件 def start_game(self): # 定義開始游戲方法 while True: # 游戲循環(huán) self.clock.tick(CLOCK_TICK) # 利用時鐘設置刷新幀率 self.__event_hander() # 調(diào)用私有方法實現(xiàn)監(jiān)聽事件 self.__check_collide() # 調(diào)用私有方法檢測碰撞 self.__update_sprites() # 調(diào)用私有方法更新和繪制精靈組 pygame.display.flip() # 更新窗口顯示 # pygame.display.update() # 更新窗口顯示 def __creat_sprites(self): # 定義添加精靈組方法 bj1 = Background() # 利用背景類創(chuàng)建背景對象1 默認參數(shù)Flase 表示第一張圖像,需要與屏幕重合 bj2 = Background(True) # 利用背景類創(chuàng)建背景對象2 參數(shù)True 表示另一張圖像, 在屏幕的正上方 self.bj_group = pygame.sprite.Group(bj1, bj2) # 設置背景精靈組 self.emeny_group = pygame.sprite.Group() # 提前設置敵機精靈組 但并不設置敵機對象 # 敵機類對象是定時被創(chuàng)建的,因此在初始化方法中,不需要創(chuàng)建敵機對象 self.hero = Hero() # 利用英雄類創(chuàng)建英雄對象 注意:后續(xù)對英雄做碰撞檢測及發(fā)射操作,所有需要單獨設置為屬性 self.hero_group = pygame.sprite.Group(self.hero) # 設置英雄精靈組 def __event_hander(self): # 定義監(jiān)聽事件方法 for event in pygame.event.get(): # 循環(huán)監(jiān)聽所有事件 if event.type == pygame.QUIT: # 如果是單擊退出按鈕事件 PlayGame.__game_over() # 調(diào)用私有方法實現(xiàn)結(jié)束游戲 elif event.type == CREAT_ENEMY_EVENT: # 如果是執(zhí)行自定義事件創(chuàng)建敵機 emeny1 = Enemy("./images/enemy1.png") # 利用敵機類創(chuàng)建敵機1 emeny2 = Enemy("./images/enemy2.png") # 利用敵機類創(chuàng)建敵機2 emeny3 = Enemy("./images/enemy3_n1.png") self.emeny_group.add(emeny1, emeny2, emeny3) # 對之前設置好的敵機精靈組進行添加精靈對象 elif event.type == FIRE_BULLTE: # 如果是執(zhí)行自定義事件發(fā)射子彈 self.hero.fire() # 調(diào)用英雄對象的發(fā)射子彈方法 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, 則發(fā)生碰撞的精靈將被自動移除 enemies = pygame.sprite.spritecollide(self.hero, self.emeny_group, True) # 判斷某個精靈和指定精靈組中的精靈的碰撞 屬性True,則指定精靈組中發(fā)生碰撞的精靈將被自動移除 # 返回精靈組中跟精靈發(fā)生碰撞的精靈列表 if len(enemies) > 0: # 判斷敵機精靈組內(nèi)精靈是否存在 若存在 self.hero.kill() # 碰撞導致英雄銷毀 PlayGame.game_over() # 調(diào)用類中結(jié)束游戲方法 退出游戲 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 # 聲明定義靜態(tài)方法 def __game_over(): # 定義靜態(tài)方法 print("游戲結(jié)束") # 控制臺打印游戲結(jié)束 pygame.quit() # 卸載所有pygame模塊工具 sys.exit() # 退出程序 if __name__ == '__main__': # 判斷當前執(zhí)行 playgame = PlayGame() # 創(chuàng)建開始游戲?qū)ο? playgame.start_game() # 調(diào)用開始游戲?qū)ο蟮拈_始方法
游戲工具類
""" 項目名稱:簡單飛機大戰(zhàn)游戲 基于框架:Pygame 開發(fā)日期:2020.07 開發(fā)人員:Y 版本:**** """ import random # 導入內(nèi)置模塊 random 調(diào)用randint方法 import pygame # 導入第三方模塊pygame SRCEEN_SIZE = pygame.Rect(0, 0, 480, 700) # 利用Rect方法定義窗口大小常量 CLOCK_TICK = 60 # 定義時鐘幀率常量 CREAT_ENEMY_EVENT = pygame.USEREVENT # 自定義創(chuàng)建敵機事件 FIRE_BULLTE = pygame.USEREVENT + 1 # 自定義發(fā)射子彈事件 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為加載圖片至內(nèi)存中 self.rect = self.image.get_rect() # 定義實例屬性rect為獲取圖片的矩形區(qū)域(0, 0, image.width, image.height) self.speed = speed # 定義實例屬性speed為運動速度 實質(zhì)為移動的幅度,幅度大則速度快 def update(self): # 定義更新數(shù)據(jù)方法實現(xiàn)移動image self.rect.y += self.speed # 移動image的Y軸距離為向下speed距離 class Background(GameSprites): # 定義背景精靈類 繼承游戲精靈類 def __init__(self, is_alt=False): # 在父類(游戲精靈類)基礎上定義初始化方法 is_alt缺省參數(shù)用于判斷是否為第二張image super().__init__("./images/background.png") # 因未繼承object基類 定義初始化方法需要先super()下父類的 __init_方法 并以背景圖為image為參數(shù) if is_alt: # 判斷是否為第二張image 如果是 self.rect.y = -self.rect.height # 將第二張image的Y軸坐標設置為本身image.height的負值 用來實現(xiàn)將第二張image置于第一張image上方 def update(self): # 在父類(游戲精靈類)基礎上修改 更新數(shù)據(jù)方法實現(xiàn)移動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): # 在父類(游戲精靈類)基礎上修改定義初始化方法 自定義參數(shù)image用于實現(xiàn)多種形式敵機 super().__init__(image) # 因未繼承object基類 定義初始化方法需要先super()下父類的 __init_方法 并以自定義背景圖為image為參數(shù) self.speed = random.randint(1, 5) # 修改敵機類image移動幅度(速度)為1--5隨機值 self.rect.bottom = 0 # 定義敵機類image的底部為0 表示每次從窗口最頂部駛?cè)?美化效果 MAX_WIDTH = SRCEEN_SIZE.width - self.rect.width # 定義常量為敵機對象出現(xiàn)時的image.x最大值 防止跑出窗口界面或只有敵機部分駛?cè)氪翱? # 最大寬度 = 窗口寬度 - 敵機image的寬度 self.rect.x = random.randint(0, MAX_WIDTH) # 設置敵機image的出現(xiàn)范圍為限制在窗口內(nèi) def update(self): # 在父類(游戲精靈類)基礎上修改 更新數(shù)據(jù)方法實現(xiàn)移動emeny_image super().update() # 繼承父類(游戲精靈類)的移動方式 按照speed向下移動 if self.rect.y >= SRCEEN_SIZE.height: # 判斷敵機對象的Y軸距離是否超過窗口高度 如果是 表示敵機對象駛出窗口 # print("敵機銷毀") self.kill() # 敵機對象駛出窗口后進行銷毀 從內(nèi)存中釋放敵機image 減輕計算機內(nèi)存壓力 def __del__(self): # 定義敵機對象銷毀前的動作,如爆炸動畫,碰撞音頻等等 pass # pass語句占位 待開發(fā)。。 class Hero(GameSprites): # 定義英雄精靈類 繼承游戲精靈類 def __init__(self): # 在父類(游戲精靈類)基礎上修改定義初始化方法 實現(xiàn)英雄類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 # 設置英雄類對象出現(xiàn)時底部位置為窗口底部上120px self.bullet_group = pygame.sprite.Group() # 注意:內(nèi)置子彈類精靈組為英雄類實例屬性 提前設置子彈精靈組 def update(self, *args): # 注意:此方法不是在父類(游戲精靈類)基礎上修改 更新數(shù)據(jù)方法實現(xiàn)移動hero_image # 因為英雄類對象不需要從上向下移動,無需繼承父類(游戲精靈類)的update方法 self.rect.x += self.speed # 設置移動實例屬性 在X軸水平方向以speed速度(幅度)移動 if self.rect.x < 0: # 判斷英雄類實例在X軸坐標是否小于0 即是否移出窗口左側(cè) 如果是 self.rect.x = 0 # 重置(限制)英雄實例在X軸方向坐標為0 即窗口最左側(cè) elif self.rect.right > SRCEEN_SIZE.right: # 判斷英雄類實例在X軸坐標是否大于窗口最右側(cè) 即是否移除窗口右側(cè) 如果是 self.rect.right = SRCEEN_SIZE.right # 重置(限制)英雄實例在X軸方向坐標為窗口最右側(cè) 即窗口最右側(cè) def fire(self): # 英雄類精靈實例定義發(fā)射子彈方法 print("發(fā)射子彈。。。") # 控制臺打印發(fā)射子彈。。。字樣 for i in (0, 1, 2): # for計次循環(huán)用于實現(xiàn)子彈連發(fā) bullte = Bullet() # 利用子彈精靈類創(chuàng)建子彈實例 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): # 在父類(游戲精靈類)基礎上修改定義初始化方法 實現(xiàn)子彈類image以及speed為-x 即向上移動speed super().__init__("./images/bullet1.png", -2) def update(self, *args): # 在父類(游戲精靈類)基礎上 更新數(shù)據(jù)方法實現(xiàn)移動bullet_image super().update() # 繼承父類(游戲精靈類)的移動方式 按照speed向上移動 if self.rect.bottom < 0: # 判斷子彈對象的Y軸距離是否超過窗口高度 如果是 表示子彈對象駛出窗口 self.kill() # 子彈對象駛出窗口后進行銷毀 從內(nèi)存中釋放子彈image 減輕計算機內(nèi)存壓力
游戲截圖
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)爬取亞馬遜數(shù)據(jù)并打印出Excel文件操作示例
這篇文章主要介紹了Python實現(xiàn)爬取亞馬遜數(shù)據(jù)并打印出Excel文件操作,結(jié)合實例形式分析了Python針對亞馬遜圖書數(shù)據(jù)的爬取操作,以及數(shù)據(jù)打印輸出Excel相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2019-05-05Python報錯TypeError: unhashable type: ‘numpy.nd
在Python編程中,尤其是在處理數(shù)據(jù)時,我們經(jīng)常使用numpy數(shù)組,然而,當我們嘗試將numpy數(shù)組用作字典的鍵或集合的元素時,就會遇到TypeError: unhashable type: 'numpy.ndarray',本文將探討這個錯誤的原因,并給出幾種可能的解決方案,需要的朋友可以參考下2024-09-09python數(shù)據(jù)庫編程 ODBC方式實現(xiàn)通訊錄
這篇文章主要為大家詳細介紹了python數(shù)據(jù)庫編程,ODBC方式實現(xiàn)通訊錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03keras load model時出現(xiàn)Missing Layer錯誤的解決方式
這篇文章主要介紹了keras load model時出現(xiàn)Missing Layer錯誤的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python尾遞歸優(yōu)化實現(xiàn)代碼及原理詳解
這篇文章主要介紹了Python尾遞歸優(yōu)化實現(xiàn)代碼及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10Python Pygame實戰(zhàn)之實現(xiàn)經(jīng)營類游戲夢想小鎮(zhèn)代碼版
作為一名模擬經(jīng)營類游戲的發(fā)燒友,各種農(nóng)場類、醫(yī)院類、鐵路類的游戲玩兒了很多年。今天用代碼給大家打造一款夢想小鎮(zhèn)游戲,希望大家喜歡啦2022-12-12