收藏关注不迷路
飞机大战是一种非常传统的电脑游戏,也是非常经典的游戏之一,经常可以在电脑,手机,以及各类便携式游戏机中见到。传统的老式飞行游戏以平面,灰白画面为主。而现在,随着计算机性能的飞速发展,我们目前可以在计算机上见到种类更加繁多的飞机大战。Python语言目前的使用范围非常广泛,使用者们也非常喜欢,而其自身的优越性也因此就得到了迅速的发展。这对C++,java等近些年来流行的语言造成了很强的影响。拥有良好的通用性,作业迅速,良好的跨平台和稳定性是Python技术的优点。目前,像个人电脑、数据操作、电脑和手机游戏后台、手机移动端和计算机应用的很多方面都在使用Python作为开发语言,技术稳定成熟,开发时间短,重复性好,在线扩展方便。本游戏是一个基于面向对象编程思想,选用Python开发语言,Python3.9为开发工具,Pygame模块为主体,而实现于PC端的一款飞机大战游戏。该游戏操作灵活简单,趣味性较强,玩家可以通过键盘进行游戏操作,通过移动躲避敌方飞机,并发射子弹消灭敌方飞机,从而获取积分。游戏主要涉及了实现飞机移动、发射子弹、多条生命、碰撞检测、敌方飞机血量检测、事件监听、发放补给包,刷新游戏画面及音乐,记录游戏分数,使游戏简单耐玩,更具趣味性。
关键词:Python;飞机大战;游戏;Pygame;
在本游戏中,玩家可以通过按下键盘的上下左右或WASD(对应上下左右)来操作飞机的位置,按下空格键会释放超级炸弹,超级炸弹会直接摧毁出现在屏幕中的所有敌方飞机,当然,超级炸弹有存储上限,为三发,玩家可以通过三十秒一次的随机补给来获得超级炸弹,或者双倍子弹时间,双倍子弹时间内,玩家操作的飞机会发射双排子弹。玩家通过发射的子弹或全屏炸弹摧毁敌方飞机来获取游戏积分,玩家一共有三条生命,三条生命共享全屏炸弹数量以及双倍子弹的持续时间,每次玩家死亡后会在屏幕中下方位置重生,如果生命数用光且玩家再次死亡则游戏结束并记录游戏分数。敌方不同型号的飞机拥有各自的属性,中大型敌方飞机拥有比小型飞机更多的血量,而且中大型敌方飞机被击毁后玩家获得的分数也比小型飞机要高。而当我放飞机与敌方飞机发生碰撞时,我方飞机与敌方飞机会同时损毁。
当积分达到临界值游戏难度会发生变化,变化在于增加敌方飞机的数量和速度,尤其是中型,大型飞机的数量,在游戏中,会适当发放补给。补给内容分为增加超级炸弹储存量、限定时间内获得双倍攻击子弹,游戏主画面是一个“广阔天空”的背景图片及飞机与子弹对象。玩家操作主要包括,己方飞机的移动、发射子弹、使用超级炸弹、退出游戏等。
本软件是基于windows系统的开发的一款娱乐软件,打开既玩。
积分显示:系统会记录玩家最高分
游戏功能:飞机移动、发射子弹、多条生命、碰撞检测、使用超级炸弹、敌方飞机血量检测、事件监听、给予补给包等功能。
通过Python的PyGame模块完全可以实现本游戏中所需求的事件。PyGame模块包含可以导入音乐以及各个飞机种类的图片,所以所有必要的游戏功能和概念(特别是图片的交互)都完全简化为游戏逻辑本身。综合以上情况及考虑,本游戏的开发在技术上是完全可行的。
要使用Python进行游戏开发的话,那么一定会用到Pygame模块。Pygame模块是利用SDL库实现的[11]。Pygame的代码是开源共享的。Pygame可以用来创建完全界面化的游戏和多媒体程序、而且使用Pygame编写的软件可以在绝大部分平台和系统中运行[12]。Pygame主要包含以下功能:绘制图型、显示图片、动画效果、与键盘鼠标和手柄的外部设备的交互、声音处理及播放、碰撞检测。
Python通过分离Python脚本与游戏引擎之间的数据交互,达到逻辑与具体实现分离的目的,使其更加丰富[9]。
Python脚本可以基于Python和C++在Python和C之间进行交互,其中最重要的部分是异常的处理和数据格式的转
换[10]。
————————————————
本游戏的主要流程如下:
首先在打开游戏之后,初始化游戏,游戏开始。游戏开始后,敌方开始出现战机,玩家控制自己的飞机与之对抗,如果玩家飞机撞到敌方飞机,则游戏结束,敌方飞机被摧毁,则玩家获得积分,当积分达到一定的设定时,游戏难度增加。此时进入下一关。当玩家选择退出游戏,则游戏结束,如果积分高于最高纪录,则更新最高记录。具体流程图如下所示:
图3- 1 系统流程图
(1)页面内容包括:游戏主体页面、当前分数、我方飞机、敌方飞机血量、敌方大型飞机血量、我方生命数、我方剩余超级炸弹数量。
(2)玩家飞机可以:上、下、左、右、左上、左下、右上、右下移动、控制飞机射击、多条生命、捡取补给、重生、是否使用超级炸弹功能。
(3)敌方飞机分为:大、中、小型敌机共三种共三种,不同型号的敌方飞机移动速度,血量也不同。敌方飞机不会发射子弹,但可以通过碰撞我方飞机使我方阵亡,中型以上敌方飞机具有血条。随着分数的增加,敌方飞机数量也会增加。
(4)补给包括两种:
蓝色子弹补给:18秒内双倍子弹。
红色炸弹补给:增加超级炸弹的数量(最多三个)。
随着积分的增加,游戏难度会提高,主要体现在提高敌方飞机机的数量与速度。
如果当前不是最高难度,且玩家飞机处于存活状态并且游戏分数达到了下一难度的临界值,那么会实时增加当前游戏的难度:增加敌方大型飞机与中型飞机的数量与移动速度。当玩家达到下一难度时,在当前基础上继续增加敌方大型飞机与中型飞机的数量与移动速度直到最高难度,达到最高难度后不在增加敌方飞机的数量与速度。
玩家通过键盘来控制己方飞机的移动,控制按键为上下左右或WASD(对应上下左右)启用超级炸弹(空格键)。还可以通过鼠标点击暂停图片来暂停游戏,当玩家结束游戏后可以用鼠标选择“重新开始”或“结束游戏”。
图3- 2 操作按钮设置
有两种情况会触发结束游戏的功能:
(1)己方飞机剩余生命数为0且阵亡,此时判定用户本次游戏分数是否会超过历史最高分,超过则替换本次游戏分数,并跳转到结束页面为用户提供重新开始或结束游戏选项。
(2)用户直接用鼠标点击关闭,此时会判定用户本次游戏分数是否会超过历史最高分,超过则替换本次游戏分数,并强行结束程序
左侧是游戏界面,背景以天空为主,飞机大战就是在这个背景下开展的。
界面上方为游戏分数,暂停按钮,下方为生命数和超级炸弹的剩余数量。
图4- 2 游戏界面
按键控制包括 上下左右,space,W,A,S,D共9个键。
对应关系如下:
移动(上W下S左A右D) 使用超级炸弹(space)
如果是鼠标事件,则判断鼠标点击的区域,不同区域对应不同事件。
图4- 3 键盘控制实现(部分)
(1)我方飞机移动
我方飞机移动方向有上、下、左、右、左上、左下、右上、右下共八种,其中左上、左下、右上、右下可以通
过同时按两个方向键(左上、左下、右上、右下)实现。
(2)敌方飞机移动
敌方飞机从屏幕顶端出现,自动向下移动,大中小型飞机拥有各自的移动速度并随着分数的增加而增加自身的
移动速度。
图4- 4 控制飞机移动代码展示(大型敌机)
子弹发射位置的实现依赖于我方飞机的飞行位置,因为子弹是在我方飞机的中部顶端发射出去的(双倍子弹会从双侧发射出去),子弹的速度应略快于己方飞机,子弹的碰撞逻辑时根据子弹图片与敌方飞机图片是否发生碰撞来进行判断,如果击中敌机则该颗子弹消失,如果未击中敌机,则子弹在达到最大射程后消失。
图4- 5 子弹模块实现代码(普通子弹)
当己方飞机发射的子弹与敌方飞机发生碰撞时,立即清除己方子弹,并在子弹与敌方飞机发生碰撞的位置播放该型号飞机的损毁动画,其中敌方小型飞机的损毁图片有四张,中型敌机也是四张,为了体现出大型敌方飞机的独特性,大型敌方飞机的损毁图片有六张图片。爆炸效果就是通过切换不同型号的飞机的损毁图片与播放爆炸音效展现出来的。
在设定爆炸的时候,有多个属性。
(1)self.active = False 表示是否要爆炸
(2)self.destroy_images = [] 用来存储爆炸时需要的图片
以中型飞机爆炸第三张图片为例,爆炸效果图片如下所示:
图4- 6中型飞机爆炸图片
中大型敌方飞机拥有各自的血量,而血条可以直观的体现出敌方飞机血量的属性,血条可以使用pygame.draw.line进行绘制,它的长度与不同型号的敌方飞机的血量有关,并且可以根据敌方飞机的现有血量进行变化,当血量低于总血量的百分之二十时血条颜色会从绿色变为红色。
图4- 7血条展示
1 绪 论1
1.1项目的背景和意义1
1.2国内外的研究现状1
1.3项目主要内容(简述准备做什么)1
2 需求与可行性分析3
2.1 需求分析3
2.2 可行性分析4
3 飞机大战游戏模块设计5
3.1开发平台5
3.2开发技术5
3.3系统流程图6
3.4系统模块设计7
3.5游戏难点分析8
4 主要功能具体实现10
4.1 主界面实现10
4.2 游戏功能实现10
5 系统测试15
5.1 测试的风险及其重要性15
5.2 测试方法及内容16
5.3 测试结果分析17
结 语18
参考文献19
致 谢20