用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

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

  1. 用python的tkinter做游戏(五)—— 魔塔 篇

    好久没更新了,今天继续:用python自带的tkinter做游戏系列的第五弹,魔塔 篇 之前的四篇博文介绍的分别是贪食蛇和俄罗斯方块,推箱子的简易版和推箱子的重制版. 用python自带的tkinte ...

  2. 用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)

    用python的tkinter做游戏 系列: 用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 用python自带的tkinter做游戏(二)-- 俄罗斯方块 篇 用python自带的t ...

  3. 用python的tkinter做游戏(七)—— 双人射击游戏Demo(类的应用) 篇

    不知不觉这已经是第七篇文章了,今天来谈谈python中类(class)在游戏中的应用. 老规矩,先展现一下之前的几篇博文: 用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 用pytho ...

  4. 用python自带的tkinter做游戏(二)—— 俄罗斯方块 篇

    上回分享了博文 用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 今天继续,尝试用tkinter来制作一个更经典的游戏 -- 俄罗斯方块. 俄罗斯方块相信大家都玩过,一共有七个方块组,每 ...

  5. 用python自带的tkinter做游戏(一)—— 贪吃蛇 篇

    用python自带的tkinter做游戏(一)-- 贪吃蛇 篇 本人新手,刚自学python满半年,现分享下心得,希望各位老手能指点一二,也希望和我一样的新手能共勉,谢谢~ 大家都知道用python做 ...

  6. tkinter message_【莫烦Python】Tkinter 做简单的窗口视窗lt;学习笔记(2)gt;

    接(1) 还有五个苹果:[莫烦Python]Tkinter 做简单的窗口视窗<学习笔记>​zhuanlan.zhihu.com 登录窗口小例子(pickle存取) import

  7. |python|用tkinter做minecraft启动器 第一章:python配置

    哈啰啊,这是发的第一篇文章,做的不好,多多关照 好进入正题今天是配置python,先看后期的图片 好,我们首先得下载python(链接加载有点慢) python下载 | 传送门 | 然后点这个(红框框 ...

  8. 微信小游戏制作坦克大战(九)切换场景,游戏重新开始

    微信小游戏制作坦克大战(九)切换场景,游戏重新开始 新建一个游戏结束场景 主角坦克爆炸后切换到游戏结束场景 添加背景音乐 好了,至此坦克大战小游戏基本做好,小伙伴们可以继续完善哈. 体验地址:

  9. 使用jquery—Canvas实现html5小游戏——《坦克大战》

    目录 1.项目背景 2.项目展示 3.设计思路 3.1.坦克移动 3.2.坦克开火 3.3.击中坦克 4.实现代码 5.总结 1.项目背景 2021年春节期间在家无聊,正好又学过一些前端的知识,因此就 ...

  10. 微信小游戏制作坦克大战(八)统计得分

    微信小游戏制作坦克大战(八)统计得分 导入数字图片素材 新建得分变量 给数字添加事件 敌方坦克发生爆炸时,数字增加1 实现效果 下一篇文章:微信小游戏制作坦克大战(九)切换场景,游戏重新开始

最新文章

  1. 深度分析define预处理指令
  2. Java字符串格式化
  3. 日志中的秘密 Windows登录类型都有哪些
  4. 用python写一个简单的推荐系统 1
  5. linux学习作业-第七周
  6. SAP UI5 Dialog wrong location
  7. IOS学习笔记十八(copy、mutableCopy、NSCopying、NSMutableCopy、深复制、浅复制)
  8. sharepoint配置问题解决方案
  9. UVa11137 Ingenuous Cubrency
  10. 12864液晶使用例程
  11. opencv3.2.0形态学滤波之开运算、闭运算
  12. 【Siddhi】Siddhi 入门案例
  13. ATL中建立消息窗口
  14. MaxRects纹理合并算法as3实现
  15. 非客观书评(三)——《ARM Cortex-M3 权威指南》
  16. mac 删除文件夹里所有的.svn文件
  17. root + vm vh 实现响应式字体
  18. 123457123457#0#-----com.yuming.YiZhiFanPai01--前拼后广--益智早教游戏记忆翻牌cym
  19. python-20180103-1
  20. python学习笔记分享(四十)网络爬虫(7)反爬虫问题,解决中文乱码,登陆和验证码处理

热门文章

  1. 一个完整的性能测试流程
  2. IntelliJ IDEA 2017 汉化包及教程
  3. wirelessn1000 驱动_Intel无线网卡驱动程序下载
  4. Easyrecovery12.0.0.2 官方版下载
  5. ildasm.exe查看dll库支持的Net版本
  6. 手把手教学华为手机利用ABD工具卸载/禁用(隐藏)/恢复系统自带软件!
  7. WinRAR4.11激活
  8. 计算机高中会考inpute,高中信息技术会考知识点
  9. 监控流媒体服务器的搭建和使用
  10. EasyStreamClient对接海康流媒体V4.X——SDK对接关键函数记录