首页
学习
活动
专区
圈层
工具
发布

17 Python 基础: 重点知识点--Pygame实现儿时经典游戏坦克大战

本文首发于腾讯云+社区,也可关注微信公众号【离不开的网】支持一下,就差你的关注支持了。


Pygame--坦克大战1-系统分析图

image.png
image.png

Pygame--坦克大战2-地图类wall.py

image.png
  • 首先,设置了两个类,砖块类Brick和铁块类Iron。砖块类Brick和铁块类Iron都是继承pygame的精灵pygame.sprite.Sprite,所以它们都是精灵对象,精灵类。精灵类最重要的两个属性就是image和rect,image决定了最终它是什么样子,所有的砖块都是一个样子的,就是这个定义的brickImage = r"./image/brick.png"。
  • 然后self.rect负责在哪里显示。
  • 一般来说,先用self.rect = self.image.get_rect(),获得image距形大小,然后给self.rect设定显示的位置,self.rect.top、self.rect.bottom、self.rect.right、self.rect.left分别表示上下左右。
image.png
image.png

这个地图类最重要的就是,根据这些数字在地图中生成对应得砖块和铁块。上面含有x代表的是x轴的位置,含有y代表的是y轴对象的位置。

image.png

然后,通过循环遍历上面所定义的列表,得到每一个砖块和铁块的位置,在地图上把它们生成出来。

代码语言:txt
复制
#这里+3是因为背景图有3像素的边框要去掉
self.brick.rect.left,self.brick.rect.top=3+x*24,3+y*24
#将Sprite精灵self.brick添加到self.brickGroup此组
self.brickGroup.add(self.brick)

Pygame--坦克大战3-食物装备类food.py

首先,装备和食物这种东西都是随机的,所以我们需要一种随机算法random,所以要在最上面导入random模块(import random)

image.png

在初始化的时候,把图片加载进来,pygame.image.load();convert_alpha()可透明,convert()不支持透明。

image.png

定义一个类型self.kind随机获得1到7的其中一个值;random中的choice方法是随机抽取一个值出来;根据抽取的随机值显示对应的食物;下面把self.kind和对应的食物图片绑定。

image.png
image.png
image.png

这里是定义的一个change()方法,如果你想改变食物的话,你就可以调用这个方法。self.life是否活着,是否显示在窗口。

Pygame--坦克大战4-己方坦克类myTank.py

image.png

首先,定义一个己方坦克MyTank()class类,同样是继承pygame的精灵pygame.sprite.Sprite,在初始化__init__()方法中定义多一个玩家编号的对象playerNumber用来识别玩家,然后就是加载和定义图片文件。pygame.sprite.Sprite.__init__(self)这句一定要写,这是完成初始化很重要的一步,当你使用了精灵。

image.png

初始的坦克等级self.level=0为零级,所以定义初始坦克图片self.tank为tank_L0那张图。每个玩家对应的坦克都有三个等级。

image.png

每一个玩家所对应的坦克都是三个等级,也就是三张图,而每个等级所对应的图又包含前后左右四个方向的坦克,所以我们需要在一张图上裁剪自己需要的部分,通过subsurface()函数来实现,括号中的第一个括号数字代表裁剪的起始点x,y的值,第二个括号数字代表的是裁剪图片的宽高。每个方向都有两张图,来回切换达到实现运动的视觉效果,所以每个方向都有两张图需要裁剪。self.rect = self.tank_R0.get_rect()获取坦克位置,再通过下面self.rect.left, self.rect.top设定具体位置。

image.png
image.png
image.png
image.png
image.png

然后接下来就是移动的问题了,基本上下左右都是雷同的,就方向不同,一些细节不同,详细见代码,这里列举一个向上的moveUp():

image.png
image.png

Pygame--坦克大战5-敌方坦克类enemyTank.py

image.png

一样,开始先定义类,这里定义一个EnemyTank()同样继承pygame精灵,然后定义初始化__init__方法并设定属性;然后下面是定义坦克出现之前的动画是否播放,还有时间times为90毫秒。

image.png

这里定义敌方坦克种类随机出现,定义类型kind,kind随机在1到4之间获取一个数,然后下面定义每一种数字所对应的敌方坦克类型。进而完成敌方坦克加载操作。

image.png

定义一个isred属性,来保存坦克是否携带食物;这里设定了四个false和一个true,有20%的机会携带食物,然后判断如果self.isred为true时坦克的类型也就是此时应该加载哪一张坦克图,false时同理。

image.png

这个定义一个随机x值,主要作用是让将要生成的坦克可以在那三个位置随机出现,达到随机效果,不固定。

image.png

同样,需要获取加载的图片,所以一样跟之前裁剪出自己需要的图片,然后获得图片位置并设定他的位置起始坐标x和y的值。然后定义坦克的速度,方向,生命,子弹的生命和子弹的缓存蓄力时间就是冷却等数值(跟己方坦克同理)。再定义一个dirChange属性,怕你难过坦克撞墙则改变方向。初始值为false,撞墙会改变方向则为true。

image.png

然后,设定每种类型坦克的特性属性,比如类型kind值为2,它的speed速度为3;kind为3则生命值life为3。

image.png
image.png

定义一个move方法,定义rect.move()内第一个参数是speed速度乘以x轴的方向的值,第二个参数是peed速度乘以y轴的方向的值。然后下面定义了根据具体方向来加载裁剪相应的坦克图。

image.png

Pygame--坦克大战6-子弹类bulletClass.py

image.png

定义一个Bullet类,继承pygame的精灵,定义初始化方法并完成初始化,然后加载图片,其他都跟之前差不多,然后就是定义一个改变图片的方法,根据方向来决定图片显示。

image.png

Pygame--坦克大战7-主类main.py

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

这里flash播放也是有时间的,比如多少帧画之类的

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
下一篇
举报
领券