用python的tkinter做游戏(九)—— 坦克大战 正式篇

用python的tkinter做游戏 系列:

用python自带的tkinter做游戏(一)—— 贪吃蛇 篇
用python自带的tkinter做游戏(二)—— 俄罗斯方块 篇
用python自带的tkinter做游戏(三)—— 推箱子简易版 篇
用python的tkinter做游戏(四)—— 推箱子重制版 篇
用python的tkinter做游戏(五)—— 魔塔 篇
用python的tkinter做游戏(六)—— 坦克大战或射击游戏Demo 篇
用python的tkinter做游戏(七)—— 双人射击游戏Demo(类的应用) 篇
用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)

本来不想做这个坦克大战的,因为第六篇和第七篇已经把坦克大战的核心讲解了。
只不过这阵子上海疫情严重,封闭在家里也无聊,索性就做个正式版的坦克大战吧。

目前网络上能找的到python版的坦克大战,百分百都是用pygame做的。只用自带的tkinter制作的坦克大战,我应该是独一份了吧,呵呵~

先说下目前的进度:

音效:未制作。
游戏封面:未制作(开场即第一关)
关卡:仅一关(胜利和失败条件均无)
闪亮出场效果:未制作(我军和敌军均是瞬间复活)
子弹碰壁效果:未制作(当子弹接触墙砖等时会有火花显示)
定身效果:未制作(我方坦克相互间射击时,中弹方会被定住无法移动)

子弹相互间碰撞:已完成(子弹相互间碰撞后会消失)
坦克爆破效果:已完成(子弹击中坦克后的爆破效果,有BUG,有时候会坐标不准)

炸弹道具:未制作(敌方坦克全部清场)
铁锹道具:未制作(大本营用钢砖保护)
坦克道具:未制作(奖命一条,当前版本没有生命数量限制)
定时道具:已完成。可限制所有敌军的行为
星星道具:已完成。吃一个升一级,最高升到三级。
火枪道具:已完成。吃一个直接升至三级。
护罩道具:已完成。吃一个会出现防护罩动画效果,且无视对方的子弹

雪地滑行效果:未制作

坦克和子弹我就不细说了,看之前第六篇和第七篇即可,把图片一换,就出现效果了。
坦克大战的游戏规则中,墙砖可以直接消除,钢砖的话只能是三星级别的坦克才可以消除。
所以,原本设置的1为不可消除,2为可消除。现在增加了一个3,即只有当级别三星的坦克子弹才可以消除。

现在来看看坦克大战的背景设置。

坦克大战的背景还算简单,只有墙砖,钢砖,草丛,雪地,河流和老窝(即大本营)这几项。
如果要分类的话,草丛属于顶层的静图,坦克和子弹都是从草丛的下方穿越。
河流属于底层的动图,因为子弹是从河流的上方穿越。坦克是无法穿越河流的。
其余的几个都可以算底层的静图,所以在原本的游戏设计中是没有顶层的动图。
为了弥补这个缺憾,我用河流的图片略作修改,改成了顶层的动图,做测试用。

在这里插入图片描述
这就是空中河流的效果,中间镂空。本人取名为飞流,有点诗意吧,呵呵。

关卡的布局还是用推箱子那种类型的矩形地图,制作起来方便些。

'map':[
         [ 0, 0, 0,75, 0, 0, 0, 0, 0, 0,75, 0, 0],
         [ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
         [ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
         [ 0, 1, 0, 1, 0, 1, 5, 1, 0, 1, 0, 1, 0],
         [ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
         [ 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0],
         [ 5, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 5],
         [ 0, 0,72, 0, 0, 0, 0, 0, 0, 0,72, 0, 0],
         [ 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
         [ 2, 2, 2, 5, 4, 1, 5, 1, 4, 5, 2, 2, 2],
         [ 0, 0, 0, 0, 0,75, 0, 0, 0, 0, 0, 0, 0],
         [ 0, 7, 0, 0, 0, 1, 1, 1, 0, 0, 0, 3, 0],
         [76,76,76, 0,75, 1, 6, 1,75, 0, 0, 0,73]]

和推箱子不同的是,坦克大战中出现的物种较多,而且更为复杂。
说明一下,1代表墙砖,5代表钢砖。
墙砖和钢砖其实都是由四个更小的墙砖或钢砖组成。
在原始游戏中,墙砖更是由16块小墙砖组成的,在这里我也懒得弄了,改为4块。
不过即使是4块也麻烦,因为墙砖是由2种图片组成的,钢砖的话只有一种。

3代表雪地,雪地的滑行效果没做,以后在说吧。
4代表河流,6大本营,7就是飞流了。

至于70+的数字都是道具,76是星星,吃一个升一级,75是安全罩,73是枪,直接升级到三星,72是定时。至于炸弹,有点BUG,暂不使用。

把道具直接放在地图上只是为了方便测试,正式游戏中应该是击毁一架红光坦克后会随机出现一个道具,地点也是随机的。这个我也没有做,以后再加吧。

正因为道具出现的地点是随机的,所以道具是属于最顶层的动图,不然被遮住了看不到,至于为什么是动图,因为道具是一闪一闪的。实现的原理很简单,用动图的方式出现,只不过第二张图片用空白的即可。如果觉得闪烁的频率过快,可以多加几个空白。

说实话,不用pygame还真的很麻烦,很多看似简单的问题自己未必能处理的好。

比如子弹相互间的碰撞,看似简单,其实子弹的尺寸小,加上移动的间距,有一定的概率会相互间错过。
目前的解决方案是将子弹的范围放大,图片还是一样。这样看起来子弹还是这么小,其实范围已经放大了很多,这样就不会错过子弹间的碰撞了。
在这里插入图片描述
图中的红框就是子弹的实际大小,真实图片还是这么小。这里需要注意的是子弹图片出现的位置,要根据方向来决定坐标,因为子弹的显示方位一定要在红框内部的最前方(前进方向)。

BUG还是不少的,比如有时候子弹会一下子消除一整块墙砖,目前还没找到具体原因和解决方案。

在这里插入图片描述

秀一张成品图,有兴趣的朋友欢迎一起来交流,本人WX:znix1116

坦克大战 0.1版 2022.04.07 网盘下载:
链接:https://pan.baidu.com/s/1HJaVyHfSEIKgijefXJ4E3A
提取码:znix

2022.04.15 更新 坦克大战 0.2版

炸弹效果完成,可清场所有的敌方坦克。
击毁敌方坦克后会出现随机物品。

炸弹道具:已完成。清场所有的敌方坦克。
铁锹道具:未制作。(大本营用钢砖保护)
坦克道具:未制作。(奖命一条,当前版本没有生命数量限制)
定时道具:已完成。可限制所有敌军的行为。
星星道具:已完成。吃一个升一级,最高升到三级。
火枪道具:已完成。吃一个直接升至三级。
护罩道具:已完成。吃一个会出现防护罩动画效果,且无视对方的子弹。

子弹击中墙砖等后的火花效果未完成,有BUG,尚未解决。

链接:https://pan.baidu.com/s/1VsojrfIKw-s9CN3RYkDpow
提取码:znix

2022.04.18 更新 坦克大战 0.3版
新增铁锹道具,可恢复关卡的初始状态(与原版的钢砖包围基地不同)。
完善了子弹撞击后的火花效果。
增加了片头初始音乐。
目前子弹偶尔会有穿越BUG,尚未找到原因与解决方案。

链接:https://pan.baidu.com/s/1VsojrfIKw-s9CN3RYkDpow
提取码:znix

2022.04.27 更新 坦克大战 0.4版
新增了雪地上的滑行效果。
定义了敌方坦克每一辆的出场类型。
击毁红色敌方坦克后才会出现随机道具。
玩家和敌方坦克出场前的闪光效果。
敌方坦克的出生点改为三个,地点和原版的相同。
敌方坦克按设定的顺序依次出现。

目前还未完成的有:
玩家坦克的生命数(这个实现较为简单,懒得弄了)。
敌方老坦克的击毁次数(原版的老坦克需要四发子弹才能消灭,我这里一发即可。想要实现难也不难,就是比较繁琐,懒得弄了)。
基地被毁后结束游戏(基地被击毁后显示信息,但游戏可以继续进行)。
过关(击毁所有的敌方坦克后显示过关信息,但游戏还是继续进行)。
游戏封面未设计。
游戏过关画面未设计。

最后我来谈谈关于子弹穿越BUG的问题。
引发这个BUG主要是因为子弹飞行过程中,子弹刷新的帧数和其飞行间距会产生一定的真空地带,造成了直接穿越了墙甚至是敌方的坦克。
想要彻底解决这个问题,用专业的术语就是用连续碰撞检测 (Continuous Collision Detection, CCD) ,专门处理物体之间的遂穿问题。

这个CCD的方案好是好,就是太费CPU,极耗资源,造成游戏卡顿的不行。也不知道pygame是如何实现的,反正以我目前的能力用tkinter是实现不了。
目前我解决的方案就是缩短其飞行间距,放大子弹的范围。但这样做的后果就是子弹速度慢。

看来tkinter用来做RPG等文字类的游戏还行,想要制作激烈些的射击游戏还是要靠专业的pygame来制作。

链接:https://pan.baidu.com/s/1VsojrfIKw-s9CN3RYkDpow
提取码:znix

2022.04.28 更新 坦克大战 0.5版
玩家坦克的生命数加上了,出场99条命。不过并没有生命限制,即使生命值为0后,还可以负数。。。
既然生命数加上了,那奖励生命的道具也就用上了,吃一个奖命一条。
金刚老坦克由原本的一枪毙命改为了三发毙命。原版的是四发子弹,我这里图片资源有限,还缺一种颜色的图片,只能三发毙命了。
信息栏里用文字显示了生命数,保护罩时间和定时时间。

在这里插入图片描述

基本上再加个封面和关卡切换就完成了,留着以后有兴趣再慢慢更新了。
本人WX: znix1116 欢迎来交流~

链接:https://pan.baidu.com/s/1VsojrfIKw-s9CN3RYkDpow
提取码:znix

2022.05.03 更新 坦克大战 0.6版

加上了游戏封面和过关系统。
将敌方的重坦克设定为可摧毁钢块,被子弹击中后会降级成绿色老坦克。
只设计了2关,全部通关后再回到第一关,有兴趣的可以在Game_data中自行编辑添加。

无失败条件,坦克命数无数,基地被毁也无妨(被毁后仅文字提醒)。
在这里插入图片描述
在这里插入图片描述

链接:https://pan.baidu.com/s/1VsojrfIKw-s9CN3RYkDpow
提取码:znix

2022.05.08 更新 坦克大战 0.7版

加入了失败条件,基地被毁或生命值都为0时,从画面底部升起Game over的字样。然后回到游戏封面。
这样这个游戏就完成了一个完整的闭环。
当玩家生命值为0时,如果队友还有生命值的话,可以按射击键借命。
即使游戏开始选择了单人游戏,游戏过程中2P也可以随时向1P借命。

链接:https://pan.baidu.com/s/1VsojrfIKw-s9CN3RYkDpow
提取码:znix

2022.05.12 更新 坦克大战 0.8版

疫情不止,更新不断。。。每天挤点牙膏吧~
0.8版本明面上没有太大的变化,主要是可以设置敌军的最大出场数量。
默认是最多四辆敌军坦克,可以根据需求随意改动数量。
加了一关,第三关以雪地为主,基地由钢砖保护,可以尽情冲锋。
帮助信息略有调整。
把整个资源打包成了一个项目(刚知道项目是怎么用的,惭愧惭愧,吃了没文化的亏)。

至此,游戏已经是差不多了。和原版相比,还有几点差别:

  1. 铲子道具
    原版的铲子道具效果是把基地临时改为钢砖保护,过了一定时间后恢复成墙砖。
    一开始我设计成效果是恢复关卡,主要是为了方便可以长时间的测试游戏。
    现在看来这个效果还不错,再说改成钢砖效果难度也不大,没有挑战性,懒得做了。

  2. 射击队友
    原版中射击队友的话,队友会被定身一段时间,定身时身体会一闪一闪。
    实现起来也简单,根据坦克自身的id号可以区分一号玩家和二号玩家。
    也没太大的动力去完成,毕竟队友之间要和谐(这也算是理由?)。

  3. 分数系统
    这个毫无意义,没兴趣做。

  4. 关卡选择
    原版中是可以选择关卡的。我这里也就设计了三关,而且还是随意画的,关卡的选择还是免了吧。

  5. 随机道具的落点
    原版的情况我不太清楚,反正我这个落点是随机无限制的,是有可能落点在河流或是钢砖中导致无法拾取。
    还有待优化。

  6. 关卡编辑
    关卡编辑的确是有点挑战性,虽然矩阵地图制作起来简单,但是不够直观。
    至于做不做,看日后的心情吧。

链接:https://pan.baidu.com/s/1VsojrfIKw-s9CN3RYkDpow
提取码:znix

2022.05.31 更新 坦克大战 0.9版

今天应该是上海此次疫情封闭的最后一天了,明天终于可以正常上班了。
0.9版本优化了些代码,修复了一个BUG,内容上并没有变化。
最大的收获就是掌握了如何把字符转换成变量名,即exec函数的用法。

链接:https://pan.baidu.com/s/1VsojrfIKw-s9CN3RYkDpow
提取码:znix

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值