Pygame 坦克大战

@Pygame 坦克大战
此为2019年西电Python课程大作业,大一课程,仅实现部分简单内容
运行效果 百度云提取码: abcd
原码和素材包 https://download.csdn.net/download/weixin_43872532/12496334

Python坦克大战效果预览图.mkv

一, 游戏架构设计

首先确定游戏中所需要出现的类:Tank(My_tank.Enemy_Tank),Missile,wall。同时考虑到炮弹击中坦克时会发生爆炸,而爆炸的实质是依次显示不断放大的爆炸形状的图片,所以将爆炸也设置为一个类explode。同时考虑到所有的类都具有共同的属性,如:都是图片,都具有将图片显示在屏幕的方法等。所以设置一个所有类的父类Base_item, 故而整体游戏的结构框架如下:Pygame 坦克大战_第1张图片
Pygame 坦克大战_第2张图片

二, 在此程序中主要使用的pygame函数

display:控制pygame显示
pygame.display.set_caption(title):设置当前窗口标题;
如果显示器有窗口标题,则此功能将更改窗口上的名称。某些系统支持用于最小化显示的备用较短标题。
pygame.display.set_mode:初始化屏幕及窗口;

set_mode(resolution =0,0),flags = 0,depth = 0

此功能将创建一个显示Surface。传入的参数是对显示类型的请求。实际创建的显示将是系统支持的最佳匹配。
resolution参数是一对表示宽度和高度的数字。flags参数是其他选项的集合。depth参数表示用于颜色的位数。

 # Open a window on the screen
screen_width=700
screen_height=400
screen=pygame.display.set_mode([screen_width,screen_height])

pygame.display.update:更新屏幕的部分以显示软件;

sprite(精灵组):sprite类旨在用作游戏中不同类型对象的基类;
还有一个基本的Group类,它只存储sprite。游戏可以创建新类型的Group类,这些类在它们包含的特殊定制的sprite实例上运行。
基本的sprite类可以将它包含的sprite绘制到surface。
什么是精灵?
精灵可以认为成是一个个小图片,一种可以在屏幕上移动的图形对象,并且可以与其他图形对象交互。精灵图像可以是使用pygame绘制函数绘制的图像,也可以是原来就有的图像文件。
编写自己的精灵类,self.image可以是一个矩形,也可以是一个文件(图片、字符串等)。其中的MoveBall添加了动画的功能,用Sprite类来做动画效果是比较方便的。
pygame.sprite.Group():用于保存和管理多个Sprite对象的容器类。
pygame.sprite.spritecollide:如果精灵与组中的任何内容相交,则进行简单测试;
spritecollideany(sprite,group,collided = None)Sprite与返回的精灵碰撞
spritecollideany(sprite,group,collided = None)无冲突
如果精灵与组中的任何一个精灵发生碰撞,则返回该组中的一个精灵。无冲突时返回无。碰撞参数是一个回调函数,用于计算两个精灵是否发生碰撞。它应该将两个精灵作为值并返回一个bool值,指示它们是否发生碰撞。如果未传递碰撞,则所有精灵必须具有“rect”值,该值是精灵区域的矩形,将用于计算碰撞。

__init__:类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:

def __init__(self): self.data = []

类定义了 __init__() 方法,类的实例化操作会自动调用 __init__() 方法。

三, 主要函数

1. 坦克移动方法move()

2. 碰撞检测 stay()与hit()

Move()函数的核心是对敌方我方坦克坐标的实时监测与计算,同时记录下先前坐标。每个移动的物体都需要选取一个基准点,方便起见以它任意状态下的左上角代表该物体当前的位置,这也是物理上的用质点代表物体的思想。我们以屏幕左上方为坐标原点,距离屏幕左侧的距离命名为“left”,距离屏幕上方的距离叫做“top”,这两个数值均为非负数,即坦克与炮弹均不能移动到屏幕外侧。在规定了屏幕的尺寸后,即可建立相应的第一象限内的坐标系,让所有物体在规定区域内运动。
移动方式的实现。首先是基础的移动,既应用与我方坦克的玩家操控下的移动,也是敌方坦克在程序操控下的移动的基础。以一次移动为基准,每次收到移动命令后向着一个方向移动6个像素。主函数的帧速率为20FPS,在一帧的时长内,移动命令可以执行一次,那么坦克的移动速度为120像素每秒。按下不同的方向键时,将改变坦克的移动方向,即top和left的计算方式。敌方坦克在生成后将进行随机移动,我们设置的机制为:每沿着同一个方向执行6次移动命令后,随机转换方向,再次定向移动,循环往复,完成运动。
Hit()函数的实现,hit()用于判断游戏中的物体是否发生了碰撞。具体检测机制为:通过pygame.sprite.collide_rect()函数,进行对象之间的边缘检测,若发现两个对象的边缘发生了重叠或者恰好接触,及时调用stay()函数获得先前二者位置,修改它们的坐标值,从而使发生碰撞的对象返回先前不会发生碰撞的状态。
Stay()函数。这个函数的功能为记录记录前一步(front step)的位置,即缓存周期为一帧,单个对象缓存量为它的一组坐标。

四, 试运行与Debug

1. 子弹打到屏幕边缘无法消失或打中坦克无法消失

问题原因:随着空格键的按下,单独生成子弹对象,使得子弹删除出现问题
解决方法:把子弹用列表的形式表示出来,用delete的方法,随着屏幕刷新使子弹打到屏幕或者坦克消失。

2. 字体无法正常显示

问题原因:pygame.font.SysFont()的第一个参数没有使用普遍的字体库
解决方案:使用“simsunnsimsun”字体

3. 坦克图片无法正常加载

问题原因1.坦克图片的尺寸不一
2.load()函数需要图片的绝对路径,而每个人文件路径不同导致此函数无法正常加载
解决方法1:修改图片分辨率统一为136*107
解决方法2:图片跟代码放在同一个文件夹下,可以避免使用绝对路径,接着用screen.blit()函数将图片对象渲染到窗口上

4. 敌方坦克无法随机创建

问题原因:一开始使用列表创建敌方坦克,列表的append()函数只能在末尾添加成员,无法做到随机生成或者说不是真正的随机坦克
解决方案:使用pygame的精灵组概念,用族群来创建敌方坦克。当程序中有大量的实体的时候,操作这些实体将会是一件相当麻烦的事
pygame使用精灵组来管理精灵的绘制和更新,精灵组是一个简单的容器。使用pygame.sprite.Group()函数可以创建一个精灵组:

group = pygame.sprite.Group()
group.add(sprite_one)

你可能感兴趣的:(Python,python,游戏)