版權(quán)聲明:原創(chuàng)不易,本文禁止抄襲、轉(zhuǎn)載,侵權(quán)必究!
一、開發(fā)環(huán)境
開發(fā)環(huán)境 :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
敵機(jī)子彈部分源碼:
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)
敵機(jī)模塊:
小型敵機(jī)部分源碼:
class SmallEnemy(Enemy):
def __init__(self, bg_size):
super().__init__("images/enemy1.png", 2, bg_size)
# 小型敵機(jī)毀滅圖片切換
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()])
# 設(shè)置敵機(jī)原始位置
self.rect.left, self.rect.top = randint(0, self.width - self.rect.width), randint(-5 * self.height, 0)
# 表明敵機(jī)目前的狀態(tài)(為True表明敵機(jī)生存,反之為碰撞時毀滅,之后播放毀滅畫面,重新調(diào)用reset方法,將敵機(jī)設(shè)置到初始位置)
self.active = True
# 返回英雄除了空白區(qū)域的部分
self.mask = pygame.mask.from_surface(self.image)
中型敵機(jī)部分源碼:
class MidEnemy(Enemy):
# 中型敵機(jī)打擊次數(shù)
energy = 8
def __init__(self, bg_size):
super().__init__("images/enemy2.png", 1, bg_size)
# 中型敵機(jī)毀滅圖片切換
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()
# 設(shè)置敵機(jī)原始位置
# 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
# 返回英雄除了空白區(qū)域的部分
self.mask = pygame.mask.from_surface(self.image)
# 擊打次數(shù)屬性
self.energy = MidEnemy.energy
# 是否擊中屬性
self.hit = False
我方戰(zhàn)機(jī)模塊部分源碼:
class MyPlane(pygame.sprite.Sprite):
def __init__(self, bg_size):
super().__init__()
# 獲取英雄圖片(兩幅圖片實(shí)現(xiàn)動態(tài)效果)
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()
# 設(shè)置英雄位置
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
# 設(shè)置英雄速度
self.speed = 10
# 設(shè)置英雄生存狀態(tài)
self.active = True
# 設(shè)置飛機(jī)無敵
self.invincible = False
# 返回英雄除了空白區(qū)域的部分
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.創(chuàng)建游戲窗口
self.screen = pygame.display.set_mode(self.bg_size)
pygame.display.set_caption("飛機(jī)大戰(zhàn)")
# 4.獲取背景圖片
self.background = pygame.image.load("images/background.png").convert()
# 5.創(chuàng)建游戲時鐘
self.clock = pygame.time.Clock()
# 6.載入音樂模塊
pygame.mixer.music.load("sound/game_music.ogg")
pygame.mixer.music.set_volume(0.2) # 設(shè)置音量
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)
控制英雄飛機(jī):
def __keypress_hanlder(self):
"""檢測用戶的鍵盤操作,控制英雄飛機(jī)"""
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()
創(chuàng)建敵機(jī)源碼:
def add_small_enemy(self, group1, group2, num):
"""創(chuàng)建小型敵機(jī)對象,num為對象個數(shù),將其添加到精靈組中"""
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):
"""創(chuàng)建中型敵機(jī)對象"""
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):
"""創(chuàng)建大型敵機(jī)對象"""
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
# 飛機(jī)大戰(zhàn)主題
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)
三、游戲效果
游戲開始效果:
游戲戰(zhàn)斗效果:
游戲結(jié)束效果:
四、完整項(xiàng)目下載
點(diǎn)我下載
文章來源:http://www.zghlxwxcb.cn/news/detail-514288.html
五、作者Info
Author:小鴻的摸魚日常,Goal:讓編程更有趣!
專注于算法、爬蟲,網(wǎng)站,游戲開發(fā),數(shù)據(jù)分析、自然語言處理,AI等,期待你的關(guān)注,讓我們一起成長、一起Coding!
版權(quán)說明:本文禁止抄襲、轉(zhuǎn)載 ,侵權(quán)必究!文章來源地址http://www.zghlxwxcb.cn/news/detail-514288.html
到了這里,關(guān)于Python3+pygame實(shí)現(xiàn)有趣好玩的飛機(jī)大戰(zhàn)游戲(附源碼及素材)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!