著作權宣告:原創不易,本文禁止抄襲、轉載,侵權必究!
一、開發環境
開發環境 :Windows10 Python3.6.4
第三方庫 :Pygame1.9.6
IDE :PyCharm/Sublime Text
二、功能模塊
素材模塊
游戲圖片素材:

BGM及音效素材:

字體素材:

原始碼模塊
子彈模塊:
普通子彈部分原始碼:
def __init__(self, position): super().__init__() self.image = pygame.image.load("images/bullet1.png").convert_alpha() self.rect = self.image.get_rect() self.rect.left, self.rect.top = position self.speed = 12 self.active = False self.mask = pygame.mask.from_surface(self.image) def move(self): self.rect.top -= self.speed if self.rect.top < 0: self.active = False
超級子彈部分原始碼:
def __init__(self, position): super().__init__() self.image = pygame.image.load("images/bullet2.png").convert_alpha() self.rect = self.image.get_rect() self.rect.left, self.rect.top = position self.speed = 18 self.active = False self.mask = pygame.mask.from_surface(self.image) def move(self): self.rect.top -= self.speed if self.rect.top < 0: self.active = False
敵機子彈部分原始碼:
def __init__(self, speed, position): super().__init__() self.image = pygame.image.load("images/bullet1.png").convert_alpha() self.rect = self.image.get_rect() self.rect.left, self.rect.top = position self.speed = speed self.active = False self.mask = pygame.mask.from_surface(self.image)
敵機模塊:
小型敵機部分原始碼:
class SmallEnemy(Enemy): def __init__(self, bg_size): super().__init__("images/enemy1.png", 2, bg_size) # 小型敵機毀滅圖片切換 self.destroy_images = [] self.destroy_images.extend([pygame.image.load("images/enemy1_down1.png").convert_alpha(), pygame.image.load("images/enemy1_down2.png").convert_alpha(), pygame.image.load("images/enemy1_down3.png").convert_alpha(), pygame.image.load("images/enemy1_down4.png").convert_alpha()]) # 設定敵機原始位置 self.rect.left, self.rect.top = randint(0, self.width - self.rect.width), randint(-5 * self.height, 0) # 表明敵機目前的狀態(為True表明敵機生存,反之為碰撞時毀滅,之后播放毀滅畫面,重新呼叫reset方法,將敵機設定到初始位置) self.active = True # 回傳英雄除了空白區域的部分 self.mask = pygame.mask.from_surface(self.image)
中型敵機部分原始碼:
class MidEnemy(Enemy): # 中型敵機打擊次數 energy = 8 def __init__(self, bg_size): super().__init__("images/enemy2.png", 1, bg_size) # 中型敵機毀滅圖片切換 self.destroy_images = [] self.destroy_images.extend([pygame.image.load("images/enemy2_down1.png").convert_alpha(), pygame.image.load("images/enemy2_down2.png").convert_alpha(), pygame.image.load("images/enemy2_down3.png").convert_alpha(), pygame.image.load("images/enemy2_down4.png").convert_alpha()]) # 子彈打擊時效果圖片 self.image_hit = pygame.image.load("images/enemy2_hit.png").convert_alpha() # 設定敵機原始位置 # self.width, self.height = bg_size[0], bg_size[1] self.rect.left, self.rect.top = randint(0, self.width - self.rect.width), randint(-10 * self.height, -self.height) self.active = True # 回傳英雄除了空白區域的部分 self.mask = pygame.mask.from_surface(self.image) # 擊打次數屬性 self.energy = MidEnemy.energy # 是否擊中屬性 self.hit = False
我方戰機模塊部分原始碼:
class MyPlane(pygame.sprite.Sprite): def __init__(self, bg_size): super().__init__() # 獲取英雄圖片(兩幅圖片實作動態效果) self.image1 = pygame.image.load("images/me1.png").convert_alpha() self.image2 = pygame.image.load("images/me2.png").convert_alpha() # 英雄毀滅圖片切換 self.destroy_images = [] self.destroy_images.extend([pygame.image.load("images/me_destroy_1.png").convert_alpha(), pygame.image.load("images/me_destroy_2.png").convert_alpha(), pygame.image.load("images/me_destroy_3.png").convert_alpha(), pygame.image.load("images/me_destroy_4.png").convert_alpha()]) # 獲取英雄大小,寬度和高度 self.rect = self.image1.get_rect() # 設定英雄位置 self.width, self.height = bg_size[0], bg_size[1] self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, self.height - self.rect.height - 60 # 設定英雄速度 self.speed = 10 # 設定英雄生存狀態 self.active = True # 設定飛機無敵 self.invincible = False # 回傳英雄除了空白區域的部分 self.mask = pygame.mask.from_surface(self.image1)
技能模塊部分原始碼:
class BulletSupply(pygame.sprite.Sprite): def __init__(self, bgsize): super().__init__() self.image = pygame.image.load("images/bullet_supply.png").convert_alpha() self.rect = self.image.get_rect() self.width, self.height = bgsize[0], bgsize[1] self.rect.left, self.rect.bottom = randint(0, self.width - self.rect.width), -100 self.speed = 5 self.active = False self.mask = pygame.mask.from_surface(self.image) def move(self): if self.rect.top < self.height: self.rect.top += self.speed else: self.active = False def reset(self): self.active = True self.rect.left, self.rect.bottom = randint(0, self.width - self.rect.width), -100
主模塊
游戲初始化部分原始碼:
def __init__(self): # 1.變數定義 self.__variate__define() # 2.pygame和音樂初始化 pygame.init() pygame.mixer.init() # 3.創建游戲視窗 self.screen = pygame.display.set_mode(self.bg_size) pygame.display.set_caption("飛機大戰") # 4.獲取背景圖片 self.background = pygame.image.load("images/background.png").convert() # 5.創建游戲時鐘 self.clock = pygame.time.Clock() # 6.載入音樂模塊 pygame.mixer.music.load("sound/game_music.ogg") pygame.mixer.music.set_volume(0.2) # 設定音量 self.bullet_sound = pygame.mixer.Sound("sound/bullet.wav") self.bullet_sound.set_volume(0.2) self.bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav") self.bomb_sound.set_volume(0.2)
控制英雄飛機:
def __keypress_hanlder(self): """檢測用戶的鍵盤操作,控制英雄飛機""" key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: self.hero.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: self.hero.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: self.hero.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: self.hero.moveRight()
創建敵機原始碼:
def add_small_enemy(self, group1, group2, num): """創建小型敵機物件,num為物件個數,將其添加到精靈組中""" for i in range(num): e1 = enemy_plane.SmallEnemy(self.bg_size) group1.add(e1) group2.add(e1) def add_mid_enemy(self, group1, group2, num): """創建中型敵機物件""" for i in range(num): e1 = enemy_plane.MidEnemy(self.bg_size) group1.add(e1) group2.add(e1) def add_big_enemy(self, group1, group2, num): """創建大型敵機物件""" for i in range(num): e1 = enemy_plane.BigEnemy(self.bg_size) group1.add(e1) group2.add(e1)
子彈生成部分原始碼:
def __create_bullet(self): # 生成普通子彈 self.bullet1 = [] self.bullet1_index = 0 self.BULLET_NUM = 4 for i in range(self.BULLET_NUM): self.bullet1.append(bullet.Bullet1(self.hero.rect.midtop))
定義游戲難度部分原始碼:
def __create_start_image(self): # 定義難度屬性 self.easy = True self.common = False self.difficult = False # 飛機大戰主題 self.start = False self.theme_font = pygame.font.Font("font/font.ttf", 50) self.theme_text = self.theme_font.render("Plane War", True, self.WHILE) self.theme_text_rect = self.theme_text.get_rect() self.theme_text_rect.left, self.theme_text_rect.top = (120, 40) # 游戲開始字體 self.start_font = pygame.font.Font("font/font.ttf", 40) self.start_text = self.start_font.render("Start Game", True, self.WHILE) self.start_text_rect = self.start_text.get_rect() self.start_text_rect.left, self.start_text_rect.top = (150, 200) # 簡單字體 self.easy_font = pygame.font.Font("font/font.ttf", 40) self.easy_text = self.easy_font.render("easy", True, self.BLACK) self.easy_text_rect = self.easy_text.get_rect() self.easy_text_rect.left, self.easy_text_rect.top = (200, 400) # 一般字體 self.common_font = pygame.font.Font("font/font.ttf", 40) self.common_text = self.common_font.render("common", True, self.WHILE) self.common_text_rect = self.common_text.get_rect() self.common_text_rect.left, self.common_text_rect.top = (180, 450) # 困難字體 self.difficult_font = pygame.font.Font("font/font.ttf", 40) self.difficult_text = self.difficult_font.render("difficult", True, self.WHILE) self.difficult_text_rect = self.difficult_text.get_rect() self.difficult_text_rect.left, self.difficult_text_rect.top = (180, 510)
三、游戲效果
游戲開始效果:

游戲戰斗效果:

游戲結束效果:

游戲UI界面優化:可以使用游戲引擎pygame-menu進行優化
課后作業:游戲動態地圖實作
四、完整原始碼下載
關注我的原創公眾號【小鴻星空科技】,回復【飛機大戰】關鍵詞獲取完整原始碼及素材!
五、作者Info
Author:南柯樹下,Goal:讓編程更有趣!
原創微信公眾號:『小鴻星空科技』,專注于演算法、爬蟲,網站,游戲開發,資料分析、自然語言處理,AI等,期待你的關注,讓我們一起成長、一起Coding!
著作權宣告:本文禁止抄襲、轉載 ,侵權必究!
—— —— —— —— — END —— —— —— —— ————
歡迎掃碼關注我的公眾號
小鴻星空科技

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/539342.html
標籤:其他
上一篇:力扣12 數字轉為羅馬數字
