本期视频点赞目标达成,已经把分步拆解的文字版本和视频版本发到知识星球(英雄算法联盟)里,但是有同学反馈免费体验券无法查看(其实是需要下载app),如果不想下载app,可以跟着这篇文章进行学习,如果执意要在星球里学习,可以尝试下扫下文末的免费体验券,注意无需付费!!!由于B站文章的代码格式不支持,所以代码的部分采用图片的方式,这样也可以避免大家复制粘贴,逼着大家自己写,何尝不是一种倒逼。
B站不能上传文件,所以源码可以在公众号:夜深人静写算法,回复 tetris 直接获取。
(相关资料图)
1、下载Python
百度输入 "Python3下载",右键打开官网,找到一个相对较新的版本,点击下载,看到 recommended 字样,不由自主的选择了这个,右键打开,等它下载完。
2、安装Python
双击安装,不要点取消,安装完成。
3、下载安装VSCode
百度输入 "vscode",点击官网,点击下载,点击 windows,就下载好了,直接双击,咦怎么没有找到?嘶……哦哦哦哦哦,点击保留,点击打开文件,点击我愿意,下一步,下一步,创建桌面快捷方式,下一步,安装,完成。
4、第一个Python程序
新建一个文件,选择Python类型,随便写一段代码,按 F5 运行,调出来的框选择确认,安装Python解释器,选它,第一个Python程序就出来了。
分步视频:/117C1FekV
找到Python的安装目录,右键打开命令行,把 pip3 拖进来,紧接着输入 "install pygame",看到绚丽的进度条,我的内心泛起了涟漪,至此我们的游戏环境就搭好了。
分步视频:/11GDpn3TK
按住 shift,右键窗口空白处,打开 Power Shell 控制台,把 Python 的可执行文件拖进来,输入:,按下回车:
分步视频:/11oPrEMgU
接下来我们自己来做一个游戏。右键新建文件夹,输入pic用来放图片。再新建一个文件夹,输入code用来放代码,把老婆给我们准备好的图片,Ctrl+C, Ctrl+V。
没有老婆的话可以找女朋友要。在 code 目录中新建一个文件,选择Python,Ctrl + S,命名 代表游戏主文件。
分步视频:/11VH2swXp
分步视频:/11AnfcLzZ
分步视频:/110jZesoz
分步视频:/11rsA6ReC
分步视频:/11CylfiAR
分步视频:/11IFaReOB
分步视频:/11sRZuvBa
分步视频:/1104ZVHvx
分步视频:/111e7uCEM
现在只有一个方块,想要有多个方块,最好的方法就是把方块设计成一个类,利用面向对象的思想,接下来我们实现一个方块类 Block,处理好图片和它的位置,以及玩家控制的代码,再封装一个渲染的函数,像这样:
生成一个类的实例,删掉刚才的测试代码,调用更新和渲染的函数。
分步视频:/11HVnWQJn
1、定义方块类型
既然已经封装成了类,自然就可以多个实例运行,定义 blockType,红橙黄绿青蓝紫,像这样:
2、定义方块资源路径
每种类型的资源位置写下来,一气呵成,没有技巧,全是感情,唯手熟尔,你也可以:
3、方块初始化参数
对 Block 加入初始化参数,方块类型和位置,把原有的常量,替换成变量:
4、实例化方块
生成两个方块的实例(也就是对象的意思),像这样:
5、调用更新和渲染函数
调用方块的 update 和 draw 函数。
分步视频:/11DrHRwC2
分步视频:/114prI5hu
重新实现block的初始化函数,可以根据类型、行坐标、列坐标、宽高,以及相对位置来实现多态,根据传参来确定采用哪张图片、实际的尺寸、以及确定位置。把之前的初始化函数删掉。
分步视频:/11hSGSoaw
1、增加方块配置
在 const 文件中,增加四种形状的配置,放在 BLOCK_SHAPE 中,用局部坐标来表示,有方形、长条形、z字型、飞机型,像这样:
2、随机生成方块组
然后新建一个文件 ,实现通过配置实例化方块组的接口,一个blockGroup代表一个方块组:
3、实例化方块组
将方块组存储在 blocks 列表中,实现渲染函数,遍历blocks进行渲染。
分步视频:/11oUTfLOS
分步视频:/11qZF4tvO
分步视频:/11HjoTcnd
抽象来说,俄罗斯方块这个游戏就是:一个静态的 BlockGroup 和 一个下落的 BlockGroup完成碰撞的过程,下落的 BlockGroup 在和静态的 BlockGroup 产生碰撞以后,就会被合并到静态的 BlockGroup 去,而静态的 BlockGroup 从下往上判断。是否有一整行填充的方块,播放一个消去的动画,直到找不到整行的为止,则继续生成下落的方块的过程。
当静态的 blockGroup 到达一定高度,则游戏失败。
分步视频:/1106GAXIK
1、增加 BlockGroup 类型
在 文件中添加两种类型,一种是静态的,一种是下落的:
2、定义方块宽高
方块的宽高定义成常量,都是32像这样。
3、初始化 BlockGroup
给每个方块组加上类型,像这样:
4、下落调整
如果类型是下落类型,才执行时间判定。
5、游戏逻辑调整
在 game 文件中,将 固定类型方块组 fixedBlockGroup 以及 下落类型方块组 dropBlockGroup 都实例化出来,update 函数就是执行两者的 update,并且如果没有下落类型,则随机生成一个。渲染函数也是类似写就可以了。
分步视频:/11uqzAUGW
1、碰撞的概念
在这个场景下,碰撞的概念其实就是:计算固定的 blockGroup 和 下落的 blockGroup 的交集,如果两个方块集合才产生交集,则认为发生了碰撞。
2、block 坐标封装
对每个 block 实现 获取当前坐标 和 获取下落后的坐标 的函数,像这样:
3、blockGroup 坐标封装
在 blockGroup 中用列表进行一次封装,像这样:
4、blockGroup 增删改接口
再实现一些增删改的函数,以便不时之需:
5、碰撞检测
在 文件中,实现碰撞检测,首先将固定的 blockGroup 中所有的方块映射到 哈希表中,然后取下落的 blockGroup 中所有方块,下落后的位置,去哈希表中进行查询,一旦找到,这个函数返回 True;否则如果超过游戏给定的行数,也返回 True,都代表产生了碰撞。
分步视频:/11XOLtzAE
1、左右移动接口
将之前 block 中控制方块移动的代码去掉,定义一些边界值以及控制方块左右移动时需要修改的变量,比如左边界判定,右边界判定,方块左移和方块右移。
2、左右移动按键响应
然后在blockGroup 中实现左右移动。如果方块组中有任意一个方块在左边界,则无法左移,否则可以,直接执行;如果方块组中有任意一个方块在右边界,则无法右移,否则可以。
3、按键调用
在 blockGroup 的 update 函数中,调用按键相应接口,像这样:
分步视频:/11ypi1oje
1、增加时间函数
新建一个 文件,写一个基础获取时间的函数,获取毫秒级别的时间像这样:
2、增加时间检测函数
然后实现一个检测上次按下时间的函数,这样的话,会更加的流畅:
3、调用事件检测函数
在按键按下的同时,调用这个函数:
分步视频:/114uD07pC
分步视频:/11hkC9Fmm
1、旋转多维列表
由于传给 block 的是实际的下标,相当于在世界坐标系做操作,而旋转最好是局部坐标系,所以 block 应该记录局部坐标。我们把 BLOCK_SHAPE 进行改造
第一维代表形状,第二维代表各种旋转的情况,第三维代表局部坐标
方形旋转90度还是它本身、长条旋转90度变成这样、z字型旋转交换后变成这样、而飞机旋转四次是四种形状,自己画个图就明白了。
2、改造 block 初始化
通过 形状、旋转 以及相对下标就可以确定每个方块的绝对下标,左右移动,下落都应该是操作 相对下标。
3、修改方块的坐标获取
4、处理左移和右移
5、处理下落
6、修改生成配置的函数
7、实现旋转函数
分步视频:/11GXvlJYx
1、记录闪烁状态和次数
消除的时候,需要让方块进行闪烁,所以给每个 block 增加一个闪烁状态,记录闪烁的次数。
2、实现闪烁接口
实现一个开始闪烁的接口,并且在 update 的时候更新闪烁次数。
3、执行更新函数
在 blockGroup 中遍历所有的方块,执行 update 函数。
4、执行渲染函数
并且在 block 的渲染函数中,判断如果是闪烁状态,并且闪烁次数为奇数,则不进行绘制,这样就能看到 bilibili 的效果啦。
5、实现消除的逻辑
然后实现一个执行消除的逻辑,传参是第 row 行,将第 row 行的所有方块,映射到哈希表中,如果发现某个方块的下标在哈希表中,则执行闪烁效果。
分步视频:/11SbjBs4y
分步视频:/11W2NnE0x
分步视频:/11X8za27U
分步视频:/11mPFbLEh
分步视频:/11UW7VWpz
英雄算法联盟免费体验券,免费扫码,可查看分步视频:
关键词:
版权与免责声明:
1 本网注明“来源:×××”(非商业周刊网)的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,本网不承担此类稿件侵权行为的连带责任。
2 在本网的新闻页面或BBS上进行跟帖或发表言论者,文责自负。
3 相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担。
4 如涉及作品内容、版权等其它问题,请在30日内同本网联系。