前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >17 Python 基础: 重点知识点--Pygame实现儿时经典游戏坦克大战

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

原创
作者头像
野原测试开发
修改2019-07-24 17:23:48
1.3K0
修改2019-07-24 17:23:48
举报
文章被收录于专栏:技术探究技术探究

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


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

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

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

image.png
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
image.png
image.png

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

image.png
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
image.png

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

image.png
image.png

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

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

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

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

image.png
image.png

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

image.png
image.png

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

image.png
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
image.png
image.png
image.png
image.png
image.png

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

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

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

image.png
image.png

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

image.png
image.png

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

image.png
image.png

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

image.png
image.png

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

image.png
image.png

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

image.png
image.png

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

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

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

image.png
image.png

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

image.png
image.png

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

image.png
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
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
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pygame--坦克大战1-系统分析图
  • Pygame--坦克大战2-地图类wall.py
  • Pygame--坦克大战3-食物装备类food.py
  • Pygame--坦克大战4-己方坦克类myTank.py
  • Pygame--坦克大战5-敌方坦克类enemyTank.py
  • Pygame--坦克大战6-子弹类bulletClass.py
  • Pygame--坦克大战7-主类main.py
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档