成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

使用python實現(xiàn)飛機大戰(zhàn)游戲

瀏覽:106日期:2022-08-01 16:03:02

本文實例為大家分享了Python飛機大戰(zhàn)項目,供大家參考,具體內(nèi)容如下

import gcimport randomimport pygame# 玩家飛機精靈類import Constantsclass HeroPlane(pygame.sprite.Sprite): def __init__(self, screen): # 調(diào)用父類初始化方法 # pygame.sprite.Sprite.__init__(self) super().__init__() # 窗口 self.screen = screen # 一個玩家飛機圖片 self.image = pygame.image.load(’./feiji/feiji.png’) # 飛機矩形區(qū)域?qū)ο? self.rect = self.image.get_rect() # 左上角坐標(biāo) self.rect.topleft = [512 / 2 - 116 / 2, 600] # 飛機的速度 self.speed = 15 # 一個精靈組 存放所有的子彈精靈 self.bullets = pygame.sprite.Group() # 血量 初始100 self.blood_value = 100 # 標(biāo)記玩家飛機是否over self.is_remove = False # 顯示爆炸圖片的 索引 從0開始 self.mIndex = 0 # 存放爆炸圖片 的列表 self.bomb_mImages = [] for v in range(1, 15): # 把所有圖片 存到列表里 每個圖片 存2次 self.bomb_mImages.append(pygame.image.load(’./feiji/image ’ + str(v) + ’.png’)) self.bomb_mImages.append(pygame.image.load(’./feiji/image ’ + str(v) + ’.png’)) def kill_blood(self, kill_value=10): '''血量減少''' self.blood_value -= kill_value print(’被打中了,血量還剩%s’ % self.blood_value) if self.blood_value <= 0: # 避免血量負(fù)值 self.blood_value = 0 # 血量<=0 設(shè)置is_remove 為True self.is_remove = True def key_control(self): '''按鍵監(jiān)聽 操作飛機上下左右和發(fā)子彈''' # 監(jiān)聽鍵盤事件 key_pressed = pygame.key.get_pressed() # 注意這種方式是能夠檢測到一直按下不松開的鍵盤 if key_pressed[pygame.K_w] or key_pressed[pygame.K_UP]: # top值如果小于0 就到了最頂部 不要再移動了 if self.rect.top > 3: self.rect.top -= self.speed if key_pressed[pygame.K_s] or key_pressed[pygame.K_DOWN]: if self.rect.bottom <= 768: self.rect.bottom += self.speed if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]: if self.rect.left > 0: self.rect.left -= self.speed if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]: if self.rect.right < 520: self.rect.right += self.speed if key_pressed[pygame.K_SPACE]: # print('space') # 創(chuàng)建3個子彈 bullet1 = Bullet(self.screen, self.rect.left, self.rect.top, 1) bullet2 = Bullet(self.screen, self.rect.left, self.rect.top, 2) bullet3 = Bullet(self.screen, self.rect.left, self.rect.top, 3) # 添加到精靈組 self.bullets.add(bullet1, bullet2, bullet3) def bomb(self): print(’玩家飛機爆炸中’) '''顯示爆炸圖片''' self.screen.blit(self.bomb_mImages[self.mIndex], self.rect) self.mIndex += 1 print(’mIndex’, self.mIndex) if self.mIndex >= len(self.bomb_mImages): # 播放到了最后 爆炸結(jié)束 返回True return True def update(self): if self.is_remove: print(’玩家飛機掛掉’) # 如果玩家飛機掛掉 if self.bomb(): # 爆炸結(jié)束 print(’爆炸結(jié)束’) self.rect.topleft = [-200, -200] # 開啟倒計時 pygame.time.set_timer(Constants.game_over_id, 1000) # 把玩家飛機指向None 停止update manager.hero = None else: self.key_control() self.display() def display(self): # if self.blood_value <= 0: # # 如果血量小于0 移出窗口 # self.rect.topleft = [-200, -200] # 把飛機顯示到窗口上 飛機 116*100 self.screen.blit(self.image, self.rect) # 更新精靈組里的子彈位置 self.bullets.update() # 精靈組所有子彈顯示到窗口 self.bullets.draw(self.screen)class Bullet(pygame.sprite.Sprite): # path_num表示散彈中 子彈是哪一個 def __init__(self, screen, planex, planey, path_num): # 調(diào)用父類初始化方法 # pygame.sprite.Sprite.__init__(self) super().__init__() # 窗口 self.screen = screen # 一個子彈圖片 self.image = pygame.image.load(’./feiji/bullet_12.png’) # 子彈矩形區(qū)域?qū)ο? self.rect = self.image.get_rect() # 子彈左上角坐標(biāo) self.rect.topleft = [planex + 48, planey - 20] # 子彈的速度 self.speed = 15 # path_num表示散彈中 子彈是哪一個 self.path_num = path_num def update(self): '''修改子彈坐標(biāo)''' self.rect.top -= self.speed if self.rect.bottom < 0: # 子彈已經(jīng)移出了屏幕上方 這時把子彈從精靈組刪除 self.kill() if self.path_num == 1: pass elif self.path_num == 2: # 如果等于2 就是左側(cè)的散彈 self.rect.left -= 10 elif self.path_num == 3: # 如果等于3 就是右側(cè)的散彈 self.rect.right += 10# 敵機精靈類class EnemyPlane(pygame.sprite.Sprite): # 創(chuàng)建類屬性 存放所有飛機的所有的子彈 all_bullets = pygame.sprite.Group() def __init__(self, screen): # 調(diào)用父類初始化方法 # pygame.sprite.Sprite.__init__(self) super().__init__() # 窗口 self.screen = screen # 一個玩家飛機圖片 self.image = pygame.image.load(’./feiji/img-plane_5.png’) # 飛機矩形區(qū)域?qū)ο? self.rect = self.image.get_rect() # 左上角坐標(biāo) x坐標(biāo)隨機 self.rect.topleft = [random.randint(0, 412), 0] # 飛機的速度 self.speed = 3 # 一個精靈組 存放所有的子彈精靈 self.bullets = pygame.sprite.Group() # 敵機的左右方向 默認(rèn)一開始向右 self.direction = ’right’ # 子彈的精靈組 self.bullets = pygame.sprite.Group() # 標(biāo)記敵機是否被擊中 是否要刪除 self.is_remove = False # 顯示爆炸圖片的 索引 從0開始 self.mIndex = 0 # 存放爆炸圖片 的列表 self.bomb_mImages = [] for v in range(1, 14): # 把所有圖片 存到列表里 每個圖片 存2次 self.bomb_mImages.append(pygame.image.load(’./feiji/image ’ + str(v) + ’.png’)) self.bomb_mImages.append(pygame.image.load(’./feiji/image ’ + str(v) + ’.png’)) # 記錄爆炸位置 self.x = 0 self.y = 0 def auto_move(self): '''自動移動''' # 向下移動 self.rect.bottom += self.speed # 如果飛機向下移出邊界 刪除它 if self.rect.top > Manager.height: self.kill() # 按不同方向左右移動 if self.direction == ’right’: self.rect.right += 6 elif self.direction == ’left’: self.rect.right -= 6 # 超出左右邊界 更改移動方向 if self.rect.right >= Manager.width: self.direction = ’left’ if self.rect.left <= 0: self.direction = ’right’ def auto_fire(self): # 用一個隨機數(shù) num = random.randint(1, 40) # 判斷如果等于1就發(fā)射一個子彈 ,降低了概率 if num == 5: # 生成敵機子彈 bullet = EnemyBullet(self.screen, self.rect.left, self.rect.top) # 添加到精靈組 self.bullets.add(bullet) # 把子彈添加到類的all_bullets里 用來碰撞檢測 EnemyPlane.all_bullets.add(bullet) def bomb(self): '''顯示爆炸圖片''' if self.mIndex >= len(self.bomb_mImages): # 播放到了最后 爆炸結(jié)束 返回True return True self.screen.blit(self.bomb_mImages[self.mIndex], (self.x, self.y)) self.mIndex += 1 def update(self): if self.is_remove: if self.rect.left != -200: # 記錄爆炸時的位置 self.x = self.rect.left self.y = self.rect.top # 如果已經(jīng)被擊中 把飛機移除窗口 防止繼續(xù)碰撞檢測 self.rect.left = -200 self.rect.top = -200 # 顯示爆炸效果 if self.bomb() and not self.bullets: # 如果爆炸結(jié)束 把自己從精靈組刪除 self.kill() else: # 移動 self.auto_move() # 開火 self.auto_fire() # 顯示 self.display() self.bullet_show() def display(self): # 把飛機顯示到窗口上 飛機 116*100 self.screen.blit(self.image, self.rect) def bullet_show(self): if self.bullets: # 敵機子彈更新 self.bullets.update() # 敵機子彈顯示 self.bullets.draw(self.screen)class EnemyBullet(pygame.sprite.Sprite): # path_num表示散彈中 子彈是哪一個 def __init__(self, screen, x, y): # 調(diào)用父類初始化方法 # pygame.sprite.Sprite.__init__(self) super().__init__() # 窗口 self.screen = screen # 一個子彈圖片 self.image = pygame.image.load(’./feiji/bullet_6.png’) # 子彈矩形區(qū)域?qū)ο? self.rect = self.image.get_rect() # 子彈左上角坐標(biāo) self.rect.topleft = [x + 40, y + 60] # 子彈的速度 self.speed = 10 def update(self): '''修改子彈坐標(biāo)''' self.rect.bottom += self.speed # 如果子彈向下移出邊界 刪除它 if self.rect.top > Manager.height: self.kill()# 游戲音樂class GameSound(object): def __init__(self): pygame.mixer.init() # 音樂模塊初始化 pygame.mixer.music.load('./feiji/Jamesketed.mp3') pygame.mixer.music.set_volume(0.5) # 聲音大小 一半 self.__bomb = pygame.mixer.Sound('./feiji/bomb.wav') def playBackgroundMusic(self): # 開始播放背景音樂 -1表示一直重復(fù)播放 pygame.mixer.music.play(-1) def playBombSound(self): pygame.mixer.Sound.play(self.__bomb) # 爆炸音樂class GameBackground(object): # 初始化地圖 def __init__(self, screen): self.mImage1 = pygame.image.load('./feiji/img_bg_level_4.jpg') self.mImage2 = pygame.image.load('./feiji/img_bg_level_4.jpg') # 窗口 self.screen = screen # 輔助移動地圖 self.y1 = 0 self.y2 = -Manager.height # -768 def update(self): self.move() self.draw() # 移動地圖 def move(self): self.y1 += 2 self.y2 += 2 if self.y1 >= Manager.height: self.y1 = 0 if self.y2 >= 0: self.y2 = -Manager.height # 繪制地圖 def draw(self): self.screen.blit(self.mImage1, (0, self.y1)) self.screen.blit(self.mImage2, (0, self.y2))class Manager: hero: HeroPlane # 創(chuàng)建寬高 width = 512 height = 768 def __init__(self): # pygame初始化 否則找不到字體文件 pygame.init() # 1 創(chuàng)建一個窗口 參數(shù)1是寬高,參數(shù)2 附加參數(shù) 參3是顏色深度 self.screen = pygame.display.set_mode((self.width, self.height), 0, 32) # 2創(chuàng)建背景圖的對象 # self.background = pygame.image.load(’./feiji/img_bg_level_5.jpg’) self.background = GameBackground(self.screen) # 創(chuàng)建飛機對象 self.hero = HeroPlane(self.screen) # 創(chuàng)建時鐘對象 self.clock = pygame.time.Clock() # 敵機的精靈組 self.enemys = pygame.sprite.Group() # 初始化音效對象 self.sound = GameSound() # 定義分?jǐn)?shù)屬性 self.score = 0 # 倒計時時間 self.over_time = 3 def exit(self): # 執(zhí)行退出代碼 pygame.quit() # 程序的退出 exit() def new_enemy(self): # 創(chuàng)建敵機對象 enemy = EnemyPlane(self.screen) # 添加到精靈組 self.enemys.add(enemy) def drawText(self, text, x, y, textHeight=30, fontColor=(255, 255, 255), backgroudColor=None): # 通過字體文件獲得字體對象 參數(shù)1 字體文件 參數(shù)2 字體大小 font_obj = pygame.font.Font(’./feiji/baddf.ttf’, textHeight) # 1文字 2是否抗鋸齒 3文字顏色 4背景顏色 text_obj = font_obj.render(text, True, fontColor, backgroudColor) # 配置要顯示的文字 # 獲得要顯示的對象的rect text_rect = text_obj.get_rect() # 設(shè)置顯示對象的坐標(biāo) text_rect.topleft = (x, y) # 繪制字 到指定區(qū)域 參1是文字對象 參2 矩形對象 self.screen.blit(text_obj, text_rect) def game_over_timer(self): '''執(zhí)行倒計時''' self.over_time -= 1 if self.over_time == 0: # 停止倒計時 pygame.time.set_timer(Constants.game_over_id, 0) # 重新開始游戲 self.start_game() def show_over_text(self): print(’self.over_time’, self.over_time) # 游戲結(jié)束 顯示倒計時時間 self.drawText(’gameover %d’ % self.over_time, 0, Manager.height / 2, textHeight=50, fontColor=[0, 0, 0]) def start_game(self): global manager # 情況敵機子彈的精靈組 EnemyPlane.all_bullets.empty() manager = Manager() # 垃圾回收 提示python解釋器 要回收了 gc.collect() manager.main() def main(self): # 播放背景音樂 self.sound.playBackgroundMusic() # 參1eventid是事件id,自己定義(0 - 32之間)不要和已用的pygame的其它事件id沖突, # 參2是定時事件的間隔時間,單位是毫秒 pygame.time.set_timer(Constants.new_enemy, 500) while True: # 控制每s執(zhí)行的次數(shù) self.clock.tick(60) # 獲取事件 并且處理 for event in pygame.event.get(): # 判斷事件的類型是否是退出 if event.type == pygame.QUIT: # 退出 self.exit() elif event.type == Constants.new_enemy: # 等于20 說明定時器生效 添加一個敵機 # print(’添加一個敵機’) self.new_enemy() elif event.type == Constants.game_over_id: print(’倒計時 33333’) # 顯示倒計時時間 self.game_over_timer() # 3把背景圖顯示到窗口上 # self.screen.blit(self.background, (0, 0)) self.background.update() self.drawText(’分?jǐn)?shù):%s’ % self.score, 0, 0) if self.hero: self.drawText(’血量:%s’ % self.hero.blood_value, 0, 30) # 更新飛機 self.hero.update() # if self.hero.blood_value <= 0 and not self.hero.bullets.sprites(): # # 把玩家飛機引用指向None 盡快釋放 # self.hero = None else: self.drawText(’血量:0’, 0, 30) # 更新 敵機 self.enemys.update() # 如果飛機已經(jīng)掛掉 就一直顯示倒計時 if not self.hero: # 顯示倒計時 self.show_over_text() # 判斷 玩家飛機 和敵機是否都存在 self.enemys.sprites()返回精靈組對應(yīng)的精靈列表 if self.hero and self.enemys.sprites(): # 碰撞檢測 返回的碰撞到的 敵機列表 collide_enemys = pygame.sprite.spritecollide(self.hero, self.enemys, False, pygame.sprite.collide_mask) if collide_enemys: # 如果列表不為空 說明碰到了敵機 print(’碰到了敵機’) # 爆炸聲音 self.sound.playBombSound() self.hero.kill_blood(100) for enemy_item in collide_enemys: # 標(biāo)記敵機已經(jīng)被撞到 enemy_item.is_remove = True # 判斷 玩家飛機 和 玩家飛機的子彈 和 敵機是否都存在 if self.hero and self.hero.bullets and self.enemys: # 檢測玩家飛機的子彈 和敵機的碰撞 # 返回是個字典 格式{<Bullet sprite(in 0 groups)>: [<EnemyPlane sprite(in 0 groups)>]} # {碰撞的子彈1:[打中的敵機1,打中的敵機2],碰撞的子彈2:[打中的敵機1,打中的敵機5]} collode_dict = pygame.sprite.groupcollide(self.hero.bullets, self.enemys, True, False, pygame.sprite.collide_mask) # 1多個子彈打中同一個飛機 # 2不同子彈 打中不同飛機 # 所有加分值時 要去除重復(fù)的敵機 # print(collode_dict) if collode_dict: # 爆炸聲音 self.sound.playBombSound() print(self.score) # 用一個集合 添加敵機 去除重復(fù)的 enemyset = set() # 獲取所有打中的敵機列表,然后遍歷 for v_enemys in collode_dict.values(): # 遍歷敵機列表 for enemy_item in v_enemys: # print(id(enemy_item)) enemyset.add(enemy_item) # 標(biāo)記敵機已經(jīng)被擊中 enemy_item.is_remove = True # 碰撞后 +10分*集合里敵機的數(shù)量 self.score += 10 * len(enemyset) # 判斷 玩家飛機 和 和 敵機子彈 if self.hero and EnemyPlane.all_bullets: # 檢測玩家 和敵機子彈的碰撞 collide_bullets = pygame.sprite.spritecollide(self.hero, EnemyPlane.all_bullets, True,pygame.sprite.collide_mask) if collide_bullets: # 如果碰到了 就減少10*子彈數(shù)量的血量 self.hero.kill_blood(10 * len(collide_bullets)) # 2 顯示窗口 pygame.display.update()if __name__ == ’__main__’: manager = Manager() manager.main()

使用python實現(xiàn)飛機大戰(zhàn)游戲

使用python實現(xiàn)飛機大戰(zhàn)游戲

使用python實現(xiàn)飛機大戰(zhàn)游戲

使用python實現(xiàn)飛機大戰(zhàn)游戲

使用python實現(xiàn)飛機大戰(zhàn)游戲

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
97精品电影院| 亚洲成人免费观看| 最新成人av网站| 伊人久久亚洲美女图片| 一区二区三区导航| 欧美色综合天天久久综合精品| 91麻豆精品久久久久蜜臀| 国产欧美日韩综合| 一区二区欧美国产| 激情图片小说一区| 欧美国产专区| 一本色道久久综合亚洲aⅴ蜜桃| 777久久久精品| 久久99久久久久| 日本午夜精品视频在线观看 | 欧美精品99久久久**| 精品粉嫩超白一线天av| 亚洲另类在线视频| 国产精品伊人色| 亚洲国产精品一区在线观看不卡 | 播五月开心婷婷综合| 亚洲国产高清一区| 国产精品高清亚洲| 久久精品国产亚洲高清剧情介绍 | 亚洲美洲欧洲综合国产一区| 精品视频1区2区3区| 国产精品久久影院| 欧美日韩综合网| 欧美系列在线观看| 秋霞电影网一区二区| 国产精品大片| 日韩视频一区二区| 一区二区在线观看av| 99精品热6080yy久久| 亚洲免费观看高清完整版在线观看| 国产精品一区一区三区| 911精品国产一区二区在线| 国产一区二区电影| 国产免费成人| 日韩欧美成人一区| 蜜桃视频一区二区三区在线观看 | 亚洲成av人在线观看| 国产精品主播| 日本成人在线一区| 欧美一区二区私人影院日本| 亚洲黄色小视频| 翔田千里一区二区| 国产精品系列在线| 处破女av一区二区| 欧美综合在线视频| 亚洲123区在线观看| 色88888久久久久久影院按摩| 亚洲欧洲成人av每日更新| 99久久伊人精品| 国产精品私人影院| 99热精品在线观看| 无吗不卡中文字幕| 最新成人av网站| 五月天久久比比资源色| 69堂精品视频| proumb性欧美在线观看| 欧美三电影在线| 成人免费看的视频| 亚洲欧美中日韩| 色8久久人人97超碰香蕉987| 丰满白嫩尤物一区二区| 欧美日韩激情在线| 丝袜诱惑制服诱惑色一区在线观看| 亚洲天堂黄色| 日本一区二区三区电影| 99pao成人国产永久免费视频| 美女在线视频一区| 26uuu成人网一区二区三区| 国产黄色成人av| 在线电影国产精品| 成人一区二区三区视频在线观看 | 一区二区三区免费观看| 欧美日韩免费一区二区三区| 94色蜜桃网一区二区三区| 亚洲一区二区三区不卡国产欧美| 国自产拍偷拍福利精品免费一 | 成人黄色免费短视频| 亚洲欧洲日产国码二区| 玖玖视频精品| 一区二区激情视频| 7878成人国产在线观看| 99国产精品国产精品久久| 亚洲美女电影在线| 91精品国模一区二区三区| 91麻豆精品在线观看| 日韩欧美国产精品一区| 91免费观看视频| 一区二区三区四区不卡视频| 在线看一区二区| 色综合天天做天天爱| 精品国产污网站| 国产精品入口| 日本伊人色综合网| 久久久av毛片精品| 成人激情免费视频| 一区二区三区美女| 精品美女在线播放| 粉嫩aⅴ一区二区三区四区| 中文字幕一区二区视频| 欧美性淫爽ww久久久久无| 欧美精品网站| 国产精品乱码人人做人人爱| 久久久久综合| 91在线云播放| 亚洲va国产天堂va久久en| 在线播放欧美女士性生活| 狠狠入ady亚洲精品| 麻豆久久久久久| 国产精品色一区二区三区| 色综合激情五月| 91在线视频在线| 天天影视涩香欲综合网| 久久综合久久99| 久久久xxx| 日韩精品电影在线| 久久久青草青青国产亚洲免观| 国产精品永久| 丁香激情综合五月| 亚洲成人资源在线| 久久久精品国产免大香伊| 色综合激情五月| 欧美一区1区三区3区公司| 午夜视频在线观看一区二区| 精品日韩一区二区三区免费视频| 亚洲一区二区三区高清| gogo大胆日本视频一区| 日韩高清国产一区在线| 国产精品美日韩| 在线观看一区视频| aaa欧美日韩| 麻豆中文一区二区| 亚洲丝袜精品丝袜在线| 欧美私人啪啪vps| 麻豆视频观看网址久久| 综合分类小说区另类春色亚洲小说欧美| 精品视频在线看| 一本不卡影院| 你懂的视频一区二区| 国产精品99久久久久久久女警| 亚洲精品免费视频| 久久综合九色综合欧美就去吻| 在线日韩一区二区| 亚洲成色精品| 不卡的av网站| 九九九久久久精品| 一区二区三区在线免费观看| 久久蜜桃av一区精品变态类天堂 | 精品久久久久久久久久久久包黑料 | 欧美一区二区三区免费在线看| 麻豆久久精品| 欧美激情第六页| 国产乱人伦偷精品视频不卡| 亚洲大片在线观看| 国产精品国产自产拍在线| 欧美大黄免费观看| 欧美体内she精视频| 91首页免费视频| 成人午夜视频免费看| 久久精品国产77777蜜臀| 一区二区成人在线视频| 国产精品三级久久久久三级| 日韩色视频在线观看| 欧美午夜精品久久久久久超碰| 欧美资源在线| 亚洲黄色影院| 99re这里都是精品| 成人丝袜18视频在线观看| 美日韩一级片在线观看| 性久久久久久久久久久久| 亚洲人成7777| 中文幕一区二区三区久久蜜桃| 日韩欧美色综合网站| 欧美日韩一级黄| 在线观看国产日韩| 色偷偷成人一区二区三区91| 色婷婷久久综合| 午夜亚洲一区| 国产欧美日韩综合一区在线观看| 国内视频一区| 欧美精品一区在线| 成人精品一区二区三区中文字幕| 九九国产精品视频| 久久99精品视频| 日本大胆欧美人术艺术动态| 亚洲va欧美va天堂v国产综合| 洋洋成人永久网站入口| 亚洲欧美日韩综合aⅴ视频| 亚洲欧洲精品天堂一级 | 亚洲国产视频一区| 日韩一级黄色大片| 精品视频1区2区| 色噜噜狠狠一区二区三区果冻| 久久久久久亚洲精品不卡4k岛国| 久久成人免费| 久久亚洲精选|