摘要
《坦克大战-1990》是一款坦克为题材的平面射击小游戏,游戏目标是消灭敌对坦克,保护领地。游戏使用Python以及强大的第三方库Pygame, Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音,可以用Pygame绘制图形,执行动画以及使用定时器让游戏按照稳定的帧速率运行,提供很多游戏界面,游戏元素显示的函数,让开发者专注于考虑游戏的逻辑,从而降低了在游戏界面上开发的难度。整个游戏主要基于Pygame库进行开发,各模块均用函数进行封装,以增强复用性,利用Pygame模块设计了炮弹,坦克类的相关方法和属性,进行了背景贴图,实现了坦克大战游戏的功能。
关键字:坦克大战、Python、Pygame
Abstract
"Tank war-1990" is a small plane shooting game with tank as the theme. The goal of the game is to eliminate enemy tanks and protect territory. The game uses Python and a powerful third-party library pyGame, PyGame is a cross platform Python module designed for electronic games, including images and sounds. PyGame can be used to draw graphics, execute animations and use timers to make the game run at a stable frame rate. It provides many game interfaces and functions for displaying game elements, which enables developers to focus on the logic of the game, thus reducing the difficulty of developing on the game interface. The game uses pyGame module to design bullet, tank class related methods and attributes, and carries out background mapping to realize the function of tank war game.
Keywords: tank war, Python, Pygame
第1章 引言
1.1 研究的背景及意义
在社会经济发展迅速,人们的工作压力越来越来,长时间紧张繁忙的工作压力使人们精神紧绷,为了更好的工作并提高工作效率,这时间就需要短暂的休息让紧绷的精神放松一下。缓解压力的方式也很多,要选择适合自己的方式,玩游戏也是众多缓解压力方式之一。看电影、电视或者音乐也可以缓解压力,但是人们只是能被动的观看与倾听,并不能参与其中进行互动。而游戏有着很好交互性,玩家并不是仅仅在观看角色在如何移动,而是也要融入角色当中进行操作。在游戏中,玩家的行为也会对游戏产生影响。游戏除了让人娱乐之外还可以作为缓解压力的方式,在休息的时候可以不用想其他事情,这样压力就会得到缓解。
1.2 研究目的
主要目的锻炼面相对象编程思想,掌握基本的python程序编写、编译与运行程序的方法,同时在学习Python进行游戏编写时学习Pygame模块,进一步提高逻辑思维能力、动手能力、独立解决问题能力和学习新技术的能力。
1.3 国内外的发展现状
个人计算机刚刚开始普及的时候,游戏并不能被广泛接受,最主要的原因就是不能充分发挥个人计算机的性能,游戏程序不能最大化使用PC机器的硬件资源,机器与人的交互做的还不够好。由此导致个人计算机早起游戏画面差,操作感僵硬,可玩性不高,所以不被人们所接受。但是随着切硅技术的提升导致CPU性能的飞跃,以及C, C++,Java,Python等等一系列高级语言的开发,游戏对硬件资源的利用率提高,现在游戏各方面都有了质的飞跃。从20世纪末期暴雪公司下的《星际争霸》《魔兽世界》再到现如今的《英雄联盟》《守望先锋》等等都给玩家带来极大的乐趣与良好的游戏体验。当然,除了游戏本身的优秀质量外,可以较广泛的支持不同硬件设备及操作系统的功能也不容忽视,高中低端的个人计算机都有着不错的流畅度。
1.4 项目概述
《坦克大战-1990》是一款坦克为题材的平面射击小游戏,玩家通过控制坦克摧毁敌方坦克来保卫主基地不被摧毁。游戏界面由26×26大小的地图组成,地形包括砖墙、海水、钢板、森林、雪地5种,其中红色土石墙(普通子弹可以打通),白色钢板(普通子弹打不通),坦克进入森林可以隐藏(子弹不隐藏),进入雪地可以加速,大本营由土墙包围,内部有老鹰的图腾,敌方坦克有三种,分别为普通坦克、重型坦克(移速慢血多)、装甲车(移速快血少),游戏中可以生成多种功能的食物,打红色坦克会生成食物,不同的食物有不同的效果(无敌、大本营加固成钢板、坦克生命+1等)。我方坦克和敌方坦克出生会有简单特效,炮弹可以互相抵消。当敌方坦克全部死亡时出现Congratulations,当我方坦克生命数为0或者大本营被击毁时出现Game Over。
1.5 开发环境
操作系统:Win10
开发语言:Python
模块:Pygame以及Python内置库,如random、sys、os等
开发工具:Python IDLE、PyCharm
第2章 需求分析
2.1 功能设计
游戏开始界面选择单/双人模式按下回车键后游戏开始,加载关卡信息,同时载入地图,把玩家坦克生成在地图下方大本营左侧,敌方坦克在地图上方。
玩家1用W、A、S、D键控制坦克上、下、左、右运动,按空格键开炮,玩家2用↑、↓、←、→键控制坦克上、下、左、右运动,按右CTRL键开炮。坦克发射或击中目标都有相应的声效,击中红色坦克会生成食物,不同的食物有不同的效果(无敌、升级坦克、大本营加固成钢板、坦克生命+1等)。我方坦克和敌方坦克出生会有简单特效,炮弹可以互相抵消,坦克碰到墙、钢板、河流就会停下来,红色土石墙(普通子弹可以打通),白色钢板(普通子弹打不通),坦克进入森林可以隐藏(子弹不隐藏)并有特殊音效,进入雪地可以加速,玩家大本营被炮弹(不管玩家还是敌方)击中,都会被击毁。每隔几秒钟,就会生成一辆敌方坦克。敌方坦克每隔一段时间,就会自动开炮。敌方坦克遇到墙、钢板、河流就会停下来,停下来的坦克,前方的土墙如果被摧毁了,又能继续前进。
玩家坦克与敌方坦克在地图上进行作战,当我方坦克生命数为0或者大本营被击毁时出现 Game Over,当敌方坦克全部死亡时出现Congratulations。
2.2 功能框架
图2.1“坦克大战”功能框架
第3章 实现代码
3.1 主函数
对游戏进行初始化,设置游戏屏幕大小、标题、图标,加载游戏的图像、音乐素材,判断游戏关卡数,游戏界面相响应事件。
pygame.display.set_mode():初始化一个准备显示的窗口或屏幕。
pygame.display.set_icon():修改显示窗口的图标。
pygame.display.set_caption():设置窗口标题。
pygame.image.load():加载图片文件,返回图片对象。
图3.1主函数代码
3.2 精灵类
sprite翻译为精灵,在游戏动画一般是指一个独立运动的画面元素,在pygame中,是一个带有图像(Surface)和大小位置(Rect)的对象,pygame.sprite.Sprite是pygame精灵的基类,需要写一个自己的精灵类继承一下它然后加入自己的代码。
设计了炮弹、食物、大本营、地形、坦克类的相关方法和属性,给精灵起名称,设置精灵的速度,设置精灵的等级,精灵与地图边界的碰撞,精灵与精灵的碰撞。
get_rect():一个处理矩形图像的方法,获得图片矩形对象。
pygame.Rect.move():移动 Rect 对象。
pygame.sprite.collide_rect():两个精灵之间的矩形检测。
pygame.Surface.subsurface():根据父对象创建一个新的子 Surface 对象,它将与父对象共享所有的像素,裁剪出坦克类等精灵类各个方向的的对应显示。
- 子弹类
图3.2子弹类代码
- 食物类
图3.3食物类代码
- 大本营类
图3.4大本营类代码
- 场景类
图3.5场景类代码
- 坦克类
图3.6坦克类代码
3.3 游戏关卡
加载地图模板素材、我方坦克,定义精灵组和玩家键位,碰撞检测,操作提示。
pygame.sprite.Group():创建一个精灵组。
pygame.sprite.groupcollide(group1, group2, dokill1, dokill2, collided = None):检测两个精灵组是否碰撞,依次判断精灵组A中的每一个精灵是否与精灵组B中的每一个精灵发生碰撞,如果将 dokill 设置为 True,则 发生碰撞的精灵将被自动移除,collided 参数是用于计算碰撞的回调函数,如果没有指定,则每个精灵必须有一个 rect 属性,返回一个字典,包含所有冲突精灵信息。
spritecollide(sprite, group, dokill, collided = None):判断某个精灵和指定精灵组中的精灵的碰撞,如果将 dokill 设置为 True,则指定精灵组中发生碰撞的精灵将被自动移除,collided 参数是用于计算碰撞的回调函数,如果没有指定,则每个精灵必须有一个 rect 属性,返回精灵组中跟精灵发生碰撞的精灵列表。
pygame.display.update():更新坦克类等精灵类的移动显示。
pygame. event.get():用于处理事件与事件队列,获得用户当前所做动作的事件列表。
图3.7游戏关卡代码(1)
图3.8游戏关卡代码(2)
3.4 游戏界面
创建游戏开始界面、关卡切换界面、游戏结束界面。
pygame.transform.scale(图片对象,(宽度,高度)):对图片进行缩放,将指定的图片,变成指定的大小,返回一个新的图片对象。
pygame.font.Font(字体文件的路径,字体的大小):返回一个特定字体对象,可使用该特定字体去定义文本,如果字体路径参数设置为None则默认采用系统自带字体 。
font.render(text, antialias, color, background=None):返回一个surface对象(字体的渲染成的图像),text是文本字符串,antialias为True时文本图像显示更光滑,为False时文本图像显示有锯齿状, color是文本的颜色,background是文本背景颜色,默认为黑屏。
- 游戏开始界面
图3.9游戏开始界面代码
- 游戏结束界面
图3.10游戏结束界面代码
- 关卡切换界面
图3.11关卡界面切换代码
第4章 实验结果
4.1 游戏开始界面
图4.1游戏开始界面
4.2 游戏加载界面
图4.2游戏加载界面
4.3 游戏开局界面
图4.3游戏开局界面
4.4 游戏结束界面
图4.4游戏结束界面(1)
图4.5游戏结束界面(2)
第5章 总结和展望
基于Python的坦克大战游戏是采用python语言及其pygame模块开发完成的。本项目实现了游戏流程中的所有功能,界面布局更加人性化,并有着良好的可扩展性,由于还是初学者,在项目设计中还有欠缺和考虑不周的地方,游戏还有待进一步研究和改善。
这次程序设计实训我自己收获非常的多,首先是对于pygame这个强大的第三方库,可以说是从无到有,从陌生到熟悉,开始觉得太难了,无从下手,后来在不断查资料过程中,逐渐熟能生巧,创建精灵,删除精灵,设计界面初步,运行游戏等基本操作。通过练习熟练了创建项目,安装模块及内容,给精灵起名称,设置精灵的速度,设置精灵的层次,精灵与地图边界的碰撞,精灵与精灵的碰撞,导入地图模板等项目改进措施,并逐步运用自如。在不断地学习新知识的同时在应用中不断将已有的知识融会贯通,多多抓住实践练习的机会,学习与应用相结合,学有所用,达到学习的真正目的。
参考文献
[1] Python之Pygame,从入门到精通
[2] Pygame中的冲突检测技术
[3] Pygame编程之font模块
[4] Pygame详解:image 模块
[5] Pygame事件处理机制