python实现飞机大战源代码+素材+项目分析

  • Post author:
  • Post category:python


简述:游戏具有用户注册,操作说明,显示最高分和用户名,暂停游戏,发送补给,难度升级,音效,实时显示分数和最终得分等效果。



一.项目分析



Python程序设计项目

题 目 飞机大战

院 系 信息科学与技术学院

专 业 计算机科学与技术

姓 名 星空

班级学号 37

指导教师 xxx

二O一九年十二月



一.系统研究的背景及意义

当今社会是一个信息社会,一个知识经济的年代。自从世界上第一台计算机ENIAC于1946年问世到现在,计算机业飞速发展。随着以全球信息网络普及和全球信息共享为标志的“全球信息网络革命”的蓬勃兴起,世界已然进入在计算机信息管理领域的激烈竞争的时代,计算机,自然而然的变成了人们生活中必不可少的一部分。

过去,人们只要是借助电影,电视,音乐等方式来娱乐。而今天,以游戏为代表的电子娱乐正成为主流娱乐方式。因为CPU以及显卡等设备的高速发展,为人们开发出更加炫目多彩的游戏提供了可能。时代的发展,社会的进步,/科学技术正以日新月异的速度飞速的向前发展。计算机技术的发展更是迅速而且广泛。可以说,计算机已经涉及到现代绝大部分行业。目前纷繁复杂的游戏软件比比皆是,无论在线的网路游戏还是桌面游戏,二维的还是三维立体空间的,多由单机版游戏孕育而来。学习简单的单机版游戏的制作,有利于初学者了解到游戏制作的理念。目前不论是在国内还是世界范围内,游戏产业都如雨后的春笋,蓬勃发展,越来越多更具娱乐性的游戏产品被开发出来。



二. 国内外的发展现状

96,97年的国产游戏产品是单机版的游戏,在当时的市场上虽然品质和档次不如外来产品,但也占有一定的市场,例如《仙剑奇侠传》、《三国志》等系列带有鲜明中国特色与气息的游戏在市场上掀起了一波高潮。1998年联众与中国游戏中心等老牌的游戏平台的推出标志着电脑游戏在中国的开荒与生根。但是到了1999年在没有形成主流产品的情况下,政策不明朗,包括开发资金出现问题等原因国产游戏开始走下坡路。一直到了2000年,网络游戏问世并且很快流行起来我国的游戏行业才又渐渐的复苏,但是由于投入差距太大,起步晚等原因与外国游戏相对而言并没有竞争力。

时至今日,网络游戏走入盛世,成为了一部分人休闲娱乐的主要行为。国内网易、腾讯、九城、完美等公司百花齐放,国产网游渐渐走入国际市场,而且基于网络的发展真正实现了网络全球化,网络游戏也是遍布全球,全球同玩一款游戏的现象比比皆是。大量海外游戏走入中国市场,电脑游戏百花纷呈,随着经济的进步,计算机科技的发展,这一现象将愈演愈烈。



三.可行性分析

(1)技术可行性

主要分析技术要求的技术可能性可以完成开发任务,硬件和软件可以满足开发人员的需求。功能强大的JetBrains是该软件中使用的开发工具。

PyCharm 2019.1.3 x64,强大的扩展能力是该软件的特性,该软件对于飞机大战游戏的编写及完善有良好的支持效果,也是众多Pythoner的喜爱编译器。随着互联网行业的迅猛发展,软件开发平台及硬件技术同时不断更新进步。大容量、可靠性的提高、低价格也使得软件开发是可行的。本游戏的编译需求完全可以由Pycharm编译器承担。

综合以上情况及考虑,本游戏的开发在技术上是完全可行的。

(2)经济可行性

由于本游戏较为小型轻便,开发成本较低。此外,该软件稳定、后期维护简单、实用,一旦开发完成即可长期使用。当用户有了新的需求时,只需要根据需求,在原有代码基础上进行更改,维护成本较低。

综合以上情况及靠背,本游戏在经济上是完全可接受的。

(3)社会可行性

法律因素:本游戏是本人处于兴趣爱好,独立完成开发的。游戏基于Python完成,同时借鉴市场上同类软件的功能,收集并归纳用户需求,制订设计思路,结合实际中存在的游戏实体,进行创新及开发的。

用户使用可行性:本游戏对用户的要求,没有复杂繁琐的操作,简单易用。使用软件的管理员, 在了解了简单的流程后就可以对后台进行管理,没有额外的学习使用环节,节约成本。

由以上分析可知,本游戏在社会可行性方面是完全可行的。



四. 总体设计原则

总体设计原则的提出是为了确保系统建设成功,并为系统的可持续发展做出规划。因此在系统设计时,遵守以下原则:

简单性:实现游戏需求的前提下,尽可能的保证游戏简单易操作。一方面,简单的操作会使增进游戏体验,另一方面操作过于复杂时,游戏实现更易引入问题及漏洞。

针对性:本项目是选用Python作为编程语言的飞机大战游戏,用明确项目需求为目标,具体需求具体实现,有很强的针对性。

实用性:飞机大战是一款优秀的休闲娱乐软件,从该系列游戏诞生以来就深受玩家的喜爱,具有娱乐身心、放松心情、减缓压力。而且由于该游戏较为普及,大多数玩家都熟知游戏操作方式,更乐于使用这一游戏,因此该游戏具有很强的实用性。

一致性:本游戏的飞机采用的是同一种画风的飞机,且多种飞机类是由飞机基类继承得来的,具有较高的视觉一致性。登入界面采用tkinter模块,主界面采用pygame模块进行编写,主界面上的元素统使用标签插入,具有较高的功能一致性。



五.需求分析

游戏的基本设定

用户注册与登入

1.用户登入于注册界面:

在这里插入图片描述

在这里插入图片描述

2.注册时如果用户已经存在,会弹出警告界面:

在这里插入图片描述

3.登入时如果用户不存在,会弹出警告界面:

在这里插入图片描述

点击是则会进入注册界面。

4.如果用户名或密码为空,会弹出警告界面:

在这里插入图片描述

游戏开始界面:

在这里插入图片描述

游戏帮助:主要介绍游戏的玩法,内置返回键。

关于:作者说明与简单游戏声明,内置返回键。

在这里插入图片描述

1、敌方共有大中小3款飞机,分别为高中低三中速度。

2、消灭飞机需要1发子弹,中飞机需要8发子弹,大飞机需要20发子弹;

3、加载背景图片和背景音乐加载进去,其中背景音乐要循环播放。

循环播放只需要设置 pygame.mixer.music.play(-1)

4、每消灭一架飞机得1000分,中飞机4000分,打飞机10000分;

5、每隔30秒有一个随机的道具补给,分为两种道具,全屏炸弹和双倍子弹;

6、全屏炸弹最多只能存放3枚,双倍子弹可以维持时间为18秒;

7、游戏将根据分数来逐渐提高难度。难度的提高表现为飞机数量的增多以及速度的加快。

8、实时显示分数:实时显示玩家得分,规则如下:

击落小中大敌机分别可以获得1000,6000,10000分

我们现在main 函数中添加一个 score 变量统计用户的得分,并设置显示分数的字体,我们已经放在素材库的 font 文件夹中了。

(这里要注意的是,你的字体所放的文件路径中,不能出现中文!!!

然后在大型敌机坠机要重建之前加10000分,中小型敌机同理。

然后在绘制我方飞机时把分数绘制到界面上。

9、(1)我方飞机

创建一个名为 myplane 的模块,然后把我方飞机的所有属性和方法定义在里边。

main 模块中响应用户的键盘操作,响应用户的键盘操作有两种方法:

【1】、通过检测事件消息,检测到如果有 KEYDOWN 或者 KEYUP 事件,我们就知道是用户按下了键盘按键。(这是我们之前常用的一种方法)

【2】、调用 key 模块里的 get_pressed() 方法,会返回一个序列,该序列包含键盘上所有按键的布尔类型的值,如果这个值是True 的话,表示该按键被按下。

我们这里有一个建议:对于检测偶然触发的键盘事件,我们推荐使用方法1,例如该游戏中会设置一个全屏炸弹,按下空格键时爆炸,这是偶然触发的,没有经常触发,这时使用第1种方法较好;对于频繁触发的键盘事件,我们则建议使用第二种方法,例如控制飞机移动的4个方向键,我们就使用方法2。

(2)我方飞机移动分为单向移动与双向移动,如果玩家同时按下两个方向键或(A,S,W,E)键就会同时朝综合方向移动,实现方法是为我方飞机类设置了8个方向的移动方法,根据按键调用对应的。

(3)为了增加我方飞机的动态效果,我们可以通过两张图片(me1,png 和 me2.png)的切换来实现飞机喷气的效果。在 myplane.py中加多一种图片。

(4)创建敌机:

敌机分为小中大三个尺寸,它们的速度一次就是快中慢(越小越快),在页面上方,我们就需要随机创建一些敌机,可以通过在页面外部上方5个屏幕高度范围内随机生成一个敌机以保证不让敌机在一排出现。

在这里插入图片描述

(3)敌方飞机

敌方飞机从屏幕顶端出现,向下移动至窗口上部,左右移动射击,射击子弹数量达到一定值后,添加向下移动。

10.碰撞检测:

敌方飞机和我方飞机发生碰撞时,两方应该是玉石俱焚的,所以在完成之前的基础操作后,现在要为每一个类增加撞击时发生的惨烈画面。导入惨烈画面的图片。

碰撞检测使用 spritecollide() 方法:

碰撞和坠机是实现了,但是我们发现,两个飞机还没真正的接触就已经撞上了,这是为什么呢?

这是因为我们使用了普通的 spritecollide() 方法,这个方法默认情况下是以图片的矩形位置区域作为检测的范围,而我们飞机的矩形范围远大于自身,但是我们完全是可以做得更好的,我们可以做到完美的碰撞检测,怎么实现呢?

sprite 模块里有一个叫做 collide_mask 的函数可以利用,这个函数要求检测对象拥有一个 mask 属性,这个属性就是用于指定检测的范围,关于 mask,Pygame 还专门写了一个 mask 模块,其中有一个叫做 from_surface() 的函数,可以将 Surface 对象中非透明的部分标记为 mask 并返回。

首先,给每个类加上 mask 属性。

self.mask = pygame.mask.from_sueface(self.image) #将非透明部分标记为mask。

然后在main 函数中修改碰撞检测代码,指定检测方法为 pygame.sprite.collide_mask。

但是:

刚才我们实际上是存在很明显的Bug,那样操作将导致部分音效无法正常播放,你要画它坠机的图片,需要好多帧,但是这里你重复的播放了好多次它坠机的音效,一个飞机坠机只需要播放一次音效即可,你要播放很多次,导致的结果就是你把所有音效的通道都占满了,因为Pygame 默认只有8条音效的通道。详细请看源代码实现。

11、定义子弹:

子弹有两种:一种是一次只发射一颗,一种是补给发放的超级子弹,一次可以射2颗子弹。子弹的运动轨迹是直线向上的,速度要略快于飞机的速度,子弹如果超出屏幕范围的话,我们就重新绘制子弹,飞机在哪里,子弹就重新绘制在哪里,击中敌机的时候,子弹也是需要重新绘制的。因此,我们给子弹添加一个 active 属性,来判断子弹是否需要重新绘制,我们单独定义一个 bullet 模块。

设置每10帧发射一颗子弹。

接下来检测射出去的子弹是否击中敌机,击中的话,敌机和子弹的 active 会设置为 False:

到目前为止,这样我们基本上就战无不胜了。无论是中型敌机还是大型敌机,我们直接一枪就把它秒杀了,这就显得敌机太弱了吧。

因此,先给中型敌机和大型敌机添加一个 energy 的属性,显示还有多少生命值。

之后,我们就来修改main 模块,每当中大型敌机被子弹击中的时候,我们先将其enery 属性的值减1,减到为0时,才让敌机坠机。我们还可以为中大型敌机增加血槽的显示功能,这样子可以更直观的让玩家知道敌机还剩多少生命值,当中型敌机和大型敌机被子弹击中时,但不至于坠机时,这时候应该是要有特效的。

我们现在 enemy 模块中增加特效的图片,并且增加一个用于检测是否被击中的 hit 属性。

然后我们在子弹击中中型或大型飞机时,将hit 属性的值改为True

然后再绘制中型或大型飞机时,就需要根据hit 作调整。

在这里插入图片描述

12、暂停功能:

我们在界面右上角添加一个暂停符。

总共有4张图片,两张表示要暂停,两个表示要恢复游戏。两组各有一张深色的和浅色的,当鼠标移到图像上方时(并没有点击鼠标),图片会加深,起到一个提示的效果。

我们通过响应 MOUSEBUTTONDOWN 的事件可以知道用户是否点下鼠标,在点下鼠标那一刹那,我们去获得鼠标的位置,就可以知道玩家是否点下了暂停按钮。通过响应 MOUSEMOTION 事件,我们可以改变按钮的样式。

在main函数里加一个 pause 变量作为判断暂停的标志。

接下来我们响应 MOUSEBUTTONDOWN 事件 和 MOUSEMOTION 事件:

在点击一次暂停按钮后必须要移动鼠标才会进行更改,使鼠标在图标在点下的时候能立即更改。

在这里插入图片描述

13、难度提升:

因为敌人一成不变的慢慢的出现,对于玩家来说是无法忍受的,玩家希望的游戏体验是刺激。我们要让游戏的难度随着玩家的得分增加而增加,这里将游戏难度划分为 5 个级别,每提升一个级别,就会增加一些敌机或者说增加敌机的移动速度。

但是考虑到,如果 level 到 5 的时候,敌机的密集度就会很大,玩家就很容易陷入不利的局面,这就需要给玩家提供大杀招:全屏爆炸。

这个大杀招的触发是通过空格键来触发的,初始化情况下,我们带着3颗全屏炸弹,我们可以通过每30秒一次的补给获得,但是最多你的飞机只能装载3颗。

由于触发全屏炸弹是属于偶然事件,因此我们通过响应 KEYDOWN事件,再检测 event.key 是否为 K_SPACE 就可以了。

在全屏炸弹用完之后,我们可以通过每30秒一次的补给来获得,补给包有自己的图片,也有自己的运行轨迹(由上而下),新建两个类来实现,实例化补给包并这只补给包发放定时器,定时器每30秒触发一次。

超级子弹,当我们接收到超级子弹补给的时候,子弹由原来的单发变成了双发,子弹的速度相对也会提高一些。超级子弹的使用时长为18秒,过了这个时间,就自动变为普通子弹。因此我们需要一个超级子弹的定时器,另外,我们还需要一个变量来表示子弹的类型,然后然后生成超级子弹。

14、玩家敌机架数

人非圣贤,孰能无惑。玩游戏也是这样,不可能一个人玩一个游戏能一次不死,玩到地老天荒,就算有,那也是玩游戏的天才,这样的天才,万中无一,所以我们需要给玩家多次的机会,哪怕失败了,诶,那也没有关系,你还有多次的机会。

我们定义玩家有3次机会,我们就需要在main模块中 加多一个 life_num 的变量,表示生命数量。这里的话,有一个小细节,就是每次我方飞机牺牲后,你在诞生的位置恰好有一个敌机,那么会直接导致我方飞机直接挂掉,因此,我们需要设定每次诞生有3秒钟的安全期,做法其实也不难。

我们只需要在 Myplane 类中加入一个属性,命名为 invincible ,在每次碰撞时先检测该属性的值。

15、结束游戏

结束画面,游戏结束画面会显示历史最高分和此次分数,并提供玩家两个选择:重新游戏 或者 退出游戏。刷新纪录是我们玩家的追求,历史最高分是存放在 record.txt 文件中的。

游戏结束的判定:

游戏结束的判定分为两种:第一种是用户单击退出游戏按钮,退出游戏会触发绑定事件,调用积分模块,进行积分存储,然后程序会强制结束。第二种则是己方飞机受到攻击生命数为0时(起初为3),游戏界面给出游戏结束提示,然后调用积分模块,并提供重新开始与退出游戏,如果用户成绩超过最高记录,系统将会记录用户的账号和成绩。



六.系统测试

(1)功能检查:根据需求与实现产品,验证功能需求实现情况,检查功能实现是否有遗漏偏差。

(2)数据检查:主要对用户、积分信息进行检查,检查数据库与程序之间的交互部分。

(3)性能检查:针对于本次的飞机大战游戏,该项主要是检查游戏帧率,是否存在卡顿现象

(4)稳定性检查:由于事件读取是从鼠标键盘上获取的,而导致后台响应频率较高,所以要检查程序是否出现运行终止、重启等现象

总结与展望

本次课题研究是基于兴趣爱好的一次实践,兴趣爱好给予了我很大的动力,这也使我在遇到各种问题时,总能通过多种渠道找到解决方案。虽然是第一次使用Python开发游戏,在一边进行学习,一边进行游戏开发和设计过程中,遇到了很多问题,也走了不少弯路,但锻炼了自我解决问题的能力。这次课题研究不仅让我对Python有了进一步的了解,而且还大大提高了编程能力,锻炼了自己的逻辑思维和整体设计的能力,收获颇多。通过这次课题研究,我意识到完整的软件开发思路是非常重要的,它关系到我们开发过程能否顺利实现。在项目开始之前,必须有软件工程的系统化的知识体系,不仅如此,还应包括软件结构位置、代码编写和模块划分和整体布局,只有做完这些步骤,才能逐步开发出想要实现的功能。这样定能达到事半功倍的效果。

整个软件按照计划大致实现了游戏的具体功能,虽然游戏能正常运行,不过因所学知识及开发周期有限,还有很多需要改进的地方,有待于日后进一步的改进和完善。

经过汇总测试人员的建议,本游戏应该完善的功能如下:

(1)BOSS未设置过多技能,没有设置过关动画。

希望日后,我能够有能力对这个游戏进行改进,以优化系统,完善玩家体验、使游戏更加流畅美观。



源代码+素材:

关注公众号【轻松玩编程】,回复

飞机大战

即可获取源代码+素材。


关注公众号【轻松玩编程】回复关键字

激活码

即可获取:全家桶通用激活码(激活码支持idea,pycharm,webstorm,phpstorm…激活)定期更新。适用于最新及以下版本。(无需破解和修改hosts,如果破解过请卸载重新安装官方原版,如果修改过hosts,请删除你添加的网址,然后重新激活)


回复关键字“电子书”,“计算机资源”,“Java从入门到进阶”,”JavaScript教程“,“算法”,“Python学习资源”,“人工智能”等即可获取学习资源。

在这里插入图片描述



版权声明:本文为jiahuan_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。