




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖南理工学院毕业设计(论文) 学 号 毕业设计(论文)题目:基于python的植物大战僵尸游戏设计与实现作 者 届 别 届 院 别 信息与通信工程学院 专 业 信息工程 指导教师 职 称 _ 完成时间 20xx年5月9号 摘 要 植物大战僵尸是现在一款非常热门的网络游戏,网络游戏发展至今,市场竞争相当激烈,这就促使开发者必须快速、高效的响应玩家需求才能占得一席之地。传统的网络游戏开发应用C/C+实现游戏的逻辑功能,随着游戏内容越来越丰富以及快速变化的市场需求,C/C+已经不能满足开发者对于语音的灵活性、易用性动态编译的需求。为此文中提出了一种基于Python的游戏脚本系统,通过将游戏内容与游戏引擎相分离、避免硬编码,提高了游戏的开发效率和稳定性。 本文主要利用Python语言,Python语言能更好的来处理和解决这些问题,Python最大的特点是其独特而又简洁的语法,这样就让让游戏开发变得简单,使用PyGame模块,简单方便地控制游戏的图像、声效等。 关键词:Python;植物大战僵尸;PyGameAbstract Zombies is a very popular network game, the network game development so far, the market competition is fierce, which prompted developers to quickly and efficiently respond to the demand to occupy a space for one person game player. The traditional network game development and application of C/C+ to realize the logic function of the game, with the game more and more rich content and fast changing market demand, C/C+ has been unable to meet the developers for the voice of the flexibility and ease of use of dynamic compilation requirements. In this paper, a game script system based on Python is proposed, which improves the efficiency and stability of the game by separating the game content from the game engine and avoiding hard coding. This paper mainly uses the Python language to deal with and solve these problems, Python language can better Python, the biggest feature is its unique and concise syntax, so let the game development easy, use PyGame module, simple and easy to control the game image, sound etc.Keywords:Python; Plants vs Zombies; PyGame目 录摘 要2Abstract21 引言52 游戏开发所需的工具72.1 Python72.1.1 Python是什么72.1.2 python的优点82.1.3 python的搭建82.2 python开发工具92.2.1 Vim92.2.2 Emacs92.2.3 PythonWin102.2.4 其他的python开发工具112.3 PyGame113 游戏规划设计124 收集资源144.1收集图片素材144.2 收集声效素材165 编写初始脚本175.1 定义游戏初始环境175.2 导入游戏素材196 编写游戏核心脚本236.1 编写游戏循环脚本236.2 处理事件响应玩家的操作256.3 添加角色到游戏276.4 更新角色状态286.5 重绘画面306.6 判断角色交战状态316.7 判断胜负状态317 总结32参考文献33致谢34 1 引言1.1简介前景 植物大战僵尸游戏最早被命名为活死人之园(Lawn of the Dead),影射僵尸电影活死人黎明(Dawn of the Dead)。因法律原因,最终改名为植物大战僵尸(Plants vs.Zombies)。 植物大战僵尸是一款极富策略性的小游戏。可怕的僵尸即将入侵,每种僵尸都有不同的特点,例如铁桶僵尸拥有极强的抗击打能力,矿工僵尸可以挖地道绕过种植在土壤表面的植物等。玩家防御僵尸的方式就是栽种植物。49种植物每种都有不同的功能,例如樱桃炸弹可以和周围一定范围内的所有僵尸同归于尽,而食人花可以吃掉最靠近自己的一只僵尸。玩家可以针对不同僵尸的弱点来合理地种植植物,这也是胜利的诀窍。游戏根据玩法不同分为五种游戏模式:冒险、生存、花瓶破碎者、小游戏、花园。加之黑夜、屋顶、浓雾以及泳池之类的障碍增加了其挑战性该游戏近乎永无止境。 植物大战僵尸集成了即使战略、塔防御战和卡片收集等要素,玩家控制植物抵御僵尸的进攻,保护这片植物园。游戏中可以选用的植物有40多种,而每个场景最多只能选用10种植物,这就需要玩家根据自己的游戏策略来作出取舍。因为它成功地借鉴了一些战略游戏的要素采集资源并利用资源建造其它单位,有些玩家甚至拿星际的战略往这款游戏中套用,以阐述这款游戏需要在何时发展“经济”,何时发展“兵力”。 这款游戏要求玩家既有是大脑的智慧,又有小脑的反应。在有了正确的战略思想之后,还要靠战术将战略实现出来。战术范围包括很广,植物的搭配、战斗时的阵型、植物与僵尸相遇时是战是防这都属于战术的范畴。正确的战术是玩家在战斗中胜利关键。选择正确的战术,需要先分析情况,再做出决定。那么提高战术水平也是要提高分析情况的能力。 植物大战僵尸,理所当然,它就是可以再手机和电脑上面运行的游戏,就一般的游戏而言,大多都是运用Java编程语言来开发的,随着手机行业的不断发展,手机游戏的更新也不短与时俱进,那些简单的手机游戏早已满足不了手机用户的需要,不再如七八十年代手机游戏,只是简单的单机游戏,游戏简单,游戏规则简单。而我们现在需要用Python进行开发。现在的手机游戏完全可以联网互动。游戏不再只是在掌机上的游戏,然而,作为运行在手持移动终端设备上的软件,手机的硬件性能决定了手机游戏的特色:对于手机用户,一直都存在十分庞大的用户群,据不完全拥挤,目前手机用户以远远超过10亿部,此用户群同时也在不断的增长。因此,手机端游戏的市场具有十分庞大的潜力,可以说是无可限量。更要说到的其便携性,游戏时代,掌机的市场一直十分巨大随时随地人们可以将游戏放在口袋,陶醉在自己喜欢的游戏中。虽然手机还不算是一个非常专业的游戏平台,但其可以随身携带的特性征服了一群又一群的年轻人,手机游戏已经成为人们消遣时间的首选神器。同时手机也支持网络,多人在线游戏也不再是梦想。 为什么要用Python语言来进行开发。一是编写游戏程序是一个很复杂的过程,游戏程序需要对图像、声效、控制等进行很好的控制,需要开发者具有较高的程序设计技能。不过Python却让游戏开发变得简单了,使用PyGame模块,可简单方便地控制游戏的图像、声效等。二是Python最大的特点是其独特而又简洁的语法。Python是最近几年发展起来的,发展速度极其的快速,并且早已成为当今世界的主流语言总之,就是在最短的期限内开发出一款更被玩家喜欢的的游戏,这样才会有更大的商机。否则,就会是一个十分巨大的损失。 2 游戏开发所需的工具2.1 Python 2.1.1 Python是什么 Python是目前流行脚本语言之一,它是由Guido van Rossumc创建的。Python语言主要受到教学语言ABC和Modula-3的影响。Python被设计得简洁、优美却又不失脚本的灵活性和拥有强大的功能。Python的主要特点可以用下图表示。Python语法简单,易学易用Python是面向过程的和面向对象的Python的模块丰富,功能强大Python是跨平台的,具有可移植性Python具有很好的扩展性python Python最大的特点是其独特而又简洁的语法。在python源代码中,通过代码在行中不同的缩进量来表示代码所属的语句块,从而不需要使用类似C/C+的用户来说,可能会有点不适应。但是,python强制性的缩进可使代码看起来更加清晰,并且使用缩进在一定程度上减少代码输入量,当然是所使用的代码编辑器支持自动缩进。 使用python可以快速的进行编程开发。语法非常简单,对于初学者来说并不困难。作为脚本语言,python非常灵活,使用python可以实现各种各样的功能。Python遵循GPL协议,是源代码开放软件。 2.1.2 python的优点 Python遵循GPL协议,是自由软件,这是python流行的原因之一。用户使用python进行开发和发布自己编写的程序不需要支付任何费用,不用担心版权问题。即使作为商业用途,python也是免费的。作为自由软件,最令人鼓舞的就是可以很方便地获取源代码。程序员通过阅读其源代码,发现其中的神奇之处。 跨平台、良好的移植性是C语言成为经典编程语言的关键,而python正是用可移植的ANSIC编写的,这就意味着python也是具有良好的跨平台特性。也就是说,在windows下编写的python脚本可以轻易地运行在Linux下。 Python强大的功能也许才是很多用户支持python的最重要的原因。从字符串处理到复杂的3D图形编程,python借助扩展模块都可以轻松完成。 Python提供了扩展接口,通过使用C/C+可以为python编写扩展。另外python还可以嵌入到C/C+编写的程序之中。在C/C+编写的程序之中可以使用python完成一些对于C/C实现起来较为复杂的任务。 Python的语法十分简单,而且在python中数据类型的概念十分模糊。在使用变量时无须事先声明变量的类型。使用python不必关心内存的使用和管理,python会自动的分配、回收内存。Python提供了功能强大的内置对象和方法。使用python可以减少其他编程语言的复杂性。 2.1.3 python的搭建 Python可以运行在多种操作系统上,我们在本次毕业设计中利用windows。Python官方网站提供了windows下的安装程序,通过运行安装程序可以非常方便的安装python。除了安装python以外,还应该选择用于编辑python脚本的文本编辑器,提高编辑脚本的效率。因为在python中,是使用缩进来表示语句块,因此所以选择的文本编辑器最后具有自动缩进功能。 我们在前面说了python是跨平台的,可以运行在绝大多数的操作系统中。程序员平常用得比较多的操作系统主要包括:windows、Linux/unix、mac os x、os/2.这些操作系统都可以使用python,因此,对于普通的用户而言,一般不需要担心自己所使用的系统不能运行python(绝大多数的流行操作系统都可以使用python)。2.2 python开发工具 2.2.1 Vim Vim(Vi IMproved)是由Bram Moolenaar编写的功能强大的文本编辑器。 Vi是UNIX下经典的文本编辑器,也是每个UNIX系统标准配置的文本编辑器,Vim是Vi的改进版本。Vi只能在UNIX下使用,而Vim既可以在UNIX下使用,也可在windows下使用。Vim和其他开源软件一样,具有非常好的可移植性。 Vim提供强大的程序代码编辑功能,如自动缩进、代码折叠、语法高亮等。因此,可使用Vim作为python的开发工具。 Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版,而 gVim 则是其 Windows 版。它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门变得困难,但上手之后键盘流的各种巧妙组合操作却能带来极为大幅的效率提升。 因此 Vim 和现代的编辑器(如 Sublime Text)有着非常巨大的差异,而且入门学习曲线陡峭,需要记住很多按键组合和命令,如今被看作是高手、Geek们专用的编辑器。尽管 Vim 已经是古董级的软件,但还是有无数新人迎着困难去学习使用,可见其经典与受欢迎程度。另外,由于 Vim 的可配置性非常强,各种插件、语法高亮配色方案等多不胜数,无论作为代码编辑器或是文稿撰写工具都非常给力 2.2.2 Emacs 现如今讨论得最多的文本编辑器是Vim和Emacs,而且关于是选用Vim还是Emacs的争论从来没有停止过。 Emacs被设计得无所不能,号称是世界上最强大的文本编辑器。与Vim不同,Emacs不是有模式编辑器,使用Emacs就像使用windows的记事本一样,但Emacs比windows记事本的功能要强大得多。 Emacs 用 Lisp 开发,Lisp 不同寻常的语法决定了其开发者都是资深开发者,掌握了多门语言.Lisp 并不能给你带来任何好处,所以其社区成员都是纯粹的技术爱好者,投机取巧的功利主义者对其没有兴趣。 Emacs有一个内置的包管理系统,可以非常方便的安装和卸载拓展包,这也意味着你只需要带一份配置文件就能走天下了;vim的包管理是别人写的插件,像vundle,使用也很方便,目前存在的最大问题是不支持主题插件,以及想自动安装插件前先手动安装管理插件。好希望vim把vundle随版本发行啊。不过考虑到作者甚至觉得vim没有改进的必要来看,不太能了(vim能折腾的东西实在太多了)。 Emacs快捷键很多,靠记忆是很难的,要熟练使用到肌肉记忆的程度,依据使用强度大概1月到1年,到那时你才能忽略编辑器的存在,过程是比较难受的,相比收获也会很大;vim快捷键也不少,我看着vim用户指南(300多页,还有个2000多页的版本)记快捷键笔记记了近1000行,vim是模式编辑器(Emacs的模式跟此不是一回事),大部分快捷键都是单字符或双字符,相比Emacs较短(ctrl,shift,alt+字母),个人觉得使用操作流畅。无意引起误会,最后你能熟练使用20种快捷键就够了,两个编辑器都是。 Emacs的插件整体程度比vim质量高,数量多,功能强,一方面因为Emacs的配置语言elisp很强大,vimL相比就是玩具,另一方面个人觉得是在programer的文化中,牛逼的黑客都是用Emacs(好像没什么因果),很少听说vim黑客或大牛,好也不好,取决于你是否要为一款编辑器学一门语言了(这非必需,因为更可能的是你用别人的插件,参照配置下就能解决问题,问题是万一文档落后,你又英文不好,再加上百度的搜索,更常见的是,解决插件的一个小问题你得花一天时间不止,vim也存在这问题,好在vimL没太奇葩且你可以用vim的脚本语言接口)。可能是因为设计哲学和使用场景的原因,vim似乎并不追求太强大的插件,因为会拖慢vim的启动速度。 Emacs功能强大,我是指那些很奇怪的功能,如浏览器(w3m插件,相信我,你不会喜欢的,表现很糟糕),如煮咖啡,目前没怎么听说vim有此”神功“,也可能跟使用场景有关(见下)。除此外,就是插件的增强了,Emacs有很多大项目,用于实现IDE功能,如智能补全,代码重构,项目管理之类的,用Elisp写的,最开始发现这的时候只有跪拜的份。但是,作为同样成熟的,有漫长发展史(似乎是30年)的编辑器,不可能存在明显的功能的差距(请不要跟其他编辑器比较,他们太弱了)。 2.2.3 PythonWin 前面所提到的Vim和Emacs两种文本编辑器各有特色,但上手较难。尤其是Emacs在操作的时候需要使用大量的快捷键,初学者很难记住。不过,一旦习惯,并且深入学习Vim和Emacs后,会发现他们确实非常强大。 在windows下还有一个比较好用的python脚本编辑器PythonWin所附带的编辑器。PythonWin是python在windows下的扩展包,使用pythonwin可以让python使用window系统的特性。 2.2.4 其他的python开发工具 除了上面的Vim、Emacs和pythonwin外,开发python时还有很多编辑器或者集成开发环境可供选择。另外,python自身还附带了一个 图形化的交互式环境IDLE,使用IDLE也可以编辑python脚本。下面我就简单的介绍一下可以作为python集成开发环境的软件。 Blackadder: blackadder可以运行在windows和Linux系统中。Blackadder为用户提供了个人版和专业版,分别面向个人用户和商业用户 。 Wing IDE:wing IDE 是使用python编写的,可以运行在windows和Linux 系统中。Win IDE提供一个源码分析器、浏览器以及文本编辑器和调试器。 Komodo:komodo是ActiveState提供的一个python IDE,除此之外,Activestate还有自己的windows版本的python。 Boa Constructor:Boa是使用python和wxPython编写的跨平台的python IDE,它提供可视化的编程和操作框架,能方便地进行程序的设计。 PyDev:PyDev是Eclipse中的python开发插件。 Eric3:Eric3是一个功能强大的python IDE,它基于QScintilla编辑器组件,使用python和PyQt编写。Eric3中集成项目管理工具,可以生成类UML的图表,还包含一个功能强大的python调试器。 DrPython;Drpython是一个跨平台的高可配置的程序开发环境,使用python编写。DrPython基于wxPython和Scintilla库。 SciTE:SciTE是一个基于SClntilla和GTK+开发的,可以运行在windows和Linux系统中。SciTE支持语法高亮、代码折叠等,并可以将代码导出为HTML、RTF和PDF。2.3 PyGame PyGame是用来编写游戏的python模块。PyGame是基于SDL的,SDL(Simple DirectMedia Layer)是一个跨平台的多媒体开发包,SDL专门为游戏和多媒体设计。使用PyGame可以方便地使用SDL库创建游戏和多媒体程序。3 游戏规划设计游戏目标 在本次毕设开发的植物大战僵尸游戏中,任务目标仍然是由玩家将入侵的僵尸击毙,以防止其入侵到基地(基地位于屏幕左侧,僵尸从右向左西东进行进攻),如果有10个以上僵尸进入基地,则表示基地已被僵尸占领,任务失败。另外,如果玩家的发射器与僵尸接触,则表示发射器被僵尸攻击,任务失败。游戏角色 玩家:玩家只有一个可沿屏幕上下移动的子弹发射器。 僵尸:僵尸有两种类型,总数为50个。 子弹:子弹的数量没有限制,可无限发射。 角色动作 玩家的动作:玩家可上下移动发射器(不能左右移动)按空格键或鼠标右键可发射子弹,攻击僵尸。 僵尸的动作:僵尸只能沿屏幕从右向左移动,当移动到游戏场地左边沿时自动消失。 子弹的动作:子弹只能沿屏幕从左向右移动。状态的转换 玩家:当玩家发射器与僵尸接触时,玩家被击中,游戏结束。 僵尸:僵尸的状态转换有以下三种。移动到游戏场地左侧,表示进入基地,僵尸自动消失。与子弹接触,表示被子弹击中,僵尸消失。与玩家发射器接触,表示击中玩家,游戏结束。 子弹:子弹有两种状态。子弹向右移动,当移动到游戏场地右边沿时,自动消失。与僵尸接触,表示子弹击中僵尸,子弹消失。 4 收集资源 根据第三章的游戏规划设计,需要针对性的收集、制作游戏中的素材资源,包括游戏图片、声效等素材。我们可直接从原版游戏中借用素材。在本次毕设,图片素材用得不多,主要有以下几种。4.1收集图片素材1.游戏背景图片 只需要一张游戏背景图片(background.jpg),如下图。需重新拼接。 图1 背景图片 background.jpg2. 僵尸图片 本论文中有两种僵尸类型,需要有两张不同造型的僵尸图片Zombie1.png和Zombie2.png,如图2所示。需要注意的是,在游戏中,僵尸需要重叠绘制在背景图片上方,因此,应该使用能保持透明效果的图片格式(如PNG或GIF),不能保存为JPG格式。 图2 僵尸图片Zombie1.png和Zombie2.png3. 玩家发射器图片 玩家发射器图片(Emitter.gif)如图3所示,也需要使用具有透明效果的GIF或PNG格式。图3 发射器图片 Emitter.gif4. 子弹图片 子弹图片(Bullet.gif)如图4所示,也需要使用具有透明效果的GIF或PNG格式。图4 子弹图片 Bullet.gif5. 游戏Logo图片 游戏Logo图片(PvZ_Logo.png)显示在游戏开始界面中,如图5所示也需要使用具有透明效果的GIF或PNG格式。图5 游戏Logo图片 PvZ_Logo.png4.2 收集声效素材 游戏不仅要有好的视觉效果,还应该有一定的声效,才能更好地吸引玩家。本次设计虽然是一个小游戏,但也需要加上一定的声效。如背景音乐、子弹击中僵尸的声效、游戏获胜或失败的声效等。 一般来说,背景音乐需要反复循环播放,可从已有音乐中截取一段能播放2分钟左右的片段即可,为了减少音乐文件的大小,可保存为MP3格式。而其他声效通常只需要15秒,所以保存为WAV格式即可。PyGame能方便地播放MP3和WAV格式的声音。 本次论文用到的声效文件如下。 背景音乐:background.mp3. 游戏胜利音效:winmusic.wav. 游戏失败音效:losemusic.wav. 游戏结束音效:gameover.wav. 发射器被僵尸击中音效:hit1.wav. 僵尸被子弹击中音效:hit2.wav.5 编写初始脚本 游戏方案设计完成,素材也已收集好之后,就可以开始编写python脚本代码,实现游戏方案中设计的各项内容了。 5.1 定义游戏初始环境 根据游戏设计方案,首先编写脚本,定义游戏初始化环境,需要做以下工作。 导入脚本中需要用到的各类模块(可在后续脚本编写过程中再增加)。 定义场地尺寸。 定义角色外形尺寸。 定义角色数量。 定义角色加入游戏场景的速度。 定义角色动作速度。 根据以上分析,编写如下脚本。# coding:utf-8#file PlantsVsZombies.pyfrom pygame.locals import *UI_Width = 1024 #游戏窗口宽度UI_Height = 600 #游戏窗口高度FPS = 60 #帧频MAX_Into = 10 #最大僵尸通过数(超过次数,游戏结束)Zombie_Width = 50 #僵尸宽度Zombie_Height = 90 #僵尸高度Zombie_Total = 50 #僵尸总数Zombie_Add_Rate = 30 #僵尸增加频率Zombie_Speed = 2 #僵尸1向左移动的速度Zombie2_Speed = Zombie_Speed / 2 #僵尸2向左移动的速度Emitter_Move_Dist = 10 #发射器每次移动的距离Bullet_Speed = 10 #子弹的速度Bullet_Add_Rate = 15 #子弹列表中添加子弹的频率Zombies_List = #保存僵尸1的列表Zombies2_List = #保存僵尸2的列表Bullets_List = #子弹列表Into_Base_Zombies = 0 #通过的僵尸数量Score = 0 #积分Add_Zombie_Total = 0 #添加的僵尸总数Zombie_Rate_Counter = 0 #僵尸1频率计数器Zombie2_Rate_Counter = 0 #僵尸2频率计数器Bullet_Rate_Counter = 40 #子弹频率计数器TEXTCOLOR = (255,255,255) #文本颜色#上下左右移动标志To_Left = FalseTo_Right = FalseTo_Up = FalseTo_Down = False#射击标志Shoot = False 在上述脚本中,FPS变量用来设置游戏的最大帧频,即每秒钟游戏最大画面刷新频率,如果将此值改小,则游戏的整体速度都会变慢。而上下左右移动标志可用来设置角色的移动方向,即To_Left为True时,表示将向左移动,依此类推。而Shoot为True,表示处于子弹发射状态。5.2 导入游戏素材 环境设置好之后,接下来就可以通过PyGame模块的相关方法来加载游戏中使用的素材,包括图片、声音等。具体代码如下:pygame.init () #初始化pygame模块mainClock=pygame.time.Clock() GameWin=pygame.display.set_mode(UI_Width,UI_Height) #设置游戏场地大小 pygame.display.set_caption(植物大战僵尸) #设置窗口标题pygame.mouse.set_visible(True) #显示鼠标指针font=pygame.font.Sysfont(simsunnsimsun,32) #设置字体gameOverSound=pygame.mixer.Sound(gameover.wav) #游戏结束声音gameWinSound=pygame.mixer.Sound(winmusic.wav) #游戏胜利声音gameLoseSound=pygame.mixer.Sound(losemusic.wav)#游戏失败声音gameHit1Sound=pygame.mixer.Sound(hit1.wav) 僵尸击中发射器声音gameHit2Sound=pygame.mixer.Sound(hit2.wav) 子弹击中僵尸声音pygame.mixer.music.load(background.mp3)EmitterImage=pygame.image.load(Emitter.gif) 设置游戏者发射图片EmitterRect=EmitterImage.get_rect()bulletImage=pygame.image.load(Bullet.gif) 设置子弹图片bulletRect=bulletImage.get_rect()zombieImage=pyame.image.load(Zombie1.png) 僵尸1图片zombie2Image=pygame.image.load(Zombie2.png) 僵尸2图片backgroundImage=pygame.image.load(background.jpg) 设置背景图片logoImage=pygame.image.load(PvZ_Logo.png) 设置logo图片#将背景图缩放到游戏窗口大小rescaledBackground=pygame.transform.scale(backgroundImage,(UI_Width,UI_Height)GameWin.blit(rescaledBackground,(0,0) 把背景画到游戏窗口GameWin.blit(logoImage,(UI_Width/2-275,150) GameWin.blit(EmitterImage,(UI_Width/2,UI_Height-70) 把游戏者的子弹发射器画到屏幕对应位置pygame.display.update() 刷新屏幕 在以上代码中,导入了上一节中收集的图片、声效等素材,然后使用blit函数将背景画到游戏窗口中。这里的blit是一个很重要的函数,其字面意思是“块传送”(bit block transfer),就是将一个平面的一部分或全部图像整块从这个平面复制到另一个平面。Blit是对窗口重画最多的操作,有两个参数,第一个参数是一个需要传送的对象,第二个参数是左上角的位置坐标。传送完以后必须使用update函数进行画面刷新,否则画面是黑的。 在了以上脚本后,就可以运行了。运行后可看到画面一闪而过。这是因为执行完最后的update函数后脚本就结束了,为了看清效果,可以在update函数下一行中加入等待按钮语句。从游戏开始界面可以看到,提示玩家按回车键进入游戏,否则一直显示开始界面。 对于这样的开始界面,可编写一个死循环,不断检测玩家按钮情况。当检测到回车键时瑞出死循环。另外,一一般游戏通常都提供按ESC键退出,这里也应该进行检测。因此,编写一个等待按钮的函数,具体脚本如下。#开始界面时等待游戏者按键def waitPressKey(): globalZombies_List,Zombies2_List,Bullets_List,Into_Base_Zombies,Score,Add_Zombie_Total while True: #死循环 for event in pygame.event.get(): #获取事件 if event.type=QUIT: #事件类型为退出 quit() #退出游戏 if event.type=KEYDOWN: #按键事件 if event.key=K_ESCAPE: #按下ESC键 quit() #退出游戏 if event.key=K_RETURE: #按下回车 init() return #退出死循环 在以上脚本中,通过pygame.event.get函数获取事件,然后判断事件类型,在决定是退出游戏,还是退出当前函数(退出当前函数后,将执行调用该函数的下一条语句,表示程序继续向下运行)。 当前函数是,在检测到退出事件是调用了一个名为quit的函数,这个函数将退出游戏,具体脚本如下。# 退出游戏def quit(): pygame.quit()sys.exit()在waitPressKey函数中,在玩家按回车键开始游戏时,将调用init函数初始化全局变量,使新开始的游戏为一个新游戏,不会带入上次玩的数据。Init函数的脚本如下。def.init(): global Zombies_List,Zombies2_List,Bullets_List,Into_Base_Zombies,Score,Add_Zombie_Total global To_Left,To_Right,To_Up,To_Down,Shoot Zombies_List= #保存僵尸的列表 Zombies2_List= #保存新僵尸的列表 Bullets_List= #子弹列表 Into_Base_Zombies=0 #进入基地的僵尸数量 Score=0 #积分 Add_Zombies_Total=0 #添加的僵尸总数To_Left=To_Right=To_Up=To_Down=Shoot=False #清空各种操作状态 注意,这些函数都需要放在调用之前进行定义,否则会出现找不到函数的错误。 将以上函数编写好之后,在pygame.display.update()的下一行调用waitPressKey函数。再次运行脚本,就可以看到游戏开始界面。这是直接按ESC键,画面才会消失。 与开始图片相比,图1所示的界面中少了一些提示文字。由于游戏中还有多处要显示文字,因此这里编写一个显示字符串的函数,具体如下。#显示字符串def DisplayStr(text,font,surface,x,y): textobj=font.render(text,1,TEXTCOLOR) textrect=textobj.get_rect() textrect.topleft=(x,y)surface.blit(textobj,textrect)在pygame.display.update()的上一行调用DisplayStr函数,以显示提示信息,脚本如下:DisplayStr(按回车键开始,font,GameWin,UI_WIDTH/2-95,300)这样,游戏开始界面就制作完成了。6 编写游戏核心脚本6.1 编写游戏循环脚本 整个游戏脚本可以循环执行,也就是说,当一次游戏结束后(无论胜负),玩家都可以继续玩下一次,直到玩家按ESC键退出为止。因此,脚本的主结构可写成以下形式。#进入游戏while True: (游戏) waitPressKey() #等待按键 上面的脚本很简单,通过while死循环来完成重复玩多次的要求,在waitPressKey函数中,当玩家按ESC键时调用quit函数,结束游戏。 上面的死循环中将是游戏的核心脚本,在这个循环里,需要做一下几项工作。 向游戏场景中添加僵尸。 向游戏场景中添加子弹。 更新各角色的状态。 在窗口中绘制出各角色。 处理玩家的操作。 判断游戏是否结束。 以上每一项处理都需要几行,几十行脚本来完成。若将这些脚本全部集中编写在while循环中,脚本不好维护。因此,这里采用1函数调用的形式来处理,将这些功能抽取出来编写成多个函数,则主程序中的脚本将比较简单,也方便查看、了解脚本的运行结果。下面的脚本就是while循环中的内容,每个函数右侧的注释说明了该函数的作用。#进入游戏while True: EmitterRect.topleft=(30,UI_Height/2) #将发射器放置距左侧30,垂直位置居中的位置 pygame.mixer.music.play(-1) #循环播放音乐 while True: ProcEvent() #处理事件 AddRoles() #添加角色到游戏 RolesStatus() #更新角色状态(移动、删除、检查边界) ReDraw() #重绘画面 #检查僵尸是否击中发射器,若击中,则游戏结束 if EmitterWasHit(EmitterRect,Zombie
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 衢州职业技术学院《物流管理》2023-2024学年第二学期期末试卷
- 山东药品食品职业学院《民用建筑工程调研实训》2023-2024学年第二学期期末试卷
- 江门职业技术学院《专业文献检索与论文写作》2023-2024学年第二学期期末试卷
- 新疆艺术学院《自动控制理论》2023-2024学年第二学期期末试卷
- 海南健康管理职业技术学院《机械工程前沿》2023-2024学年第二学期期末试卷
- 广西中医药大学赛恩斯新医药学院《公共部门会计》2023-2024学年第二学期期末试卷
- 沈阳理工大学《水处理生物学》2023-2024学年第二学期期末试卷
- 2024年生物可降解塑料项目资金筹措计划书代可行性研究报告
- 文创产品设计赏析
- 2024年电子涂料项目投资申请报告代可行性研究报告
- 教练技术第一阶段导师讲义
- 国际学术交流英语知到章节答案智慧树2023年哈尔滨工业大学
- 公路水运工程施工企业(主要负责人和安全生产管理人员)考核大纲及模拟题库
- 01SS105 常用小型仪表及特种阀门选用安装
- 架桥机安装拆除监理细则
- GB/T 25156-2010橡胶塑料注射成型机通用技术条件
- GB/T 23999-2009室内装饰装修用水性木器涂料
- GB/T 21063.4-2007政务信息资源目录体系第4部分:政务信息资源分类
- GB/T 20570-2006玉米储存品质判定规则
- GB/T 18168-2008水上游乐设施通用技术条件
- CB/T 497-1994吸入粗水滤器
评论
0/150
提交评论