日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python飞机大战源码以及素材资源

發布時間:2023/12/9 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python飞机大战源码以及素材资源 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、實現功能包括:多架敵機隨機出現,生命數3,死亡時倒計時后重新開局,炸彈隨機降落,統計擊敗敵機數,三張地圖每局隨機出現,擊敗敵機數達到10時出現大飛機,大飛機發射子彈更密集等。

二、pycharm源碼文件以及圖片素材資源已在主頁上傳,代碼以及運行結果如下:

import time import random from PIL import Imageimport pygame from pygame.constants import *#己方飛機類 class Player(pygame.sprite.Sprite):# 存放所有飛機的子彈的組bullets = pygame.sprite.Group()def __init__(self,screen):# 這個精靈的初始化方法 必須調用pygame.sprite.Sprite.__init__(self)# 創建一個玩家飛機圖片,當做真正的飛機self.image = pygame.image.load("./feiji/hero1.png")#通過圖片獲得矩陣self.rect = self.image.get_rect() # rect:矩形# 定義飛機初始化坐標self.rect.topleft = [Manager.bg_size[0] / 2 - 100 / 2,600]# 飛機速度self.speed = 10#記錄當前窗口對象self.screen = screen#子彈圖片self.bullet_image = "./feiji/bullet.png"# 飛機子彈頻率 1~100,表示每0.01秒百分之幾的概率發射self.bullet_frequency = 10def key_control(self):# 監聽鍵盤事件key_pressed = pygame.key.get_pressed()if key_pressed[K_w] or key_pressed[K_UP]:self.rect.top -= self.speedif key_pressed[K_s] or key_pressed[K_DOWN]:self.rect.bottom += self.speedif key_pressed[K_a] or key_pressed[K_LEFT]:# 定義飛機左行駛盡頭邊界if self.rect.left >= 10 :self.rect.left -= self.speedif key_pressed[K_d] or key_pressed[K_RIGHT]:#定義飛機右行駛盡頭邊界if self.rect.right <= Manager.bg_size[0]:self.rect.right += self.speedif key_pressed[K_SPACE]:# 隨機發射子彈if random.randint(0,99) in range(self.bullet_frequency):bullet = Bullet(self.screen ,self.rect.left + 50 - Image.open(self.bullet_image).size[0]/2,self.rect.top - Image.open(self.bullet_image).size[1])# 將己方子彈子彈改為bullet.image = pygame.image.load(self.bullet_image)Player.bullets.add(bullet)#鍵盤監聽控制飛機,飛機的顯示def update(self):self.key_control()self.display()def display(self):# 粘貼飛機坐標self.screen.blit(self.image, self.rect)#更新子彈坐標for i in Player.bullets:i.player_fire()# 對應子彈的update方法Player.bullets.update()# 把所有子彈全部添加到屏幕Player.bullets.draw(self.screen)#敵方飛機類 class Enemyplayer(pygame.sprite.Sprite):# 放子彈的列表,類屬性,通過類名調用bullets = pygame.sprite.Group()def __init__(self,screen,image ):# 這個精靈的初始化方法 必須調用pygame.sprite.Sprite.__init__(self)#記錄窗口self.screen = screen#獲取敵方飛機圖片self.image = pygame.image.load(image)#通過圖片獲得矩陣self.rect = self.image.get_rect()#敵方飛機坐標初始化self.rect.topleft = [Manager.bg_size[0]/2 - 50/2,0]# 放子彈的列表,類屬性,通過類名調用self.bullets = pygame.sprite.Group()# 子彈圖片self.bullet_image = "./feiji/bullet1.png"#敵方飛機子彈頻率 1~100,平均一秒發射幾個self.bullet_frequency = 3#敵機移動方向self.direciton= "left"#飛機是否向下移動self.direciton_up = False#敵機速度self.speed = 4def display(self):#粘貼敵機到窗口self.screen.blit(self.image,self.rect.topleft)#敵方飛機自動開火方法def auto_fire(self):#控制敵方子彈頻率if random.randint(1, 100) in range(0,self.bullet_frequency):#通過飛機坐標跟子彈分辨率大小調用子彈對象bullet = Bullet(self.screen,self.rect.left + 25 - Image.open(self.bullet_image).size[0]/2,self.rect.top + Image.open(self.bullet_image).size[1] + 20)#將敵方子彈子彈改為bullet.image = pygame.image.load(self.bullet_image)#向Bullet子彈對象列表增加一個子彈對象Enemyplayer.bullets.add(bullet)#敵方飛機自動飛行方法def auto_move(self):if self.direciton == "left":self.rect.left -= self.speedif self.direciton_up :self.rect.bottom += self.speedelif self.direciton == "right":self.rect.right += self.speedif self.direciton_up:self.rect.bottom += self.speedif self.rect.left <= 0 :self.direciton = "right"elif self.rect.right >=Manager.bg_size[0]:self.direciton = "left"#使敵方飛機飛出窗口時消除該敵方飛機對象def kill_enemy(self):if self.rect.top > Manager.bg_size[1]:self.kill()#敵方飛機自動移動,自動發射以及顯示def update(self):self.auto_move()self.auto_fire()self.display()self.kill_enemy()#子彈類 class Bullet(pygame.sprite.Sprite):def __init__(self,screen,x,y):# 這個精靈的初始化方法 必須調用pygame.sprite.Sprite.__init__(self)self.screen = screenself.image = pygame.image.load("./feiji/bullet.png")#通過圖片獲得矩陣self.rect = self.image.get_rect()# 初始化子彈坐標self.rect.topleft = [x , y ]#子彈速度self.speed = 8#己方飛機開火def player_fire(self):self.rect.top -= self.speed+4#敵方飛機開火def enemy_fire(self):self.rect.bottom += self.speed/2def update(self):# 如果子彈移出屏幕上方 則銷毀子彈對象if self.rect.top > Manager.bg_size[1] or self.rect.bottom < 0 :self.kill()self.enemy_fire()# 把所有子彈全部添加到屏幕Enemyplayer.bullets.draw(self.screen)# 炸彈類 class Bombshell(pygame.sprite.Sprite):def __init__(self,screen):# 這個精靈的初始化方法 必須調用pygame.sprite.Sprite.__init__(self)self.screen = screen# 傳入炸彈圖片self.image = pygame.image.load("./feiji/bomb-2.gif")# 炸彈矩形獲取self.rect = self.image.get_rect()# 炸彈速度self.speed = 2self.direciton = "left"# 炸彈初始坐標self.rect.topleft = [0,0]def auto_move(self):# 往左移動if self.direciton == "left":self.rect.left -= self.speedself.rect.bottom += self.speed# 往右移動elif self.direciton == "right":self.rect.right += self.speedself.rect.bottom += self.speed#左右移動邊界if self.rect.left <= 0:self.direciton = "right"elif self.rect.right >= Manager.bg_size[0]:self.direciton = "left"# 使敵方炸彈飛出窗口時消除該敵方飛機對象def kill_bomb(self):if self.rect.top > Manager.bg_size[1]:self.kill()def display(self):# 粘貼炸彈到窗口self.screen.blit(self.image, self.rect.topleft)def update(self):self.auto_move()self.display()self.kill_bomb()class Bomb(object):# 初始化爆炸def __init__(self, screen, type):self.screen = screenif type == 'enemy':# 加載爆炸資源self.mImages = [pygame.image.load("./feiji/enemy0_down" + str(v) + ".png") for v in range(1, 5)]else:# 加載爆炸資源self.mImages = [pygame.image.load("./feiji/hero_blowup_n" + str(v) + ".png") for v in range(1, 5)]self.mImages += self.mImages# 設置當前爆炸播放索引self.mIndex = 0# 爆炸位置self.mPos = [0, 0]# 是否可見self.mVisible = False# 設置位置def action(self, rect):# 觸發爆炸方法draw# 爆炸的坐標self.mPos[0] = rect.leftself.mPos[1] = rect.top# 打開爆炸的開關self.mVisible = True# 繪制爆炸def draw(self):if not self.mVisible:returnself.screen.blit(self.mImages[self.mIndex], (self.mPos[0], self.mPos[1]))self.mIndex += 1if self.mIndex >= len(self.mImages):# 如果下標已經到最后 代表爆炸結束# 下標重置 mVisible重置self.mIndex = 0self.mVisible = False# 地圖 class GameBackground(object):# 初始化地圖,傳入參數窗口跟地圖編號def __init__(self, screen,num):self.mImage1 = pygame.image.load("./feiji/img_bg_level_"+str(num)+".jpg")self.mImage2 = pygame.image.load("./feiji/img_bg_level_"+str(num)+".jpg")# 窗口self.screen = screen# 輔助移動地圖self.y1 = 0self.y2 = -Manager.bg_size[1] # -768# 移動地圖def move(self):self.y1 += 2self.y2 += 2if self.y1 >= Manager.bg_size[1]:self.y1 = 0if self.y2 >= 0:self.y2 = -Manager.bg_size[1]# 繪制地圖def draw(self):self.screen.blit(self.mImage1, (0, self.y1))self.screen.blit(self.mImage2, (0, self.y2))# 背景音樂類 class GameSound(pygame.sprite.Sprite):def __init__(self):#這個精靈的初始化方法必須調用pygame.sprite.Sprite.__init__(self)pygame.mixer.init() # 音樂模塊初始化pygame.mixer.music.load('./feiji/bg2.ogg') #載入背景音樂pygame.mixer.music.set_volume(0.5) # 聲音大小,0.5表示一半大小的聲音self.__bomb = pygame.mixer.Sound('./feiji/bomb.wav')# 背景音樂def playBackgroundMusic(self):pygame.mixer.music.play(-1) # 開始播放音樂,數字表示播放次數,-1表示循環播放# 爆炸音樂def playBombSound(self):self.__bomb.play()class Manager(object):#對應圖片的窗口大小bg_size = (512,768)#玩家生命數life_num = 3#生成敵方飛機的定時器create_enemy_id = 10#游戲結束定時器create_game_over_id = 11#游戲結束標志gameover = False#倒計時數over_time = 3#boss最大數量boss_num = 10# 是否存在bosshave_boss = False#初始化擊敗敵方飛機數defeat_num = 0def __init__(self):pygame.init()# 創建一個窗口self.screen = pygame.display.set_mode(Manager.bg_size)# 生成音樂對象self.gamesound = GameSound()# 己方飛機精靈組self.players = pygame.sprite.Group()# 敵方飛機精靈組self.enemyplayers = pygame.sprite.Group()# 敵方炸彈精靈組self.bombshells = pygame.sprite.Group()# 創建一個背景圖片self.background = pygame.image.load(r"./feiji/background.png")#創建一個可移動地圖 ,隨機取一種地圖,self.move_background_num = random.randint(1,5)self.move_background=GameBackground(self.screen,self.move_background_num)def player(self):# 調用一個飛機對象player = Player(self.screen)# 將該飛機對象增加到己方飛機精靈組中self.players.add(player)def enemyplayer(self):# 調用一個敵方飛機對象enemyplayer = Enemyplayer(self.screen,"./feiji/enemy0.png")# 將該飛機對象增加到己方飛機精靈組中self.enemyplayers.add(enemyplayer)#增加多個敵機對象def add_enemy(self):enemyplayer = Enemyplayer(self.screen,"./feiji/enemy0.png")enemyplayer.direciton_up = Truex = random.randint(0,Manager.bg_size[0])#敵機隨機出現enemyplayer.rect.topleft = (x,0)#如果敵機出現在窗口較左邊,則敵機優先向右飛行if x <= Manager.bg_size[0] / 2:enemyplayer.direciton = "right"#向敵機精靈組增加一個敵機精靈self.enemyplayers.add(enemyplayer)#判斷碰撞def judge_bomb(self,player_bomb,enemy_bomb):delete_sprite = Falseif Manager.life_num == 1:delete_sprite = True# 參1:碰撞對象1 ;參2:碰撞對象2 ;參3:判斷調出碰撞對象1還是2還是一起的爆炸圖片 ; 參3:是否刪除爆炸對象1def judge(x1,x2,who,delete1):# 判斷碰撞對象1(精靈組)與2(精靈組)的碰撞iscollide = pygame.sprite.groupcollide(x1, x2, delete1, True)if iscollide and (who == "player" or who == "both"):Manager.life_num -= 1if Manager.life_num == 0:# 游戲結束Manager.gameover = Truepygame.time.set_timer(Manager.create_game_over_id,1000)if iscollide:#取出爆炸對象1items = list(iscollide.items())[0]x = items[0]if who == "player":# 傳入爆炸位置,打開爆炸圖片輸出按鈕player_bomb.action(x.rect)elif who == "enemy":#x = items[1][0]# 傳入敵方爆炸圖片的位置enemy_bomb.action(x.rect)# 敵方爆炸擊敗數加1Manager.defeat_num += 1# 爆炸的聲音elif who == "both":# 傳入爆炸位置,打開爆炸圖片輸出按鈕player_bomb.action(x.rect)# 取出爆炸對象2y = items[1][0]# 傳入爆炸對象2的爆炸圖片的位置enemy_bomb.action(y.rect)# 敵方爆炸擊敗數加1Manager.defeat_num += 1# 爆炸刪除子彈精靈組# Enemyplayer.bullets.empty()#爆炸音樂self.gamesound.playBombSound()# 判斷玩家飛機(精靈組)與敵方子彈(精靈組)的碰撞judge(self.players, Enemyplayer.bullets, "player", delete_sprite)# 判斷玩家飛機(精靈組)與敵方炸彈(精靈組)的碰撞judge(self.players, self.bombshells, "player", delete_sprite)# 判斷敵方飛機(精靈組)與我方子彈(精靈組)的碰撞judge(self.enemyplayers, Player.bullets, "enemy", True)# 判斷玩家飛機(精靈組)與敵方飛機(精靈組)的碰撞judge(self.players, self.enemyplayers, "both", delete_sprite)#召喚bossdef add_boss(self):enemy_boss_player = Enemyplayer(self.screen,"./feiji/enemy1.png")enemy_boss_player.bullet_frequency *= 2enemy_boss_player.bullet_image ='./feiji/bullet2.png'self.enemyplayers.add(enemy_boss_player)# 繪制文字 rgb 紅綠藍 0 - 255# 參1要繪制的文字 參2 x軸坐標 參3y軸坐標 參4文字大小 參5 文字顏色 參6 背景顏色def drawText(self, text, x, y, textHeight = 30, fontColor = (255, 255, 255), backgroudColor = None):# 通過字體文件獲得字體對象 參數1 字體文件 參數2 字體大小font_obj = pygame.font.Font('./feiji/baddf.ttf', textHeight)# 1文字 2是否抗鋸齒 3文字顏色 4背景顏色text_obj = font_obj.render(text, True, fontColor, backgroudColor) # 配置要顯示的文字# 獲得要顯示的對象的recttext_rect = text_obj.get_rect()# 設置顯示對象的坐標text_rect.topleft = (x, y)# 繪制字 到指定區域 參1是文字對象 參2 矩形對象self.screen.blit(text_obj, text_rect)def show_over_text(self):# 游戲結束 倒計時后重新開始self.drawText('gameover %d' % Manager.over_time, 100, Manager.bg_size[1] / 2,textHeight=50, fontColor=[255, 0, 0])#顯示擊敗敵機數def show_defeatnum_text(self):# 顯示擊敗敵機數self.drawText('擊敗敵機數: %d' % Manager.defeat_num, Manager.bg_size[0]-150, 0,textHeight=20, fontColor=[255, 0, 0])# 顯示剩余生命數self.drawText('剩余生命數: %d' % Manager.life_num, Manager.bg_size[0] - 150, 20,textHeight=20, fontColor=[255, 0, 0])def game_over(self):# 結束后倒計時Manager.over_time -= 1self.show_over_text()if Manager.over_time == 0:# 倒計時結束后游戲重新開始,相應變量返回初始化Manager.over_time = 3Manager.gameover = Falseself.game_start()def game_start(self):# 重新開始游戲,有些類屬性要清空# 擊敗敵機數回 0Manager.defeat_num = 0# 生命數數回 3Manager.life_num = 3#boss按鈕恢復Manager.have_boss = False#清空飛機類屬性的子彈精靈組Player.bullets.empty()# 清空敵方飛機類屬性的子彈精靈組Enemyplayer.bullets.empty()#重新運行游戲manager = Manager()manager.main()def main(self):# 播放背景音樂self.gamesound.playBackgroundMusic()# 增加一個己方飛機對象self.player()# 增加一個敵方飛機對象self.enemyplayer()# 開啟生成敵方飛機定時器pygame.time.set_timer(Manager.create_enemy_id, 2000)# 初始化一個己方飛機爆炸對象player_bomb = Bomb(self.screen, 'player')# 初始化一個敵機爆炸的對象enemy_bomb = Bomb(self.screen, 'enemy')while True:# 調用地圖移動方法self.move_background.move()# 向窗口不斷添加背景圖self.move_background.draw()# 窗口顯示擊敗敵機數self.show_defeatnum_text()# 擊敗敵機數50時,召喚bossif Manager.defeat_num == 10 and Manager.have_boss == False:self.add_boss()Manager.have_boss = True# 隨機增加炸彈,平均每十秒增加一個炸彈if random.randint(0, 1000) == 1:bombshell = Bombshell(self.screen)# 在窗口最上方左右之間隨機出現bombshell.rect.topleft = (random.randint(0, Manager.bg_size[0]), -103)self.bombshells.add(bombshell)# 對應飛機類里的update方法self.players.update()self.enemyplayers.update()# 不斷顯示敵方子彈,此為類方法Enemyplayer.bullets.update()# 顯示炸彈self.bombshells.update()#調用爆炸對象調出爆炸圖片player_bomb.draw()enemy_bomb.draw()if self.players.sprites():#調用判斷碰撞方法self.judge_bomb(player_bomb,enemy_bomb)#游戲結束播放倒計時文字if Manager.gameover:self.show_over_text()# 不斷更新窗口pygame.display.update()# 遍歷所有的事件、for event in pygame.event.get():# 判斷事件類型如果是pygame的退出if event.type == QUIT:# 執行pygame退出pygame.quit()# python程序的退出exit()elif event.type == Manager.create_enemy_id:# 創建一個敵機self.add_enemy()elif event.type == Manager.create_game_over_id:if Manager.gameover:#游戲結束self.game_over()time.sleep(0.01)if __name__ == "__main__":manager = Manager()manager.main()

三、運行結果:

注:需要全部圖片文件以及代碼加我微信(備注來意):gjwtxp

總結

以上是生活随笔為你收集整理的python飞机大战源码以及素材资源的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。