python飞机大战源码以及素材资源
生活随笔
收集整理的這篇文章主要介紹了
python飞机大战源码以及素材资源
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、實(shí)現(xiàn)功能包括:多架敵機(jī)隨機(jī)出現(xiàn),生命數(shù)3,死亡時(shí)倒計(jì)時(shí)后重新開(kāi)局,炸彈隨機(jī)降落,統(tǒng)計(jì)擊敗敵機(jī)數(shù),三張地圖每局隨機(jī)出現(xiàn),擊敗敵機(jī)數(shù)達(dá)到10時(shí)出現(xiàn)大飛機(jī),大飛機(jī)發(fā)射子彈更密集等。
二、pycharm源碼文件以及圖片素材資源已在主頁(yè)上傳,代碼以及運(yùn)行結(jié)果如下:
import time import random from PIL import Imageimport pygame from pygame.constants import *#己方飛機(jī)類(lèi) class Player(pygame.sprite.Sprite):# 存放所有飛機(jī)的子彈的組bullets = pygame.sprite.Group()def __init__(self,screen):# 這個(gè)精靈的初始化方法 必須調(diào)用pygame.sprite.Sprite.__init__(self)# 創(chuàng)建一個(gè)玩家飛機(jī)圖片,當(dāng)做真正的飛機(jī)self.image = pygame.image.load("./feiji/hero1.png")#通過(guò)圖片獲得矩陣self.rect = self.image.get_rect() # rect:矩形# 定義飛機(jī)初始化坐標(biāo)self.rect.topleft = [Manager.bg_size[0] / 2 - 100 / 2,600]# 飛機(jī)速度self.speed = 10#記錄當(dāng)前窗口對(duì)象self.screen = screen#子彈圖片self.bullet_image = "./feiji/bullet.png"# 飛機(jī)子彈頻率 1~100,表示每0.01秒百分之幾的概率發(fā)射self.bullet_frequency = 10def key_control(self):# 監(jiān)聽(tīng)鍵盤(pán)事件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]:# 定義飛機(jī)左行駛盡頭邊界if self.rect.left >= 10 :self.rect.left -= self.speedif key_pressed[K_d] or key_pressed[K_RIGHT]:#定義飛機(jī)右行駛盡頭邊界if self.rect.right <= Manager.bg_size[0]:self.rect.right += self.speedif key_pressed[K_SPACE]:# 隨機(jī)發(fā)射子彈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)#鍵盤(pán)監(jiān)聽(tīng)控制飛機(jī),飛機(jī)的顯示def update(self):self.key_control()self.display()def display(self):# 粘貼飛機(jī)坐標(biāo)self.screen.blit(self.image, self.rect)#更新子彈坐標(biāo)for i in Player.bullets:i.player_fire()# 對(duì)應(yīng)子彈的update方法Player.bullets.update()# 把所有子彈全部添加到屏幕Player.bullets.draw(self.screen)#敵方飛機(jī)類(lèi) class Enemyplayer(pygame.sprite.Sprite):# 放子彈的列表,類(lèi)屬性,通過(guò)類(lèi)名調(diào)用bullets = pygame.sprite.Group()def __init__(self,screen,image ):# 這個(gè)精靈的初始化方法 必須調(diào)用pygame.sprite.Sprite.__init__(self)#記錄窗口self.screen = screen#獲取敵方飛機(jī)圖片self.image = pygame.image.load(image)#通過(guò)圖片獲得矩陣self.rect = self.image.get_rect()#敵方飛機(jī)坐標(biāo)初始化self.rect.topleft = [Manager.bg_size[0]/2 - 50/2,0]# 放子彈的列表,類(lèi)屬性,通過(guò)類(lèi)名調(diào)用self.bullets = pygame.sprite.Group()# 子彈圖片self.bullet_image = "./feiji/bullet1.png"#敵方飛機(jī)子彈頻率 1~100,平均一秒發(fā)射幾個(gè)self.bullet_frequency = 3#敵機(jī)移動(dòng)方向self.direciton= "left"#飛機(jī)是否向下移動(dòng)self.direciton_up = False#敵機(jī)速度self.speed = 4def display(self):#粘貼敵機(jī)到窗口self.screen.blit(self.image,self.rect.topleft)#敵方飛機(jī)自動(dòng)開(kāi)火方法def auto_fire(self):#控制敵方子彈頻率if random.randint(1, 100) in range(0,self.bullet_frequency):#通過(guò)飛機(jī)坐標(biāo)跟子彈分辨率大小調(diào)用子彈對(duì)象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子彈對(duì)象列表增加一個(gè)子彈對(duì)象Enemyplayer.bullets.add(bullet)#敵方飛機(jī)自動(dòng)飛行方法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"#使敵方飛機(jī)飛出窗口時(shí)消除該敵方飛機(jī)對(duì)象def kill_enemy(self):if self.rect.top > Manager.bg_size[1]:self.kill()#敵方飛機(jī)自動(dòng)移動(dòng),自動(dòng)發(fā)射以及顯示def update(self):self.auto_move()self.auto_fire()self.display()self.kill_enemy()#子彈類(lèi) class Bullet(pygame.sprite.Sprite):def __init__(self,screen,x,y):# 這個(gè)精靈的初始化方法 必須調(diào)用pygame.sprite.Sprite.__init__(self)self.screen = screenself.image = pygame.image.load("./feiji/bullet.png")#通過(guò)圖片獲得矩陣self.rect = self.image.get_rect()# 初始化子彈坐標(biāo)self.rect.topleft = [x , y ]#子彈速度self.speed = 8#己方飛機(jī)開(kāi)火def player_fire(self):self.rect.top -= self.speed+4#敵方飛機(jī)開(kāi)火def enemy_fire(self):self.rect.bottom += self.speed/2def update(self):# 如果子彈移出屏幕上方 則銷(xiāo)毀子彈對(duì)象if self.rect.top > Manager.bg_size[1] or self.rect.bottom < 0 :self.kill()self.enemy_fire()# 把所有子彈全部添加到屏幕Enemyplayer.bullets.draw(self.screen)# 炸彈類(lèi) class Bombshell(pygame.sprite.Sprite):def __init__(self,screen):# 這個(gè)精靈的初始化方法 必須調(diào)用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"# 炸彈初始坐標(biāo)self.rect.topleft = [0,0]def auto_move(self):# 往左移動(dòng)if self.direciton == "left":self.rect.left -= self.speedself.rect.bottom += self.speed# 往右移動(dòng)elif self.direciton == "right":self.rect.right += self.speedself.rect.bottom += self.speed#左右移動(dòng)邊界if self.rect.left <= 0:self.direciton = "right"elif self.rect.right >= Manager.bg_size[0]:self.direciton = "left"# 使敵方炸彈飛出窗口時(shí)消除該敵方飛機(jī)對(duì)象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# 設(shè)置當(dāng)前爆炸播放索引self.mIndex = 0# 爆炸位置self.mPos = [0, 0]# 是否可見(jiàn)self.mVisible = False# 設(shè)置位置def action(self, rect):# 觸發(fā)爆炸方法draw# 爆炸的坐標(biāo)self.mPos[0] = rect.leftself.mPos[1] = rect.top# 打開(kāi)爆炸的開(kāi)關(guān)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):# 如果下標(biāo)已經(jīng)到最后 代表爆炸結(jié)束# 下標(biāo)重置 mVisible重置self.mIndex = 0self.mVisible = False# 地圖 class GameBackground(object):# 初始化地圖,傳入?yún)?shù)窗口跟地圖編號(hào)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# 輔助移動(dòng)地圖self.y1 = 0self.y2 = -Manager.bg_size[1] # -768# 移動(dòng)地圖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))# 背景音樂(lè)類(lèi) class GameSound(pygame.sprite.Sprite):def __init__(self):#這個(gè)精靈的初始化方法必須調(diào)用pygame.sprite.Sprite.__init__(self)pygame.mixer.init() # 音樂(lè)模塊初始化pygame.mixer.music.load('./feiji/bg2.ogg') #載入背景音樂(lè)pygame.mixer.music.set_volume(0.5) # 聲音大小,0.5表示一半大小的聲音self.__bomb = pygame.mixer.Sound('./feiji/bomb.wav')# 背景音樂(lè)def playBackgroundMusic(self):pygame.mixer.music.play(-1) # 開(kāi)始播放音樂(lè),數(shù)字表示播放次數(shù),-1表示循環(huán)播放# 爆炸音樂(lè)def playBombSound(self):self.__bomb.play()class Manager(object):#對(duì)應(yīng)圖片的窗口大小bg_size = (512,768)#玩家生命數(shù)life_num = 3#生成敵方飛機(jī)的定時(shí)器create_enemy_id = 10#游戲結(jié)束定時(shí)器create_game_over_id = 11#游戲結(jié)束標(biāo)志gameover = False#倒計(jì)時(shí)數(shù)over_time = 3#boss最大數(shù)量boss_num = 10# 是否存在bosshave_boss = False#初始化擊敗敵方飛機(jī)數(shù)defeat_num = 0def __init__(self):pygame.init()# 創(chuàng)建一個(gè)窗口self.screen = pygame.display.set_mode(Manager.bg_size)# 生成音樂(lè)對(duì)象self.gamesound = GameSound()# 己方飛機(jī)精靈組self.players = pygame.sprite.Group()# 敵方飛機(jī)精靈組self.enemyplayers = pygame.sprite.Group()# 敵方炸彈精靈組self.bombshells = pygame.sprite.Group()# 創(chuàng)建一個(gè)背景圖片self.background = pygame.image.load(r"./feiji/background.png")#創(chuàng)建一個(gè)可移動(dòng)地圖 ,隨機(jī)取一種地圖,self.move_background_num = random.randint(1,5)self.move_background=GameBackground(self.screen,self.move_background_num)def player(self):# 調(diào)用一個(gè)飛機(jī)對(duì)象player = Player(self.screen)# 將該飛機(jī)對(duì)象增加到己方飛機(jī)精靈組中self.players.add(player)def enemyplayer(self):# 調(diào)用一個(gè)敵方飛機(jī)對(duì)象enemyplayer = Enemyplayer(self.screen,"./feiji/enemy0.png")# 將該飛機(jī)對(duì)象增加到己方飛機(jī)精靈組中self.enemyplayers.add(enemyplayer)#增加多個(gè)敵機(jī)對(duì)象def add_enemy(self):enemyplayer = Enemyplayer(self.screen,"./feiji/enemy0.png")enemyplayer.direciton_up = Truex = random.randint(0,Manager.bg_size[0])#敵機(jī)隨機(jī)出現(xiàn)enemyplayer.rect.topleft = (x,0)#如果敵機(jī)出現(xiàn)在窗口較左邊,則敵機(jī)優(yōu)先向右飛行if x <= Manager.bg_size[0] / 2:enemyplayer.direciton = "right"#向敵機(jī)精靈組增加一個(gè)敵機(jī)精靈self.enemyplayers.add(enemyplayer)#判斷碰撞def judge_bomb(self,player_bomb,enemy_bomb):delete_sprite = Falseif Manager.life_num == 1:delete_sprite = True# 參1:碰撞對(duì)象1 ;參2:碰撞對(duì)象2 ;參3:判斷調(diào)出碰撞對(duì)象1還是2還是一起的爆炸圖片 ; 參3:是否刪除爆炸對(duì)象1def judge(x1,x2,who,delete1):# 判斷碰撞對(duì)象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:# 游戲結(jié)束Manager.gameover = Truepygame.time.set_timer(Manager.create_game_over_id,1000)if iscollide:#取出爆炸對(duì)象1items = list(iscollide.items())[0]x = items[0]if who == "player":# 傳入爆炸位置,打開(kāi)爆炸圖片輸出按鈕player_bomb.action(x.rect)elif who == "enemy":#x = items[1][0]# 傳入敵方爆炸圖片的位置enemy_bomb.action(x.rect)# 敵方爆炸擊敗數(shù)加1Manager.defeat_num += 1# 爆炸的聲音elif who == "both":# 傳入爆炸位置,打開(kāi)爆炸圖片輸出按鈕player_bomb.action(x.rect)# 取出爆炸對(duì)象2y = items[1][0]# 傳入爆炸對(duì)象2的爆炸圖片的位置enemy_bomb.action(y.rect)# 敵方爆炸擊敗數(shù)加1Manager.defeat_num += 1# 爆炸刪除子彈精靈組# Enemyplayer.bullets.empty()#爆炸音樂(lè)self.gamesound.playBombSound()# 判斷玩家飛機(jī)(精靈組)與敵方子彈(精靈組)的碰撞judge(self.players, Enemyplayer.bullets, "player", delete_sprite)# 判斷玩家飛機(jī)(精靈組)與敵方炸彈(精靈組)的碰撞judge(self.players, self.bombshells, "player", delete_sprite)# 判斷敵方飛機(jī)(精靈組)與我方子彈(精靈組)的碰撞judge(self.enemyplayers, Player.bullets, "enemy", True)# 判斷玩家飛機(jī)(精靈組)與敵方飛機(jī)(精靈組)的碰撞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 紅綠藍(lán) 0 - 255# 參1要繪制的文字 參2 x軸坐標(biāo) 參3y軸坐標(biāo) 參4文字大小 參5 文字顏色 參6 背景顏色def drawText(self, text, x, y, textHeight = 30, fontColor = (255, 255, 255), backgroudColor = None):# 通過(guò)字體文件獲得字體對(duì)象 參數(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) # 配置要顯示的文字# 獲得要顯示的對(duì)象的recttext_rect = text_obj.get_rect()# 設(shè)置顯示對(duì)象的坐標(biāo)text_rect.topleft = (x, y)# 繪制字 到指定區(qū)域 參1是文字對(duì)象 參2 矩形對(duì)象self.screen.blit(text_obj, text_rect)def show_over_text(self):# 游戲結(jié)束 倒計(jì)時(shí)后重新開(kāi)始self.drawText('gameover %d' % Manager.over_time, 100, Manager.bg_size[1] / 2,textHeight=50, fontColor=[255, 0, 0])#顯示擊敗敵機(jī)數(shù)def show_defeatnum_text(self):# 顯示擊敗敵機(jī)數(shù)self.drawText('擊敗敵機(jī)數(shù): %d' % Manager.defeat_num, Manager.bg_size[0]-150, 0,textHeight=20, fontColor=[255, 0, 0])# 顯示剩余生命數(shù)self.drawText('剩余生命數(shù): %d' % Manager.life_num, Manager.bg_size[0] - 150, 20,textHeight=20, fontColor=[255, 0, 0])def game_over(self):# 結(jié)束后倒計(jì)時(shí)Manager.over_time -= 1self.show_over_text()if Manager.over_time == 0:# 倒計(jì)時(shí)結(jié)束后游戲重新開(kāi)始,相應(yīng)變量返回初始化Manager.over_time = 3Manager.gameover = Falseself.game_start()def game_start(self):# 重新開(kāi)始游戲,有些類(lèi)屬性要清空# 擊敗敵機(jī)數(shù)回 0Manager.defeat_num = 0# 生命數(shù)數(shù)回 3Manager.life_num = 3#boss按鈕恢復(fù)Manager.have_boss = False#清空飛機(jī)類(lèi)屬性的子彈精靈組Player.bullets.empty()# 清空敵方飛機(jī)類(lèi)屬性的子彈精靈組Enemyplayer.bullets.empty()#重新運(yùn)行游戲manager = Manager()manager.main()def main(self):# 播放背景音樂(lè)self.gamesound.playBackgroundMusic()# 增加一個(gè)己方飛機(jī)對(duì)象self.player()# 增加一個(gè)敵方飛機(jī)對(duì)象self.enemyplayer()# 開(kāi)啟生成敵方飛機(jī)定時(shí)器pygame.time.set_timer(Manager.create_enemy_id, 2000)# 初始化一個(gè)己方飛機(jī)爆炸對(duì)象player_bomb = Bomb(self.screen, 'player')# 初始化一個(gè)敵機(jī)爆炸的對(duì)象enemy_bomb = Bomb(self.screen, 'enemy')while True:# 調(diào)用地圖移動(dòng)方法self.move_background.move()# 向窗口不斷添加背景圖self.move_background.draw()# 窗口顯示擊敗敵機(jī)數(shù)self.show_defeatnum_text()# 擊敗敵機(jī)數(shù)50時(shí),召喚bossif Manager.defeat_num == 10 and Manager.have_boss == False:self.add_boss()Manager.have_boss = True# 隨機(jī)增加炸彈,平均每十秒增加一個(gè)炸彈if random.randint(0, 1000) == 1:bombshell = Bombshell(self.screen)# 在窗口最上方左右之間隨機(jī)出現(xiàn)bombshell.rect.topleft = (random.randint(0, Manager.bg_size[0]), -103)self.bombshells.add(bombshell)# 對(duì)應(yīng)飛機(jī)類(lèi)里的update方法self.players.update()self.enemyplayers.update()# 不斷顯示敵方子彈,此為類(lèi)方法Enemyplayer.bullets.update()# 顯示炸彈self.bombshells.update()#調(diào)用爆炸對(duì)象調(diào)出爆炸圖片player_bomb.draw()enemy_bomb.draw()if self.players.sprites():#調(diào)用判斷碰撞方法self.judge_bomb(player_bomb,enemy_bomb)#游戲結(jié)束播放倒計(jì)時(shí)文字if Manager.gameover:self.show_over_text()# 不斷更新窗口pygame.display.update()# 遍歷所有的事件、for event in pygame.event.get():# 判斷事件類(lèi)型如果是pygame的退出if event.type == QUIT:# 執(zhí)行pygame退出pygame.quit()# python程序的退出exit()elif event.type == Manager.create_enemy_id:# 創(chuàng)建一個(gè)敵機(jī)self.add_enemy()elif event.type == Manager.create_game_over_id:if Manager.gameover:#游戲結(jié)束self.game_over()time.sleep(0.01)if __name__ == "__main__":manager = Manager()manager.main()三、運(yùn)行結(jié)果:
注:需要全部圖片文件以及代碼加我微信(備注來(lái)意):gjwtxp
總結(jié)
以上是生活随笔為你收集整理的python飞机大战源码以及素材资源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 入职新的工作
- 下一篇: python如何让输出数据对齐、int类