基于Python的Pygame库实现的仿微信游戏中的飞机大战小游戏

Aveclesoleil

发布日期: 2018-10-06 21:56:06 浏览量: 3552
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

1 游戏简介

不知大家是否还记得当时微信上风靡一时的打飞机小游戏,通过控制我方飞机的上下左右移动,发射子弹来击毁敌机,增加得分。这是一款简单操作易上手又很有趣味性的游戏,我使用python作为基本语言,利用pygame仿照微信版本完成了这款低配版飞机大战游戏。

2 程序功能

我方飞机会按时的不断发射子弹,玩家通过上下左右的方向键来躲避迎面而来的敌机,并利用子弹消灭他们。敌方分为小中大三种机型,有不同的飞行速度和生命值,小飞机一发子弹消灭,得分1000,中飞机八发子弹消灭,得分3000,大飞机十六发子弹消灭,得分8000,分数显示在屏幕的左下角。我方飞机有三条命,每次新生的飞机有三秒的安全期,游戏结束后,屏幕会显示“Game Over”字样和玩家的最终得分。

3 设计思路

3.1 主函数

先写主函数,引入pygame模块,初始化游戏,设置屏幕大小和标题,将背景图片载入,编写主函数,用screen.blit函数将背景图拷贝到屏幕上,再显示到窗口上,效果如下所示:

3.2 我方飞机模块

再写我方飞机模块。

  • 建立类MyPlane,继承自Sprite类,初始化基类,加载图片,获得飞机所在的矩形模块,设置游戏开始时飞机所在的初始位置(预留下方状态栏)及每次按动方向键飞机移动的像素。
  • 定义飞机移动的四个方向函数,确保在移动的过程中不会超过边界。
  • 修改主函数,先导入mainplane模块,在主函数中生成我方飞机并绘制,然后导入key_pressed模块,检测用户按下了方向键的哪个按钮并调用MyPlane类的move函数做出对应反应。

效果如下图所示:

效果1 效果2

3.3 敌机模块

继续写敌机模块。

  • 分为三类,小型、中型和大型敌机,全部继承自Sprite类,同我方飞机进行类似定义,不同的是敌机的生成是随机的因此要引入random模块,小中大型敌机的出现频率和移动速度不同,其余的进行复制修改操作。
  • 然后改写主函数。创建一个包含三类敌机的数据组,再分别创建三个不同类型的敌机组,编写三个函数,分别实现生成敌机并将其加入总机组和对应敌机组的操作,不同类型的敌机每次生成的个数不同。
  • 为了不让敌机之间进行覆盖操作,应该按大中小的顺序进行敌机的绘制,直接将对应类型机组中生成的飞机按顺序生成绘制即可。

效果如下图所示:

效果图1 效果图2

3.4 碰撞检测

给我机和敌机四种对象建立destroy列表,用list储存每个对象爆炸的四个图像。给每个对象赋予active属性,判断是否还存活,若碰撞则依次播放毁灭画面,之后重新在顶部生成。

然后进行碰撞检测的相关代码实现,调用Sprite模块中的spritecollide函数,传递我机和敌机组两个动画精灵,碰撞后返回敌机组中发生碰撞的敌机列表。若列表值不为空则我方飞机和碰撞敌机的状态都为死亡,播放毁灭动画,效果如下图所示:

效果图1 效果图2

紧接着发现,我机和敌机的碰撞范围是图片所在的矩形框,要进行完美的碰撞检测需要用到sprite模块中的from_surface函数,它会将图片中非透明的部分返回为一个mask值,我们直接用每个对象的mask来进行碰撞检测,在主函数中调用pygame的collide_mask函数即可。

3.5 发射子弹

给我机装备上子弹。初始化普通子弹类时需传入参数表示子弹的发射位置,与我机敌机相类似,在类中定义子弹的图片,速度,是否存活,移动方式等属性,随后在main文件中导入bullet模块,先生成空的子弹组,需要每次装填四颗子弹,用append函数向子弹组中添加Bullet类,在飞机的顶端中部生成子弹。为了控制飞机的发射子弹速度和射程,需要每10帧发射一次子弹,利用delay每帧自减操作来实现,随后判断子弹是否碰撞敌机,与上步骤类似,利用mask值来完成检测并绘制相应的毁灭操作,效果如下图所示:

效果图1 效果图2

为了区分小中大敌机,让他们不会都被1发子弹击毁,需要给敌机设置一个energy属性,表示他们的血量。主函数中,如果击中的是中大型敌机,那么energy减一,当energy为0时敌机被消灭,若击中小型敌机,则直接毁灭。

3.6 生命值显示

接下来实现分数和剩余生命值的显示。规则为击中小型敌机1000分,中型敌机3000分,大型敌机8000分,字体调用render函数,会自动将字符串渲染为一个pygame的surface对象,并将其显示在屏幕上。设置一个为life的变量,其中有加载表示生命的图标,表示生命的数量,我机每次毁灭时生命数会减一,生命值为0时游戏结束,效果如下所示:

效果图1 效果图2 效果图3

3.7 游戏难度调节

为了增加游戏的挑战性和趣味性,给游戏设置了难度递增的环节,根据用户的得分,敌机的出现频率和移动速度都会有一定程度的改变。直接调用生成敌机时定义的add函数在组中加入对应数量的敌机,并编写定义增加敌机速度的函数,在难度上升时加快敌机的运行速度,图片效果显示不出太大差异,但可以大概看出敌机数量增加:

3.8

对游戏进行了美化和优化。增加了敌机坠毁,我机坠毁,子弹发射,游戏升级等的游戏音效,优化了敌机和我机运动画面等,提高游戏颜值,游戏基本完成。

4 总结

因为在此前完全没有接触过python语言的相关知识,所以一切都得从最根基的地方开始学起。因为有了C语言作为打底基础,于是用了将近三天的时间成功初步掌握了python的基本编程语言要求和语法。与C不同的是,python是根据语句块的不同缩进来进行代码的执行和判断,这就导致平时编程习惯较差,不注意语句代码规范的我吃了很大的亏。在基本了解了python语法的基础上,得知python为游戏开发项目提供了专门的库pygame,在下载安装好pygame库并且在对比鉴别了网上的各种游戏代码后,确定了自己的选题——伪微信版飞机大战。

Pygame为用户提供了非常多简便的函数和模块,在跟着游戏教程一点点学习制作的过程中收获了很多乐趣和知识,跟以往学习风格都不同的自学过程,有点不知所措,有点手忙脚乱,但是在得到最终成果的时候,却是无与伦比的骄傲与成就感。

上传的附件 cloud_download Python小游戏-飞机大战.7z ( 1.28mb, 327次下载 )
error_outline 下载需要9点积分

keyboard_arrow_left上一篇 : 基于java的Ping程序的设计和实现 基于Qt和sqlite数据库实现的银行管理系统 : 下一篇keyboard_arrow_right



Aveclesoleil
2018-10-06 21:56:57
pygame实现的打飞机游戏,画风清奇、简洁
慧慧慧慧慧
2019-02-28 18:55:41
可不可以用MySQL保存最高分
2625582375
2020-06-25 16:13:31
非常不错 喜欢

发送私信

思考时,要像一位智者;但讲话时,要像一位普通人

9
文章数
7
评论数
最近文章
eject