Python项目:飞机大战

概述

游戏元素:
1.背景
2.我方飞机
3.敌方飞机
4.子弹
5.游戏结束界面
6.游戏主窗口
7.飞机爆炸
8.音效

流程图

在这里插入图片描述
音效准备:

import pygame
import sys

pygame.init()
pygame.mixer.init()

#游戏背景音乐
#back_sound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\game_music.wav')
#back_sound.set_volume(0.05)
pygame.mixer.music.load('D:\\飞机大战素材\\sound\\game_music.wav')  #不知道什么原因当背景音乐和飞机爆炸音效都用sound,则放在前面的播放后面的不会播放
pygame.mixer.music..set_volume(0.05)
#子弹发射音乐
bullet_sound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\bullet.wav')
bullet_sound.set_volume(0.05)
#敌机死亡音乐
enemy_downsound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\enemy1_down.wav')
enemy_downsound.set_volume(0.05)
#游戏结束音乐
gameover_sound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\game_over.wav')
gameover_sound.set_volume(0.05)
#飞机死亡音乐
plane_sound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\use_bomb.wav')
plane_sound.set_volume(0.05)

窗口准备:

from 音效 import *

pygame.init()
size = width , height = 480 , 800       #设置游戏屏幕大小
screen = pygame.display.set_mode(size)
pygame.display.set_caption('飞机大战')
back = pygame.image.load('D:\\飞机大战素材\\background.png')

def main():
    while 1:
        back_sound.play(-1,)
        for event in pygame.event.get():
            if event.type == 12:
                sys.exit()
        screen.blit(back,(0,0))
        pygame.display.flip()
if __name__ == '__main__':
    main()


注意:若不写if __name__ == '__main__': main()语句,那么程序将会闪退,去掉def main()才会正常,注意是双下划线
子弹准备:

import pygame
class Bullet(pygame.sprite.Sprite):
    def __init__(self,position):
        pygame.sprite.Sprite.__init__(self)
        #子弹图片
        self.bullet_image = pygame.image.load('D:\\飞机大战素材\\bullet1.png')
        self.bullet_rect = self.bullet_image.get_rect()
        self.bullet_rect.top,self.bullet_rect.left = position
        self.speed = 20
        self.life = True
        # 子弹碰撞检测
        self.mask = pygame.mask.from_surface(self.bullet_image)
        #子弹删除
    def del_bullet(self):
        self.kill()

        #子弹移动
    def bullet_move(self):
        if self.bullet_rect.left > 0:                   #搞不懂这为啥是left,用top反而会往左发射
            self.bullet_rect.left -= self.speed
        else:
            self.kill()

角色准备:

import pygame
clock = pygame.time.Clock()
class Ourplane:
    def __init__(self,width,height):
        #飞机的图片,带动态效果
        self.planeimage1 = pygame.image.load('D:\\飞机大战素材\\hero1.png')
        self.planeimage2 = pygame.image.load('D:\\飞机大战素材\\hero2.png')
        #飞机位置
        self.planerect = self.planeimage1.get_rect()
        self.width, self.height = width, height
        # 获取飞机图像的掩膜用以更加精确的碰撞检测
        self.mask = pygame.mask.from_surface(self.planeimage1)
        # 定义飞机初始化位置,底部预留60像素
        self.planerect.left, self.planerect.top = (self.width - self.planerect.width) // 2, (self.height - self.planerect.height - 60)
        # 设置飞机移动速度
        self.speed = 10
        # 设置飞机存活状态(True为存活, False为死亡)
        self.active = True
        # 加载飞机损毁图片
        self.destroy_images = []
        self.destroy_images.extend(
            [
                pygame.image.load("D:\\飞机大战素材\\hero_blowup_n1.png"),
                pygame.image.load("D:\\飞机大战素材\\hero_blowup_n2.png"),
                pygame.image.load("D:\\飞机大战素材\\hero_blowup_n3.png"),
                pygame.image.load("D:\\飞机大战素材\\hero_blowup_n4.png")
            ]
        )

    def move_up(self):
        """
        飞机向上移动的操作函数,其余移动函数方法类似
        """
        if self.planerect.top > 0:  # 如果飞机尚未移动出背景区域
            self.planerect.top -= self.speed
        else:  # 若即将移动出背景区域,则及时纠正为背景边缘位置
            self.planerect.top = 0

    def move_down(self):
        """
        飞机向下移动
        """
        if self.planerect.bottom < self.height - 60:
            self.planerect.top += self.speed
        else:
            self.planerect.bottom = self.height

    def move_left(self):
        """
        飞机向左移动
        """
        if self.planerect.left > 0:
            self.planerect.left -= self.speed
        else:
            self.planerect.left = 0

    def move_right(self):
        """
        飞机向右移动
        """
        if self.planerect.right < self.width:
            self.planerect.right += self.speed
        else:
            self.planerect.right = self.width

    def reset(self):
        # 初始化飞机(飞机挂了, 初始化到初始位置)
        self.planerect.left, self.planerect.top = (self.width - self.planerect.width) // 2, (self.height - self.planerect.height - 60)
        # 重置飞机的存活状态
        self.active = True

敌机准备:

import  random  as r
import pygame
pygame.init()
class Emeryplane(pygame.sprite.Sprite):
    def __init__(self,width,height):
        pygame.sprite.Sprite.__init__(self)
        #敌机图片
        self.emeryplane_image = pygame.image.load('D:\\飞机大战素材\\enemy1.png')
        self.emeryplanedie_image = [
                                    pygame.image.load('D:\\飞机大战素材\\enemy1_down1.png'),
                                    pygame.image.load('D:\\飞机大战素材\\enemy1_down2.png'),
                                    pygame.image.load('D:\\飞机大战素材\\enemy1_down3.png')
                                    ]
        # 随机出现
        self.emeryplane_rect = self.emeryplane_image.get_rect()
        self.width, self.height = width, height
        self.emeryplane_rect.left,self.emeryplane_rect.top = (r.randint(0,self.width-self.emeryplane_rect.left),r.randint(-100,-30))
        #敌机状态
        self.emeryplane_life =  True
        #敌机碰撞检测
        self.mask = pygame.mask.from_surface(self.emeryplane_image)
        #敌机移动
    def emery_move(self):
        if self.emeryplane_rect.top < self.height:
            self.emeryplane_rect.top += 3
        else:
            self.kill()
        #敌机重置
    def emery_reset(self):
        self.emeryplane_rect.left, self.emeryplane_rect.top = (
        r.randint(0, self.width - self.emeryplane_rect.left), r.randint(-100, -30))
        self.emeryplane_life = True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值