pygame飞机大战详解

文章详细介绍了飞机大战游戏的开发过程,包括飞机、敌机、子弹和流星等类的设计,如属性、方法、移动和碰撞检测。此外,还阐述了主程序的逻辑,如键盘控制、图像绘制、更新数据和边界检查。利用继承和工具类实现了代码的复用和优化,提高了游戏体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

飞机大战

准备工作

首先,我们再开始编写程序之前,要明确程序结构,对应关系,合理的准备分析,能使我们的开发工作事半功倍

1、确定我们需要的类

首先,我们做飞机大战,既然需要飞机类(Plane),敌机类(AiPlane),然后是他们两个的基类(Baisc_Plane),用于提供他们重复的属性和方法实现继承。

然后,在这基础之上,我们添加一个子弹类(Bullet),它可以让我们有真正的游戏体验,同样是不可或缺的东西,这三个类,就可以构成我们最基本的飞机大战。

对于后面的流星类,属于优化游戏体验的,后续开发完后,再行添加

2、确立每一个类当中,拥有的属性以及方法

首先先说几个都有的属性和方法

1、self.live 用于判断飞机是否存活

2、self.blood 用于控制飞机血量

3、self.img Actor对象

4、move()移动方法

5、draw()绘制方法

6、oversetup()边界检查

下面列举飞机类作为讨论对象

2.1、飞机类

2.1.1、属性

在属性中,因为要控制飞机移动,所以我们需要上下左右四个标志属性来控制

然后,飞机的得分属性,飞机的子弹列表属性

2.1.2方法

set_direction()方法,控制方向

clear_direction()方法 ,解除方向

飞机大战 主程序

首先需要分析主程序中,需要什么方法?

1、在draw和update中需要的前提变量

因为我们的敌机和子弹、流星对象肯定不可能像玩家一样单独创建控制,所以我们需要一个存放他们对应的列表,并在他们的生命值归零之后,将他们从该列表中移除,这样就不会显示在图像中

2、控制飞机飞行

draw绘制,update更新,除去这两个之外,因为我们的飞机对象需要依靠上下左右的键盘控制移动,所以我们还需要两个方法,一个是获取键盘按下的方法,一个是获取键盘弹起的方法

拥有他们之后,我们的飞机,就可以率先在界面上自由飞行了,实现原理:在这两个方法中调用玩家飞机类对象中的对应方法,根据键盘的反馈获取值,为上下左右赋予布尔值,然后使用布尔值控制飞机移动

def on_key_down(key):
    if login == True:
        plane.set_direction(key)#获取键盘按下的值
​
​
def on_key_up(key):
    if login == True:
        plane.clear_direction(key)#获取键盘弹起的值
​
​

3、绘制所有的图像

首先,分析一下我们需要绘制的图像

1、判断是否登录

首先在我们打开游戏后,应该有个登陆界面,也就是我们应该在其他绘制出来的之前,使用布尔值判断是否登录,未登录则先绘制其他图像,而在我们登陆过后,在绘制出另外的图像,并让整个哟咻运行,因此,update方法同样需要判断是否登录,

2、根据登陆状态播放不同音乐

其次,我们准备了两套背景音乐,一套是未登录时播放,一套时开始游戏播放

3、使用工具类实现我们所有的图像绘画,减少代码冗余,提高观赏性,提高效率

最后,我们需要调用在工具类util当中的实现方法,来绘制剩下的所有图像,因为使用了工具类util,使得我们主程序十分洁简,如果出现问题,可以直接找到对应方法进行修改

def draw():
    global bgmusic_1,bgmusic_2,login
    bg = Actor("../images/背景.png")
    bg.draw()
    #判断登录
    if login==True:
        if bgmusic_1 == True:
            pygame.mixer.music.load("music/backmusic1.mp3")  # 加载MP3文件
            pygame.mixer.music.set_volume(0.8)
            pygame.mixer.music.play(-1)  # 播放mp3文件
            bgmusic_1 = False
        util.show(rank_list,screen,plane,Aiplanes,meteor_list)#工具类util的show方法,所有绘制都在这里实现
        plane.show_score()#plane类的绘制得分
    else:
        if bgmusic_2 == True:
            pygame.mixer.music.load("music/backmusic2.mp3")  # 加载MP3文件
            pygame.mixer.music.set_volume(0.8)
            pygame.mixer.music.play(-1)  # 播放mp3文件
            bgmusic_2 = False
        login = util.show_login(screen)
​
​

4、update更新数据

在update方法中我们大量使用了封装方法来替代原本的上百行代码

1、判断登陆状态

首先,要先判断是否登录在开始运行其他方法

2、最关键的,也就是对子弹,敌机,流星等更新数据,我们这里使用了util工具类封装,在哪里再详细介绍

def update():
    if login == True:
        '''
            1、循环判断发射出的子弹对象状态是否归零,归零则将子弹对象从子弹数组中删除
             2、控制子弹移动  move方法
            '''
​
        for bullet in plane.bullets:
            bullet.oversetup()#子弹是否超出范围
            if bullet.blood <= 0:
                plane.bullets.remove(bullet)
            bullet.move()
        '''
            1、判断玩家飞机是否存活,存活状态刷新敌机,控制移动,子弹图片变换速度,玩家飞机是否超出边界
        '''
        if (plane.blood > 0):
            util.Create_AiPlane(Aiplanes, plane_kind)#工具类自动创造敌机
            util.Create_Meteor(meteor_list)#工具类自动创造流星
            util.bullet_speed(plane)#工具类自动控制子弹切换图片速度
            plane.oversetup()#玩家飞机类边界检测
            plane.move()
            plane.level_up()#玩家飞机类等级提升
            util.meteor_check(meteor_list,plane)#工具类流星状态检测
            '''
                循环敌机列表,若敌机抵达边界或者碰撞玩家飞机则爆炸以及移除敌机列表,同时控制敌机行动
            '''
            util.AiPlane_check(plane,Aiplanes)#工具类检测敌机状态

飞机大战 类

1基类(basic_plane)

该类用于为其他类提供基本的继承,包括单个图片对象,血量和绘制边界检测,移动方法

from pgzero.actor import Actor
​
'''
    这是一个包含图片路径,x,y,血量的基类
'''
class basic_plane:
    def __init__(self, imgPath, x, y, blood):
        self.img = Actor(imgPath)
        self.img.y = y
        self.img.x = x
        self.blood = blood
​
    def draw(self):
        self.img.draw()
    def oversetup(self):
        self.img.y+=1

2、玩家飞机类(Plane)

玩家飞机类我们提供了初始方法,移动模块,显示分数模块,飞机等级提升模块等,以下展示较为关键的模块和功能

2.1初始方法(init):

方法中为飞机类提供了大量的属性,出去继承基类的方法之外,还提供了上下左右的移动标记,子弹列表,飞机得分,当前飞机等级,玩家升级标记等

    def __init__(self, imgPath, x, y, blood):
        #self.img = Actor(imgPath)
       
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值