31步学会写《俄罗斯方块》

来源: 哔哩哔哩2023-08-25 19:34:32
  

前言

本期视频点赞目标达成,已经把分步拆解的文字版本和视频版本发到知识星球(英雄算法联盟)里,但是有同学反馈免费体验券无法查看(其实是需要下载app),如果不想下载app,可以跟着这篇文章进行学习,如果执意要在星球里学习,可以尝试下扫下文末的免费体验券,注意无需付费!!!由于B站文章的代码格式不支持,所以代码的部分采用图片的方式,这样也可以避免大家复制粘贴,逼着大家自己写,何尝不是一种倒逼。

B站不能上传文件,所以源码可以在公众号:夜深人静写算法,回复 tetris 直接获取。


(相关资料图)

第01步、安装编码环境

1、下载Python

百度输入 "Python3下载",右键打开官网,找到一个相对较新的版本,点击下载,看到 recommended 字样,不由自主的选择了这个,右键打开,等它下载完。

2、安装Python

双击安装,不要点取消,安装完成。

3、下载安装VSCode

百度输入 "vscode",点击官网,点击下载,点击 windows,就下载好了,直接双击,咦怎么没有找到?嘶……哦哦哦哦哦,点击保留,点击打开文件,点击我愿意,下一步,下一步,创建桌面快捷方式,下一步,安装,完成。

4、第一个Python程序

新建一个文件,选择Python类型,随便写一段代码,按 F5 运行,调出来的框选择确认,安装Python解释器,选它,第一个Python程序就出来了。

分步视频:/117C1FekV

第02步、安装游戏环境

找到Python的安装目录,右键打开命令行,把 pip3 拖进来,紧接着输入 "install pygame",看到绚丽的进度条,我的内心泛起了涟漪,至此我们的游戏环境就搭好了。

分步视频:/11GDpn3TK

第03步、运行例子

按住 shift,右键窗口空白处,打开 Power Shell 控制台,把 Python 的可执行文件拖进来,输入:,按下回车:

分步视频:/11oPrEMgU

第04步、新建文件夹

接下来我们自己来做一个游戏。右键新建文件夹,输入pic用来放图片。再新建一个文件夹,输入code用来放代码,把老婆给我们准备好的图片,Ctrl+C, Ctrl+V。

没有老婆的话可以找女朋友要。在 code 目录中新建一个文件,选择Python,Ctrl + S,命名 代表游戏主文件。

分步视频:/11VH2swXp

第05步、初始化pygame

分步视频:/11AnfcLzZ

第06步、主循环

分步视频:/110jZesoz

第07步、创建画面

分步视频:/11rsA6ReC

第08步、显示图片

分步视频:/11CylfiAR

第09步、让图片动起来

分步视频:/11IFaReOB

第10步、去掉残影

分步视频:/11sRZuvBa

第11步、控制移动

分步视频:/1104ZVHvx

第12步、增加上下方向

分步视频:/111e7uCEM

第13步、实现方块类

现在只有一个方块,想要有多个方块,最好的方法就是把方块设计成一个类,利用面向对象的思想,接下来我们实现一个方块类 Block,处理好图片和它的位置,以及玩家控制的代码,再封装一个渲染的函数,像这样:

生成一个类的实例,删掉刚才的测试代码,调用更新和渲染的函数。

分步视频:/11HVnWQJn

第14步、多实例

1、定义方块类型

既然已经封装成了类,自然就可以多个实例运行,定义 blockType,红橙黄绿青蓝紫,像这样:

2、定义方块资源路径

每种类型的资源位置写下来,一气呵成,没有技巧,全是感情,唯手熟尔,你也可以:

3、方块初始化参数

对 Block 加入初始化参数,方块类型和位置,把原有的常量,替换成变量:

4、实例化方块

生成两个方块的实例(也就是对象的意思),像这样:

5、调用更新和渲染函数

调用方块的 update 和 draw 函数。

分步视频:/11DrHRwC2

第15步、拆分文件

分步视频:/114prI5hu

第16步、逻辑和表现分离

重新实现block的初始化函数,可以根据类型、行坐标、列坐标、宽高,以及相对位置来实现多态,根据传参来确定采用哪张图片、实际的尺寸、以及确定位置。把之前的初始化函数删掉。

分步视频:/11hSGSoaw

第17步、组合方块

1、增加方块配置

在 const 文件中,增加四种形状的配置,放在 BLOCK_SHAPE 中,用局部坐标来表示,有方形、长条形、z字型、飞机型,像这样:

2、随机生成方块组

然后新建一个文件 ,实现通过配置实例化方块组的接口,一个blockGroup代表一个方块组:

3、实例化方块组

将方块组存储在 blocks 列表中,实现渲染函数,遍历blocks进行渲染。

分步视频:/11oUTfLOS

第18步、模拟下落

分步视频:/11qZF4tvO

第19步、框架代码

分步视频:/11HjoTcnd

第20步、确定游戏主逻辑

抽象来说,俄罗斯方块这个游戏就是:一个静态的 BlockGroup 和 一个下落的 BlockGroup完成碰撞的过程,下落的 BlockGroup 在和静态的 BlockGroup 产生碰撞以后,就会被合并到静态的 BlockGroup 去,而静态的 BlockGroup 从下往上判断。是否有一整行填充的方块,播放一个消去的动画,直到找不到整行的为止,则继续生成下落的方块的过程。

当静态的 blockGroup 到达一定高度,则游戏失败。

分步视频:/1106GAXIK

第21步、BlockGroup 的多态

1、增加 BlockGroup 类型

在 文件中添加两种类型,一种是静态的,一种是下落的:

2、定义方块宽高

方块的宽高定义成常量,都是32像这样。

3、初始化 BlockGroup

给每个方块组加上类型,像这样:

4、下落调整

如果类型是下落类型,才执行时间判定。

5、游戏逻辑调整

在 game 文件中,将 固定类型方块组 fixedBlockGroup 以及 下落类型方块组 dropBlockGroup 都实例化出来,update 函数就是执行两者的 update,并且如果没有下落类型,则随机生成一个。渲染函数也是类似写就可以了。

分步视频:/11uqzAUGW

第22步、模拟碰撞

1、碰撞的概念

在这个场景下,碰撞的概念其实就是:计算固定的 blockGroup 和 下落的 blockGroup 的交集,如果两个方块集合才产生交集,则认为发生了碰撞。

2、block 坐标封装

对每个 block 实现 获取当前坐标 和 获取下落后的坐标 的函数,像这样:

3、blockGroup 坐标封装

在 blockGroup 中用列表进行一次封装,像这样:

4、blockGroup 增删改接口

再实现一些增删改的函数,以便不时之需:

5、碰撞检测

在 文件中,实现碰撞检测,首先将固定的  blockGroup 中所有的方块映射到 哈希表中,然后取下落的 blockGroup 中所有方块,下落后的位置,去哈希表中进行查询,一旦找到,这个函数返回 True;否则如果超过游戏给定的行数,也返回 True,都代表产生了碰撞。

分步视频:/11XOLtzAE

第23步、控制左右移动

1、左右移动接口

将之前 block 中控制方块移动的代码去掉,定义一些边界值以及控制方块左右移动时需要修改的变量,比如左边界判定,右边界判定,方块左移和方块右移。

2、左右移动按键响应

然后在blockGroup 中实现左右移动。如果方块组中有任意一个方块在左边界,则无法左移,否则可以,直接执行;如果方块组中有任意一个方块在右边界,则无法右移,否则可以。

3、按键调用

在 blockGroup 的 update 函数中,调用按键相应接口,像这样:

分步视频:/11ypi1oje

第24步、控制左右移动速度

1、增加时间函数

新建一个 文件,写一个基础获取时间的函数,获取毫秒级别的时间像这样:

2、增加时间检测函数

然后实现一个检测上次按下时间的函数,这样的话,会更加的流畅:

3、调用事件检测函数

在按键按下的同时,调用这个函数:

分步视频:/114uD07pC

第25步、控制下落速度

分步视频:/11hkC9Fmm

第26步、方块旋转

1、旋转多维列表

由于传给 block 的是实际的下标,相当于在世界坐标系做操作,而旋转最好是局部坐标系,所以 block 应该记录局部坐标。我们把 BLOCK_SHAPE 进行改造

第一维代表形状,第二维代表各种旋转的情况,第三维代表局部坐标

方形旋转90度还是它本身、长条旋转90度变成这样、z字型旋转交换后变成这样、而飞机旋转四次是四种形状,自己画个图就明白了。

2、改造 block 初始化

通过 形状、旋转 以及相对下标就可以确定每个方块的绝对下标,左右移动,下落都应该是操作 相对下标。

3、修改方块的坐标获取

4、处理左移和右移

5、处理下落

6、修改生成配置的函数

7、实现旋转函数

分步视频:/11GXvlJYx

第27步、方块消除

1、记录闪烁状态和次数

消除的时候,需要让方块进行闪烁,所以给每个 block 增加一个闪烁状态,记录闪烁的次数。

2、实现闪烁接口

实现一个开始闪烁的接口,并且在 update 的时候更新闪烁次数。

3、执行更新函数

在 blockGroup 中遍历所有的方块,执行 update 函数。

4、执行渲染函数

并且在 block 的渲染函数中,判断如果是闪烁状态,并且闪烁次数为奇数,则不进行绘制,这样就能看到 bilibili 的效果啦。

5、实现消除的逻辑

然后实现一个执行消除的逻辑,传参是第 row 行,将第 row 行的所有方块,映射到哈希表中,如果发现某个方块的下标在哈希表中,则执行闪烁效果。

分步视频:/11SbjBs4y

第28步、结束消除

分步视频:/11W2NnE0x

第29步、失败判定

分步视频:/11X8za27U

第30步、计分规则

分步视频:/11mPFbLEh

第31步、下个方块

分步视频:/11UW7VWpz

英雄算法联盟免费体验券,免费扫码,可查看分步视频:

关键词:

责任编辑:sdnew003

相关新闻

版权与免责声明:

1 本网注明“来源:×××”(非商业周刊网)的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,本网不承担此类稿件侵权行为的连带责任。

2 在本网的新闻页面或BBS上进行跟帖或发表言论者,文责自负。

3 相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担。

4 如涉及作品内容、版权等其它问题,请在30日内同本网联系。