摘 要
作为早期最经典游戏之一的飞机大战,它是一种传统的电脑游戏,经常出现在便携式终端、手机和计算机中。可是,传统的飞行游戏是一个二次元平面上的,用黑白制作的居多。然而,随着计算机网络的飞速发展,在电脑上可以看到多种颜色的飞机大战。
Python是一种目前广泛使用的语言,非常受使用者们的欢迎,因其自身的优越性很快就得到了迅速的发展。这对C++,java等今年来流行的语言造成了很强的影响。拥有良好的通用性,作业迅速,良好的跨平台和稳性是Python技术的优点,目前,像个人电脑、数据操作、电脑和手机游戏后台、手机移动端和计算机应用的很多方面都在使用Python作为开发语言,技术稳定成熟,缩短开发时间,重复性好,在线扩展方便。
本游戏是一个基于面向对象编程思想,选用Python开发语言,Pycharm为开发工具,而实现于PC端的一款飞机大战游戏。该游戏操作灵活简单,趣味性较强,玩家可以通过键盘进行游戏操作,通过移动躲避敌方飞机子弹,并发射子弹消灭敌方飞机,从而获取积分。游戏主要涉及了实现飞机移动、发射子弹、多条生命、碰撞检测、敌方飞机血量检测、事件监听、发放补给包,刷新游戏画面及音乐,记录游戏分数和使用者的信息,使游戏界面更多样化,展现出游戏的整体的开发创新流程和设计想法。
关键词:飞机大战;电脑游戏;Python;
Design and Implementation of Aircraft Battle System Based on Python
Abstract
As one of the most classic games in the early days of Aircraft Warfare, it is a traditional computer game, often appearing in portable terminals, mobile phones and computers. However, the traditional flight game is a quadratic plane, mostly made in black and white. However, with the rapid development of computer network, we can see many kinds of color fights on the computer.
Python is a widely used language, which is very popular with users. Because of its own advantages, it has been rapidly developed. This has a strong impact on C++, Java and other popular languages this year. Python technology has the advantages of good versatility, rapid operation, good cross-platform and stability. At present, Python is used as the development language in many aspects, such as personal computers, data manipulation, computer and mobile game backstage, mobile phones and computer applications. The technology is stable and mature, shortens the development time, has good repeatability, and is easy to expand online.
This game is based on the idea of object-oriented programming, using Python development language, Pycharm as a development tool, and implemented on the PC side of an aircraft war game. The game is flexible, simple and interesting. Players can operate the game by keyboard, evade enemy aircraft bullets by moving, and shoot bullets to kill enemy aircraft, so as to obtain points. The game mainly involves the realization of aircraft movement, launching bullets, multiple lives, collision detection, enemy aircraft blood volume detection, event monitoring, distribution of supply packages, refreshing game pictures and music, recording game scores and user information, making the game interface more diversified, showing the overall development and innovation process and design ideas of the game.
Key Words: aircraft war; game; Python;
目 录
摘 要 3
Abstract 4
第一章 绪论 5
1.1 项目背景及意义 5
1.2 国内外研究现状 6
1.3 项目主要工作 7
1.4 本文组织结构 9
第二章 开发平台与开发技术 10
2.1 开发平台 10
2.1.1 系统开发环境介绍 10
2.1.2 数据库系统介绍 10
2.1.3 开发工具介绍 10
2.2 开发技术 12
2.2.1 Python语言简介 12
2.2.2 Pygame模块简介 13
2.2.3 Tkinter模块简介 13
2.2.4脚本系统架构设计 13
第三章 飞机大战游戏模块设计 15
3.1 需求分析 15
3.2 可行性分析 16
3.3 总体设计原则 17
3.4数据库设计 18
3.5系统流程图 19
3.6 系统模块设计 20
3.6.1 主界面选项卡功能 20
3.6.2 游戏难度的调整 21
3.6.3 游戏界面绘画功能 21
3.6.4 游戏控制功能 22
3.6.5 结束游戏功能 22
3.7 游戏难点分析 22
第四章 主要功能具体实现 24
4.1 主界面选项卡实现 24
4.1.1主界面的实现 24
4.1.2注册功能实现 25
4.1.3登录功能实现 25
4.1.4试玩功能实现 26
4.1.5积分榜实现 26
4.1.6游戏设置实现 27
4.2 游戏功能实现 28
4.2.1游戏界面绘制 28
4.2.2键盘及鼠标控制实现 29
4.2.3飞机移动实现 30
4.2.4发射子弹模块实现 31
4.2.5击中爆炸实现 31
4.2.6展示血量和绘制血条 32
4.2.7积分模块实现 33
第五章 系统测试 35
5.1 测试的定义及其重要性 35
5.1.1 测试的定义 35
5.1.2 测试的重要性 35
5.2 测试方法及过程 36
5.3 测试结果 36
5.3.1评价 36
5.3.2 BUG修复进度 37
第六章 总结与展望 38
参考文献 39
第一章 绪论
1.1 项目背景及意义
随着社会经济实力的迅速发展,人们的就业压力越来越大。长期的暴力和忙碌的工作压力使人们感到紧张。为了缓解紧张工作带来的压力,我们应该劳逸结合,采用适当的休闲娱乐方式放松自己。有很多方法可以减轻压力。玩游戏为自己选择正确的方式也是缓解压力的许多方法之一。看电影、电视和音乐也可以缓解压力,但人们可以被动地听,而不参与互动。而游戏有很好的互动性,玩家既要综合看角色如何移动,又要在角色中工作。在游戏中,玩家的行为也会影响游戏。除了有趣的人,游戏还可以用来缓解压力。当你休息的时候,你不必考虑任何事情,压力也会降低。
随着个人电脑的普及,游戏并没有被广泛接受。主要原因是不能充分发挥计算机的性能。游戏程序不能最大限度地利用PC机的硬件资源,而机器与人之间的交互作用还不够。因此,由于图形化、刚性操作和低性能,PC游戏不被接受。然而在计算机硬件的迅猛发展的前提下,同时伴有C、C++、Java、Python等高级语言不断涌现,这一问题已经被解决,游戏质量得到大幅度提升。比如从暴雪1998年发布的星际争霸,世界魔兽争霸,再到今天的英雄联盟等,带给所有玩家一个伟大的乐趣和一个良好的游戏体验。当然,除了游戏本身的卓越品质外,它还可以支持广泛的硬件设备和操作系统功能,不容忽视,高、中、低端的电脑都有很好的流畅性。
自网络游戏发展以来,市场竞争十分激烈,为了迎合市场的需求,这就促使开发者快速有效地响应玩家的需求,做到更好,以争取网络游戏市场的一席之地。在传统的游戏开发中,C/C++技术得到了广泛的应用。虽然C/C++具有明显的优势性和来发优势,但很多时候我们并不关心程序的效率,而关注程序开发效率、维护效率、跨平台性等。
Python坚持清晰划一的编码风格,可读性较好,相较于其他语言更易维护[1]。此外,Python还是免费开源的,具有极其丰富与强大的类库,支持代码热更新。综合时间及需求考虑,构建基于飞机战争的系统使用Python来开发是非常合适且具有意义的。
1.2 国内外研究现状
Python因风格简洁、可读性较好深受编程人员的喜爱,并得到了广泛运用[1]。对于游戏开发来说开发过程中会遇到各种各样的问题,所以在编写程序和运行代码的过程中,关于设计的逻辑和设计过程,都是一个不断发现问题、解决问题的过程,不断完善以达到预期的功能才是我们希望看到的。Python语言具有其他语言所没有的特性,可以使用它进行开发游戏系统。
Python的多样性,意味着可以横跨多个领域,绝不仅限于Web开发、桌面程序、移动应用,甚至包含硬件开发等。所以并没有被束缚在单一的平台之上,Python具有良好的可移植性,在游戏开发上使用Python可以大大方便项目的开发和维护。
由上面论述可知,通过Pygame工具的应用,可以简化项目的开发,Pygame使开发者不必过多的在意一些琐碎的问题,因为这些问题Pygame工具会帮我们解决,这让开发者拥有更多的时间和精力放在游戏的关键部分,给开发者带来了相当大的便利。最关键的是,Pygame拥有跨平台的特性,这使得基于它开发的项目可以自由的在各个操作系统上运行,这省去了很多繁琐的修改。随着Pygame开发工具的流行,该工具以其独特的优越性,越来越多的被应用于各种游戏的开发。下面是具体的开发路线:
图1- 1 游戏主循环
1.3 项目主要工作
飞机大战系统主要包含以下两个模块:
主页面功能包括:
(1)登录及注册(含有非空性,重复性校验)
(2)游客试玩(内容和正常玩家一样,最后积分不录入数据库,也不进入积分榜)
(3)积分榜(展示前20玩家及相应积分)
(4)设置(游戏音量设置)
游戏功能内容:
(1)页面内包括:游戏主体页面、操作按键提示,重新开始,退出游戏,我方飞机血量及三倍子弹存储量。
(2)我方飞机具有,灵活移动、进行射击、初始HP、捡取补给(碰到即可)、自爆、重生、开启\关闭三倍子弹功能。
(3)敌方飞机分为小型、大型、BOSS共三种,且不同类型的敌方飞机属性不同。
敌方飞机可发射子弹 具有血条 且随着积分增加,敌方飞机血量也会增加。
(4)boss飞机:游戏达到一定积分后,boss飞机会加入战场。
(5)补给包括两种:
蓝色补给:回复一定HP。
红色补给:增加三倍子弹的存储量。
在这里插入图片描述
图1- 2 项目主要工作
1.4 本文组织结构
本文的具体内容和组织结构,简要叙述如下:
第一章对本文的研究及应用背景进行讲述,并提出开发本游戏需要进行的主要工作和本文的组织结构。
第二章介绍了游戏平台的特点和系统开发环境的特性,首先是介绍了开发平台,系统开发环境介绍、数据库系统介绍以及开发工具介绍,在开发技术中,介绍了Python动态脚本语言、脚本系统架构设计以及脚本接口模块设计、Python调用引擎函数和相关技术难点。
第三章按照面向对象的设计思想,从需求分析和可行性分析、并根据分析结果对飞机大战游戏进行了模块设计,明确包含游戏主页面设计、调整游戏难度、进行游戏控制等核心功能的具体要求。
第四章围绕主页面及游戏界面,对其中的重要功能实现,阐述功能实现,对具体实现给出标明代码注释,程序截图帮助阅读及理解。
第五章对程序进行了功能测试、并对比需求及实现情况,对软件质量提出评价,记录重要性较高的BUG。
第六章对该系统开发过程进行总结,并给出该系统的不足之处,提出提升空间。
第二章 开发平台与开发技术
2.1 开发平台
2.1.1 系统开发环境介绍
当前程序是以Python为编程语言,主要功能实现依赖于pygame模块,主要用到surface对象之间的位置变化,再利用事件监听让程序运行起来。运行中Surface对象的位置发生变化后,界面刷新,用户对鼠标与键盘进行操作时,监听操作完成相应事件[2]。
软件开发方式:①系统总体设计②系统详细设计③编码④测试
系统运行环境:Windows7及更高版本;
2.1.2 数据库系统介绍
MySQL是一种开源关系数据库管理系统,进行数据库管理所使用的查询语言(SQL)也被广泛使用[3]。
MySQL是开源的并支持个人修改设置,用户可以在通用公共许可证进行下载。软件体积较小,安装使用非常简单,且以便于维护,安装维护成本较低。
MySQL具有可靠性高、性能卓越、适应性强、服务稳定等优点,并被人们广泛关注。大多数人认为MySQL是在不进行事务处理的情况下管理内容的最佳选择[4]。
因此,在数据库使用需求较为简单情况下,我选择MySQL作为数据库管理工具。
2.1.3 开发工具介绍
PyCharm是一种Python 集成开发环境,它有一套工具可以帮助用户提高开发Python语言的效率,例如带有常用的第三方类库、调试及智能提示、支持单元测试、代码跳跃、项目管理、自动作业、语法突出显示、版本控制。
编码支持:其支持智能化的、可配置的编辑器提供代码完成、代码片段、代码折叠和窗口拆分支持,使用户快速便捷的完成任务,节省了用户的时间。
项目代码导航器:这个IDE快速的帮助引领使用者在文件之间切换,快速寻找定位关联代码,使用者还可以使用默认或者自己设置的快捷键来提高编程效率。
代码分析:使用者可以通过工具提示信息,在不允许代码的前提下,完成代码修改及调优。
Python重构:在程序编写过程中,导入域/变量/常量,重命名,提取方法/超类,移动和前推/后退重构这些操作可以使用这个功能来实现,极大的减少了用户的任务量。
集成版本控制:如果用户想使用这些功能,如登录、输入、视图拆分和合并, -用户可以在VCS用户界面中找到,这是其通用的功能。
具有自带的调试器,调试器的功能多样化,可以提供多种功能,用户通过对基于Python和 Django的项目进行调试,同样,系统的单元测试,也可以通过它来解决,
该调试器包括blake点、分步、多屏幕视图、窗口和计算表达式等。
单元测试:Pycharm在默认条件下使用pytest框架去执行单元测试用例
另一方面,Pycharco还为Django的开发提供了一些很好的功能,以及对Google应用引擎的支持,以及对Pycharm的支持。
图2- 1 Pycharm主要功能
2.2 开发技术
Python用作该软件的开发语言,其关键技术在于布局、事件监控和数据存储[5]。布局主要是美化游戏界面以及界面的排版。用户交互界面用布局来实现,给用户带来美观、舒适、直接的用户体验。所以,界面布局的设计会影响到使用者的客观感受,获取用户操作使用事件监视技术,而数据监视技术记录所有操作,创建用户需要提取的数据。
2.2.1 Python语言简介
Python诞生于1989年,由Givavo RSM开发和设计,设计Python的最初目的是为了高效的完成某一项任务而创造的[6]。它从一种为提高研究项目的工作效率而创建的通用编程语言开始。时至今日,在互联网行业发展迅猛的同时,Python语言也得到了优化与改进,由于其良好的可移植姓和丰富实用的类库支持,它已经出现在许多领域[6]。比如机器学习与深度学习,自动化测试用例、日常脚本编写、数据分析及处理等等。如人工智能的阿尔法狗就是成功的应用Python技术的例子。
Python的主要特点有:
(1)低入门标准的Python语法相当简短,编写的程序通常简短,非常像日常使用的自然语言,有利于开发者的使用和理解。
(2)作为一门面向对象的语言,类和对象的使用,体现了Python的特征,面向对象的语言特点是在该语言被创造的时候就体现的。Python之所以能成为一门被大众喜爱的编程语言在于它的精心设计的数据和内存管理。
(3)对于内存的管理,Python也有其特定的部分负责,对于开发者来说,程序就显得有必要了,因为开发者只有理解这些程序的前后逻辑才能更好的写出项目,使他们不像C/C++程序员那样专注于处理内存事务[7]。Python的程序设计和编写时间更短、出错更少也是基于此特性。
(4)主机语言与其通信可以方便的被嵌入,可以用C语言编写对于一些对性能特别强调的地方,这些扩展在Python中被调用以实现性能改进的目的。相反,Python解释器可以嵌入到C/C++中,它取代接口可以通过动态链接库的形式进行,通过这种方式,程序开发由此变得灵活方便[8]。
(5)在Python的标准库中,包含了大量充分测试后的模块,这些模块为大多数功能实现提供了极大的便利,在实际开发编程中得到了广泛充分的运用。
2.2.2 Pygame模块简介
如果要使用Python进行游戏开发,那么Pygame模块绝对是最佳选择。Pygame模块是利用SDL库实现的,该库是一套开放源代码的跨平台多媒体开发库。其中提供了多种关于控制图像,音频、输入输出的方法[11]。Pygame的代码是开源共享的。Pygame可以用来创建完全界面化的游戏和多媒体程序、而且使用Pygame编写的软件几乎可以在所有平台和系统中运行[12]。
Pygame主要包含以下功能:绘制图型、显示图片、动画效果、与键盘鼠标和手柄的外部设备的交互、声音处理及播放、碰撞检测。
2.2.3 Tkinter模块简介
Tkinter模块是Python官方推荐使用的GUI工具包,而且Python的IDE窗口就是使用Tkinter进行编写的。Tkinter主要的作用是用来编写可视化界面,制造程序与用户之间的良好交互。通过不断添加标签来实现各种功能,常用的标签有Label、 Button、Checkbutton、Entry等多达二十多种。 每个标签对象都设有丰富的参数用作调整,使之更加灵活,可以满足绝大部分的用户需求。
2.2.4脚本系统架构设计
因为脚本在游戏开发中起连接作用,所以首先需要我们解决的问题是脚本和宿主代码,即怎样效率高的便捷的管理和操作脚本代码,让它为游戏的逻辑开发和促进整个游戏的进行。需要解决脚本和主机代码通常以事件为中心,以及他它们之间的联系。游戏引擎是游戏中与脚本进行交互的设备,由此我们可以得到脚本语言的结构,也就是脚本语言和其他交互的接口,接口的实现是我们设计的主要部分,我们将脚本接口集成到游戏引擎的接口,目的是为了实现这些接口。有了引擎接口和游戏接口的结合,给Python脚本的扩充带来了便利,同时也使Python更加丰富,提供Python脚本和游戏引擎之间的数据交互,以达到逻辑与具体实现分离的目的[9]。
它的几个组成部分是脚本包装器、消息处理器脚本、逻辑脚本、游戏世界接口、脚本对象管理器。
(1)游戏世界接口可以实现创建游戏对象、设置计时器、修改游戏中游戏对象的属性、或打印调试日志和其他功能,同时这个接口也实现了管理功能。
(2)对于脚本文件的管理,我们使用引擎来实现此功能,所以,内部逻辑结构是调用脚本的关键,脚本包装器可以实现脚本调用的功能,即通过逻辑的方式来调用。将一个脚本交给一个单个的模块控制。消息处理器对象和逻辑脚本对象是脚本包装器的两个重要组成部分。消息处理器的作用是处理从消息到业务逻辑。
(3)消息处理器由映射关系表来稳定和修护,动态加载、修改和删除脚本对象是引擎内核通过修改消息处理器对象维护的映射表来实现的。这个功能也实现了逻辑的热更新。引擎与Python脚本的相互交互是通过一个抽象层的脚本接口模块来设计实现的,这是一个抽象层。通过这个抽象层,Python脚本可以在Python和C基础上在Python和C++之间进行交互。其中处理异常和转换数据格式是主要部分[10]。
第三章 飞机大战游戏模块设计
3.1 需求分析
需求分析是软件工程的一个重要阶段,这个阶段主要完成的工作是调研用户需求,并和开发人员进行确认,将客户的非技术性需求转化为技术上可实现的技术性需求[13]。明确要实现哪些功能、完成哪些工作,产出规范性文档《需求规格说明书》。在通过评审后,《需求规格说明书》主要有便于用户、开发人员进行理解与交流、反映用户的问题结构以用作软件开发的工作依据、作为软件测试和验收的依据[14]。
游戏程序是高度精确的程序系统,它的精度要求极高,原因在于相当充分的程序利用率。最后工作的实际操作是运行所有的程序,例如键盘事件、绘图事件以及极少的后台频率响应,很多重大的错误往往在于很小的差异导致的,严重的能导致程序崩溃。因此,设计思路应非常严格,设计中应考虑所有可能发生的事件和事故,以保证程序的运行成功率。
在“飞机大战游戏”这个游戏中,游戏的玩法是,玩家控制飞机出现在游戏界面底端,敌方飞机则从顶端生成,发射子弹,并向底部移动。主要游戏内容为,玩家控制己方飞机进行移动,移动的同时躲避敌方飞机所发射子弹,并发射子弹命中歼灭敌方飞机,获取积分。在本游戏中,玩家飞机的初始HP是50,敌方飞机的HP、攻击力根据敌方飞机类型不同而不同。如果玩家HP减到零那么,玩家飞机损毁,游戏结束,将积分记录至数据库[15]。
当积分达到临界值即可出现Boss,Boss死亡后,可进入更高难度的一关游戏,在游戏中,会适当发放补给包。补给包内容分为增加己方飞机HP、增加己方飞机三倍子弹存储量,游戏主画面是一个背景图片及飞机与子弹对象,右侧给出操作提示。玩家操作主要包括,己方飞机的移动、发射子弹、游戏暂停、退出游戏等。
本软件是基于windows系统的开发的一款娱乐软件,它包含普通玩家与游客两种用户。
注册功能:进入程序后,点击注册按钮,注册成为新的用户。
用户登录:用户登录就只有两种类型:普通用户和游客。普通用户能够经过登录界面进行登录,用户名和密码正确才会登录成功。
积分排行:普通用户登录并进行游戏后可以将积分及玩家信息存入数据库,排行前50的积分将显示在积分排行页面。
游戏设置:设置背景音乐开关及声音大小。
游戏功能:实现飞机移动、发射子弹、多条生命、碰撞检测、敌方飞机血量检测、事件监听、发放补给包等功能。
3.2 可行性分析
从而提出该项目是否值得投资和如何进行建设的咨询意见,为项目决策提供依据的一种综合性的系统分析方法。
通过对系统进行多方面的考量来提出系统投资价值,为决策者提供有力依据的综合性分析方法。可行性分析包括技术可行性、经济可行性、社会可行性等多方面考量因素。
从而避免投资的浪费,提高软件生产的成功率。用小代价短时间来确定问题是否能够解决是可行性研究的现实目的[16]。
下面对基于Python的飞机大战游戏的开发进行判断和考察,主要从技术、经济、社会几个方面来分析。
(1)技术可行性
主要分析技术要求的技术可能性可以完成开发任务,硬件和软件可以满足开发人员的需求。功能强大的JetBrains是该软件中使用的开发工具。
PyCharm 2018.2.3 x64,强大的扩展能力是该软件的特性,该软件对于飞机大战游戏的编写及完善有良好的支持效果,也是众多Pythoner的喜爱编译器。随着互联网行业的迅猛发展,软件开发平台及硬件技术同时不断更新进步。大容量、可靠性的提高、低价格也使得软件开发是可行的。本游戏的编译需求完全可以由Pycharm编译器承担。
综合以上情况及考虑,本游戏的开发在技术上是完全可行的。
(2)经济可行性
由于本游戏较为小型轻便,开发成本较低。此外,该软件稳定、后期维护简单、实用,一旦开发完成即可长期使用。当用户有了新的需求时,只需要根据需求,在原有代码基础上进行更改,维护成本较低。
综合以上情况及靠背,本游戏在经济上是完全可接受的。
(3)社会可行性
法律因素:本游戏是本人处于兴趣爱好,独立完成开发的。游戏基于Python完成,同时借鉴市场上同类软件的功能,收集并归纳用户需求,制订设计思路,结合实际中存在的游戏实体,进行创新及开发的。
用户使用可行性:本游戏对用户的要求,没有复杂繁琐的操作,简单易用。使用软件的管理员, 在了解了简单的流程后就可以对后台进行管理,没有额外的学习使用环节,节约成本。
由以上分析可知,本游戏在社会可行性方面是完全可行的。
3.3 总体设计原则
总体设计原则的提出是为了确保系统建设成功,并为系统的可持续发展做出规划。因此在系统设计时,我们遵守以下原则:
简单性:实现游戏需求的前提下,尽可能的保证游戏简单易操作。一方面,简单的操作会使增进游戏体验,另一方面操作过于复杂时,游戏实现更易引入问题及漏洞[17]。
针对性:本项目是选用Python作为编程语言的飞机大战游戏,用明确项目需求为目标,具体需求具体实现,有很强的针对性。
实用性:飞机大战是一款优秀的休闲娱乐软件,从该系列游戏诞生以来就深受玩家的喜爱,具有娱乐身心、放松心情、减缓压力。而且由于该游戏较为普及,大多数玩家都熟知游戏操作方式,更乐于使用这一游戏,因此该游戏具有很强的实用性。
一致性:本游戏的飞机采用的是同一种画风的飞机,且多种飞机类是由飞机基类继承得来的,具有较高的视觉一致性。主界面采用tkinter模块进行编写,主界面上的元素统一使用标签插入,具有较高的功能一致性。
图3- 1 总体设计原则
3.4数据库设计
由于本游戏与数据库交互较少,只设计了一个表用作数据存储,其中包括四个字段:id(记录的唯一标识)、username(用户名)、password(密码)、score(分数)
图3- 2 用户表ER图
3.5系统流程图
本游戏的主要流程如下:
首先在打开游戏之后,如果有账号可以直接登陆游戏,如果没有账号可以注册或者是选择试玩。此时,初始化游戏,游戏开始。游戏开始后,敌方开始出现战机,与之对抗,如果玩家血量为0,则游戏结束,某敌方飞机血量为0,则玩家获得积分,当积分达到一定的设定时,游戏难度增加,敌方血量开始增加。此时进入下一关。当玩家选择退出游戏,则游戏结束,如果积分高于积分榜,则此次游戏玩家可以上榜。具体流程图如下所示:
图3- 3 系统流程图
3.6 系统模块设计
3.6.1 主界面选项卡功能
在主页面上放置5个按钮,分别是“登陆”、“注册”、“试玩”、“积分榜”、“设置”。
图3- 4 主页面流程图
图3- 5 主程序页面设计图
3.6.2 游戏难度的调整
随着积分的增加,游戏难度会提高,具体方式为提高敌机血量。
以难度1提升到难度2为例,当玩家的血量大于0,且当前难度为1,如果玩家积分超过40即可进入到难度2,此时敌方飞机数量和血量开始增加,每次难度提升,敌方飞机的血量都会增加。
3.6.3 游戏界面绘画功能
左侧是游戏界面,背景以森林和河流为主,飞机大战就是在这个背景下开展的。
右侧是工具栏,其中包括操作说明,本游戏是以键盘的上下左右四个键操作的。空格键可以操纵飞机发射子弹。下面是提示部分:R/r代表重生,B/b功能是自爆,S/s是开启/关闭,Q/q是暂停。
在右边工具栏中,存在分数和血量,以及炮弹的管数。以及提示最高分。
3.6.4 游戏控制功能
玩家可以通过控制键盘、鼠标来进行游戏控制。鼠标控制主要是左键单击界面内按钮元素,或者特定区域来触发绑定事件。
键盘控制共9个键,其中包括:来控制自方飞机的移动方向(上下左右四个键)、飞机子弹的发射(Space)、游戏暂停(Q/q)、飞机重生(R/r)、飞机自爆(B/b)、开启及关闭三倍子弹(S/s)。
图3- 6 操作按钮设置
3.6.5 结束游戏功能
游戏结束的判定分为两种:第一种是用户单击退出游戏按钮,退出游戏会触发绑定事件,调用积分模块,进行积分存储,然后程序会强制结束。第二种则是己方飞机受到攻击直至HP为0时,游戏界面给出游戏结束提示,然后调用积分模块,并提供重新开始与退出游戏。
3.7 游戏难点分析
(1)游戏程序是高度精确的程序系统,因为它们的代码利用率很高。最后工作的实时操作是用上千行的所有程序进行的,事件发生在键盘上,事件发生在键盘上,在后台响应频率很高,细微的差别很容易立即导致程序出错或死机后等待[19]。因此,逻辑设计应非常严格,设计中应考虑所有可能发生的事件和事故。
(2)为了美观和适用性,需要找到较为合适的飞机素材包,但是目前只有基础的飞机素材包。
(3)玩家的飞机操作可以通过键盘响应事件来控制,但敌方飞机的自动操作需要一定的智能;游戏并不那么容易,因为敌方飞机的飞机操作算法也需要设置。
(4)双方飞机需要考虑是否碰撞,以避免重叠操作。它以缺乏许多物理可能性和现实主义而告终。每个页面都会刷新,所有步骤都需要相关的冲突检测。
(5)游戏地图不能用绘图来解决。否则,很难控制和处理太多的元素,以及太多的大照片,所以不能限制程序的大小,从而失去了计算机屏幕显示的优势。
(6)游戏的结束、开始和动态信息屏幕是程序的重要组成部分。良好的用户界面是吸引用户的一个指标,还必须考虑相关的艺术构成和人性化设置。
(7)绘图美化。游戏优美清新的界面会给用户带来愉悦的心情和美感。所以在本游戏中, 借鉴现有的类似的游戏画面设计,使画面让玩家看起来更舒适和美观,给玩家带来不一样的游戏体验。
(8)多线程技术的实现。游戏控制的基础是线程机制。为了控制整个游戏,你需要刷线程帧,加载背景资源,并自动控制所有类型的滚动(敌方飞机或),这些功能的实现都要依赖于线程。
(9)碰撞问题的解决。例如,敌方飞机子弹和己方飞机,敌方飞机和己方飞机等等,综合运用数学和物理知识来实现碰撞检测,采用不同的检测方法以应对游戏中各种可能的情况,达到精确检测的目的。
第四章 主要功能具体实现
4.1 主界面选项卡实现
4.1.1主界面的实现
主页面设计采用tkinter模块的TK()方法进行创建窗口,并使用geometry()方法进行窗口属性设置,插入Button和Entry对象来创建按钮及输入框,并设置了绑定变量来获取输入框输入。
具体实现步骤为:
a.设置窗口属性,设置window.title为“飞机大战”。
b.设置三个标签分别为“飞机大战”、“账号”、“密码”,放置两个输入框,其中账号可显示默认账号。
c.密码的文本设置输入密码后显示
号,具体实现为entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show=’
’)。
d.在主页面上放置5个按钮,分别是“登陆”、“注册”、“试玩”、“积分榜”、“设置”。
图4- 1 程序主界面
4.1.2注册功能实现
玩家可进行账号注册,进行合法有效输入后,不与数据库内存在账号重复即可注册成功。
具体实现步骤为:
a.分别设置对应的标签和按钮。
b.使用cursor()方法获取操作游标 cursor = db.cursor()。
c.使用execute方法执行SQL语句,并使用fetchone()方法获取一条数据。
d.打开数据库连接。
e.对数据的合法性进行校验,校验不通过则提示错误信息。
f.如果校验通过,则执行sql语句,使用db.commit()函数将数据提交到数据库。
g.关闭数据库连接。
图4- 2 注册界面
4.1.3登录功能实现
玩家可输入账号密码进行登录,在进行输入校验及与数据库内数据匹配后,即可登录成功。
具体实现步骤为:
a.使用get函数获取玩家输入的账号和密码,首先进行输入校验,查看两者是否有空值,如果有提示用户账号或密码不能为空。
b.使用cursor()方法获取操作游标 cursor = db.cursor()。
设置列表变量用以存放SQL语句返回结果,然后执行SQL语句,从游标逐条获取返回结果。然后赋值给列表变量,由主程序作进一步判断或处理。
c.使用ececute()方法执行SQL语句。
d.查看用户信息是否存在于数据库,如果存在,则匹配其密码,正确则登录成功,错误则提示密码错误。如果不存在,则提示账号不存在。
e.关闭数据库。
图4- 3 登录功能实现
4.1.4试玩功能实现
在充分考虑部分玩家不想拥有账号的情况下,参考其他游戏,添加试玩功能。
实现逻辑:创建试玩账号,玩家点击试玩直接进行登录,游戏结束后,试玩账号的积分不记录至数据库。
4.1.5积分榜实现
积分榜:显示前N名玩家的积分信息(N<=20,当库内用户数量大于20时,N=20)
具体实现步骤为:
a.分别设置对应的标签和按钮。
b.使用cursor()方法获取操作游标 cursor = db.cursor()。
c.使用方法fetchall()并将返回值赋值给变量作为文本。
d.关闭数据库连接即可。
f.对文本进行格式处理,然后添加Label标签,把文本添加至积分榜页面进行展示。
图4- 4 积分榜
4.1.6游戏设置实现
游戏设置包含内容为音量设置。
a.创建滚动条对象scale1用以控制音量。
b.给确定按钮绑定事件(使用scale1.get()方法获取音量,并将该值赋给全局变量volum)。
c.将音量volum传递至游戏模块,音量设置生效。
图4- 5 音量设置
4.2 游戏功能实现
4.2.1游戏界面绘制
左侧是游戏界面,背景以森林和河流为主,飞机大战就是在这个背景下开展的。
右侧是工具栏,其中包括按键操作提示,分数和血量,以及炮弹的管数。以及提示最高分重新开始及退出游戏。
实现逻辑:右侧操作说明及游戏背景均使用图片插入。
图4- 6 游戏界面
4.2.2键盘及鼠标控制实现
按键控制包括 上下左右,space,R/r,B/b,S/s,Q/q共9个键。
对应关系如下:
移动(上下左右) 重生(R/r) 自爆(B/b) 开启及关闭三倍子弹(S/s)暂停(Q/q)
a.在游戏循环中,首先使用pygame.event.get()获取到用户事件。
b.然后对获取到的事件进行判断。
c.如果是键盘事件,就进一步判断按下的键是哪个,并触发对应事件;
如果是鼠标事件,则判断鼠标点击的区域,不同区域对应不同事件。
图4- 7 键盘控制实现(部分)
4.2.3飞机移动实现
(1)我方飞机移动
我方飞机移动分为单向移动与双向移动,如果玩家同时按下两个方向键就会同时朝综合方向移动,实现方法是为我方飞机类设置了8个方向的移动方法,根据按键调用对应的移动方法。
(2)敌方飞机移动
敌方飞机从屏幕顶端出现,向下移动至窗口上部,左右移动射击,射击子弹数量达到一定值后,添加向下移动。
图4- 8控制飞机移动代码展示(部分)
4.2.4发射子弹模块实现
子弹的实现依赖于飞机基类,飞机类中有两个与子弹相关联的属性。分别是存储发射子弹引用的列表和记录发射子弹数量的变量。子弹的伤害值由全局变量列表规定,不同飞机的子弹伤害值不同。子弹的碰撞逻辑是根据子弹图片与飞机图片是否重叠来进行判断的。敌机的子弹发射是随机的,通过控制随机函数的参数范围来调控子弹发射的频率。敌机设有子弹发射上限,小型飞机为10发,中型飞机为25发,BOSS飞机无上限。
当敌方飞机发射子弹达到上限后,就会向下移动,直到被友方飞机消灭,或者判定坐标超过了窗口上限,销毁该敌机对象。
4.2.5击中爆炸实现
判断击中的条件为子弹与飞机有重合部分,如果有重合部分,则清除子弹对象,如果飞机血量为0
则显示爆炸图片,并清除飞机对象。不同类型飞机的爆炸图片数量也不同,小型飞机、我方飞机、中型飞机为4张,BOSS飞机为6张。爆炸效果是引用图片,无论是敌方飞机还是己方飞机,在爆炸的时候,都是需要计数的,累计到一定数值才会爆炸(血量为0)
在设定爆炸的时候,有多个属性。
(1)self.hitted = False 表示是否要爆炸
(2)self.bomb_picture_list = [] 用来存储爆炸时需要的图片
(3)self.bomb_picture_num = picture_num 飞机爆炸效果的图片数量
(4)self.image_index = 0#用来记录当前要显示的爆炸效果的图片的序号
以中型飞机爆炸第三张图片为例,爆炸效果图片如下所示:
图4- 9中型飞机爆炸图片
4.2.6展示血量和绘制血条
不同类型的敌方飞机拥有不同血量,我方战机初始血量为50,随着大战的继续,难度逐渐提高,敌方飞机的血条逐渐增加。由玩家当前积分决定敌方飞机的血量,积分越高,敌方飞机血量越长。对于玩家自身的血量,则体现在游戏界面的右侧,玩家可以实时观察自己的生命值。
血条是最直观体现敌方飞机的血量的属性,血条使用pygame.draw.line进行绘制,长度与敌方飞机血量有关,并根据敌方飞机血量实时进行变化。
图4- 10血条展示
4.2.7积分模块实现
(1)积分获取
击毁敌方飞机可以获得积分,积分的数值由敌方飞机的血量决定,击毁小型飞机可获得HP
100%积分,击毁中型飞机可获得HP
50%的积分,击毁BOSS飞机可获得HP*25%的积分
(2)积分存储
每个玩家在游戏结束时,如果积分大于该玩家在数据库内的原有积分,则会对积分进行存储。最高分可以写入文件中,执行SQL 更新语句,将新的数据提交到数据库执行,关闭数据库。
a.首先进行判断是否为试玩账号,如果是则不进行存储。
b.使用cursor()方法获取操作游标
c.使用execute方法执行SQL语句
d.关闭数据库连接。
e.循环输出积分榜上信息
图4- 11 积分存储
第五章 系统测试
测试就是通过静态审查或者运行程序从而找出软件实现过程中是否与需求存在偏差。除此之外,测试还需要软件质量进行度量,推进问题修复。测试的原则之一是测试应当尽早介入,即在软件开发过程中,越早发现问题,该问题的修复成本就越低。在寻找错误的过程中,不断完善系统,尽量的避免问题出现与系统投入使用过后,修复成本大幅度增加的情况。因此,进行全面的系统测试是不可或缺的[20]。
在实际的测试流程中,将在设计阶段根据需求撰写测试用例,并根据实现情况对用例进行补充及修改,验证需求实现情况,提出问题并推进修复,最后给出软件质量度量。
执行程序给定输入,并校验程序输出是否符合预期结果是黑盒测试的标准流程。它不必关心程序的内部实现逻辑,不需要涉及代码层面[21]。与之对应的是白盒测试,大多是通过静态代码审查的方式,不运行程序,凭借程序实现的逻辑结构,来检查程序是否满足需求,符合预期。
5.1 测试的定义及其重要性
5.1.1 测试的定义
软件测试是直接影响软件质量评价的重要部分,是用来衡量实际输出和预期结果之间的审核比价过程。软件测试不仅要注意战略,还要及时,越早发现问题,修复成本就越小。测试的作用就是在衡量成本的条件下,尽可能的找出问题并推动问题修复,为软件质量作出度量,避免问题出现在系统投入使用后,减少修复成本。
5.1.2 测试的重要性
随着软件行业的蓬勃发展,人们更加关注的是软件质量的实现,因此软件测试就愈发重要。在软件工程中,这是必不可缺的一环。在操作和维护阶段之前,应确保软件的质量,然后在操作和维护阶段向用户提供软件产品。越来越科学的测试理论、测试方法不断涌现,普遍认为:软件测试应该在项目之初就进行介入。虽然软件测试的原则之一就是测试不可能发现所有BUG,软件必定是存在BUG的。但是为了减少错误的引入,我们可以使用完备的开发过程、有效的开发方法和新的语言,但这些方法只是最大程度的降低了错误。通过测试来检测这些误差是很有必要的[22]。BUG具有集群性,符合“二八原则”。测试过程中,通过统计问题分布,可以推算哪些模块需要继续进行测试。
5.2 测试方法及过程
白盒测试是基于代码的一种测试设计方法。测试人员通过审查代码、明晰代码实现逻辑后,以验证程序逻辑为目标,构造测试用例及数据。与之对应的黑盒测试,则是将程序视作一个“黑盒子”,不关心程序内部的实现逻辑,只着眼于外部结构,设计输入数据及预期结果[23]。运行程序、进行输入,然后得到实际结果从而验证软件是否满足需求。
探索性测试是一种测试思维与理念,在对系统有一定了解的情况下,不严格拘泥于先设计后执行的测试思路。探索性测试是设计与执行同时进行的,实践表明,探索性测试往往能暴露出更多的问题。
在飞机大战游戏中,综合采用了两种方法,还结合了探索性测试的思路,使测试过程可以暴露更多问题。
本次测试主要达到以下测试目的:
(1)功能检查:根据需求与实现产品,验证功能需求实现情况,检查功能实现是否有遗漏偏差。
(2)数据检查:主要对用户、积分信息进行检查,检查数据库与程序之间的交互部分。
(3)性能检查:针对于本次的飞机大战游戏,该项主要是检查游戏帧率,是否存在卡顿现象
(4)稳定性检查:由于事件读取是从鼠标键盘上获取的,而导致后台响应频率较高,所以要检查程序是否出现运行终止、重启等现象。
5.3 测试结果
5.3.1评价
软件评价是指软件正式运行后,根据需求对软件的功能、性能、结构、界面友好性等内容做出客观表述[24]。
功能评价
本软件可流畅运行、界面风格简单友好,实现功能可以满足玩家需求。
(2)数据评价
数据库设计合理完全可以满足使用需求,且程序与数据库交互良好,维护成本低。
性能评价
游戏主内容性能良好,游戏对玩家的可交互性良好,但程序打开与开始游戏时,停顿时间较长。
稳定性评价
程序运行过程中未发生程序终止、重启等异常现象。
5.3.2 BUG修复进度
几乎所有的计算机程序都有缺点,而且还有一些明显不受保护的软件没有经过仔细维护。即使是Windows也存在许多类型的错误和漏洞[25]。 在选本游戏作为课设的时候,刚开始感觉逻辑复杂,难以控制,因此产生了大量BUG,现在BUG已完全解决,重要程度为高的BUG如下:
(1)注册页面,注册时 两次密码不一致时,提示信息弹出,关闭后,直接跳到主页面,原来注册页面被隐藏。
(2)主界面多次点击注册 会出现多个注册界面(积分榜界面、设置界面同样存在该问题)。
(3)游戏中飞机死亡后可以继续进行射击。
(4)窗口位置应设置在显示屏顶端 及窗口长度过长。
(5)注册时,用户名不能含有英文字符,目前只能注册纯数字组合的用户名(SQL语句中缺少‘’导致)。
(6)小型飞机的碰撞检测过小。
由于水平关系,代码变量太多,游戏运行效率低下。有很多重复结构。希望在以后编程水平提高时再优化整个程序。
第六章 总结与展望
本次课题研究是基于兴趣爱好的一次实践,兴趣爱好给予了我很大的动力,这也使我在遇到各种问题时,总能通过多种渠道找到解决方案。虽然是第一次使用Python开发游戏,在一边进行学习,一边进行游戏开发和设计过程中,遇到了很多问题,也走了不少弯路,但锻炼了自我解决问题的能力。这次课题研究不仅让我对Python有了进一步的了解,而且还大大提高了编程能力,锻炼了自己的逻辑思维和整体设计的能力,收获颇多。通过这次课题研究,我意识到完整的软件开发思路是非常重要的,它关系到我们开发过程能否顺利实现。在项目开始之前,必须有软件工程的系统化的知识体系,不仅如此,还应包括软件结构位置、代码编写和模块划分和整体布局,只有做完这些步骤,才能逐步开发出想要实现的功能。这样定能达到事半功倍的效果。
整个软件按照计划大致实现了游戏的具体功能,虽然游戏能正常运行,不过因所学知识及开发周期有限,还有很多需要改进的地方,有待于日后进一步的改进和完善。
经过汇总测试人员的建议,本游戏应该完善的功能如下:
(1)游戏未继续美化,主界面过于简洁,部分飞机图片不包含击中与击毁图片,只能使用较为简单的飞机模型。
(2)BOSS未设置过多技能,没有设置过关动画。
希望日后,我能够有能力对这个游戏进行改进,以优化系统,完善玩家体验、使游戏更加流畅美观。
参考文献
[1] [美]Wesley J. Chun著 宋吉广译 《Python核心编程》(第二版) 人民邮电出版社
[2] 小甲鱼著 《零基础入门学习Python》 清华大学出版社
[3] [英] Ben Forta 著 刘晓霞/钟鸣 译《MySQL必知必会》 人民邮电出版社
[4] 李瑞祥,刘伟.MYSQL数据查询技巧[J].网络安全和信息化,2019(05):70-71.
[5] Jason Briggs 著 尹哲译 《趣学Python编程》 人民邮电出版社
[6][美]Bill Lubanovic著 丁家瑞 译 《Introducing Python》 人民邮电出版社
[7][挪威] Magnus Lie Hetland著 凌杰 陆禹淳 顾俊 译 《Python算法教程》 人民邮电出版社
[8] [美]Jonathan S.harbour 著 李强译 《Python游戏编程入门》 人民邮电出版社
[8] [瑞典] Jan Erik Solem 朱文涛/袁勇 译《Python计算机视觉编程》 人民邮电出版社
[9] [美] Al Sweigart著 李强译《Python游戏编程快速上手》 人民邮电出版社
[10] [美]James Payne著 张春晖 译《Python游戏编程入门》 清华大学出版社
[11] [美]Eric Matthes 著 袁国忠 译《Python编程:从入门到实践》 人民邮电出版社
[12] 张子良,陈俊豪,申明华.基于Python的数据处理及图形化分析平台的设计开发[J].汽车实用技术,2019(06):71-73.
胡崇刚.软件工程的标准化[J/OL].电子技术与软件工程,2019(10):48[2019-05-31].http://kns.cnki.net/kcms/detail/10.1108.TP.20190524.1656.082.html.
沈鑫,陈华山.关于软件需求分析的理解[J].现代信息科技,2018,2(11):13-14+17.
瞿苏.基于Python的飞机大战游戏设计[J].扬州职业大学学报,2019,23(01):35-39.
郑宪秋.软件工程技术在数据库设计中的重要性及应用[J].电子技术与软件工程,2019(07):158.
吴玑震,戴天啸,马春江,汪婵.飞机大战游戏软件中的数据结构和策略分析[J].信息与电脑(理论版),2016(13):145+154.
梁孔科,李芳莹.基于Python脚本语言的Web开发应用研究[J].信息与电脑(理论版),2019(06):72-73.
吴文庆.软件开发中测试驱动开发的运用[J/OL].科技资讯:1-2[2019-05-31].https://doi.org/10.16661/j.cnki.1672-3791.2019.11.01
孙佳美.基于Java飞机大战的设计与实现[J].无线互联科技,2016(01):54-55
. ScaleGrid; MySQL Hosting on Azure, Fully Managed Cloud Database Service Launches at ScaleGrid[J]. Computers, Networks & Communications,2018.
孔韬,王俊江.软件需求管理的工程应用[J].电子质量,2018(10):60-62.
项楠.软件测试策略和测试方法的应用分析[J].科学技术创新,2019(11):64-6
陈豪文,周璐雨,宁志豪.认识软件测试[J].科技风,2019(14):69.
阚青.对软件测试过程中的质量管理及风险应对分析[J].电子技术与软件工程,2019(03):40.